xsharp.eu • Zugriff auf SmartCard Reader mit PCSC - Page 4
Page 4 of 5

Zugriff auf SmartCard Reader mit PCSC

Posted: Thu Apr 28, 2022 5:25 pm
by Karl-Heinz
Hallo Franz,

In der "Version History" gibt es zu dem Thema das hier:

Code: Select all

Changes in 2.1.1.0 (Bandol GA 2.11)

Compiler

·We have added new syntaxes for OUT parameters. You can now use one of the following syntaxes
 
   LOCAL cString as STRING
   cString := "12345"
   IF Int32.TryParse(cString, OUT VAR result)      
 // this declares the out variable inline, the type is derived from the method call
      ? "Parsing succeeded, result is ", result
   ENDIF

   IF Int32.TryParse(cString, OUT result2 AS Int32)   
 // this declares the out variable inline, the type is specified by us
      ? "Parsing succeeded, result is ", result2
   ENDIF

   IF Int32.TryParse(cString, OUT NULL)      
 // this tells the compiler to generate an out variable, we are not interested in the result
      ? "Parsing succeeded"
   ENDIF

   IF Int32.TryParse(cString, OUT VAR _)      
 // this tells the compiler to generate an out variable, we are not interested in the result. 
        // The name "_" has a special meaning "ignore this"
      ? "Parsing succeeded"
   ENDIF 
Gruß
Karl-Heinz

Zugriff auf SmartCard Reader mit PCSC

Posted: Fri Apr 29, 2022 9:44 am
by lagraf
Super, danke Karl-Heinz, mit der Version und Syntax funktionierts!
LG Franz

Zugriff auf SmartCard Reader mit PCSC

Posted: Mon May 02, 2022 6:48 am
by lagraf
Ich bin grad bei der letzten Klasse aus meiner DLL und bekomme von ILSpy einen C# Code geliefert, den mein csc.exe nicht compiliert und den ich deshalb auch nicht nach X# übersetzen kann:

Code: Select all

using System.Security.Cryptography;
private readonly SymmetricAlgorithm _symmetricAlgorithm;
public int InputBlockSize => _symmetricAlgorithm.BlockSize / 8;   // error CS1002 und CS1519

error CS1002: ; expected
error CS1519: Invalid token '/' in class, struct, or interface member declaration
Was macht die Syntax mit dem => und gibt es dafür noch eine andere Art und Weise wie man die Zeile formulieren kann?

Kann es sein dass die alternative Syntax wie folgt lautet:

Code: Select all

public int InputBlockSize
{
	get
	{
		return _symmetricAlgorithm.BlockSize / 8;
	}
}
Damit compiliert der csc.exe zumindest ohne Fehler.

Zugriff auf SmartCard Reader mit PCSC

Posted: Mon May 02, 2022 7:56 am
by wriedmann
Hallo Franz,
wie das in C# ausschaut, kann ich Dir mangels C#-Kenntnis nicht sagen.
Ich nehme aber mal an, hier handelt es sich um einen anonyme Methode.
In X# schreibt man die so (wenn es eine Variable wäre):

Code: Select all

InputBlockSize => { _symmetricAlgorithm.BlockSize / 8 }
Da es sich aber hier um eine Property handelt, kannst Du die in X# standardmäßig in einer Zeile schreiben:

Code: Select all

public property InputBlockSize as int get _symmetricAlgorithm.BlockSize / 8
Grade wenn es um Properties geht, hat X# eine extrem effiziente und kurze Syntax.
Wolfgang

Zugriff auf SmartCard Reader mit PCSC

Posted: Mon May 02, 2022 9:51 am
by lagraf
Bezüglich des namespace übergreifenden enum habe ich inzwischen auch die Lösung gefunden: enum gehört ausserhalb der Klasse direkt unter dem namespace definiert!

Code: Select all

namespace RKSVComComplete
{
	using System;
	using RKSV.Light.APDU;

	public class Program
	{
		static void Main()
		{
			APDUMaster m_APDU = new APDUMaster();
			RKSV.Light.APDU.CardOSVersion cardType = m_APDU.GetCardType();
//			var cardType = m_APDU.GetCardType();
			Console.WriteLine(cardType);
		}
	}	// class
}	// namespace

namespace RKSV.Light.APDU
{
	public enum CardOSVersion
	{
		Unknown,
		GT_OS_5_3,
		AT_OS_5_3
	}
	public class APDUMaster
	{
		public CardOSVersion GetCardType()
		{
			return CardOSVersion.AT_OS_5_3;
		}

	}	//class
}	// namespace

Zugriff auf SmartCard Reader mit PCSC

Posted: Mon May 02, 2022 5:48 pm
by Meinhard
Franz,

> public int InputBlockSize => _symmetricAlgorithm.BlockSize / 8; // error CS1002 und CS1519

Das ist die Definition eines Properties in einer Syntax, die erst in den neueren Versionen des C# Compilers zur Verfügung steht. Dein IL Spy liefert wahrscheinlich schon diese Syntax während Dein Visual Studio noch auf einer älteren Version reitet. Wie Wolfgang schon angemerkt hat, entspricht dies der Definition

public property InputBlockSize as int get _symmetricAlgorithm.BlockSize / 8

in X#.
Diese Syntax ist i.Ü. mit der C# Version 6 (.NET 4.6) eingeführt worden und läuft unter der Bezeichnung "Expression Bodied Methods". Einen ganz guten Überblick über neue Sprachfeatures in C# bekommts u.A. hier: https://www.tutorialsteacher.com/csharp ... on-history

Regards
Meinhard

Zugriff auf SmartCard Reader mit PCSC

Posted: Tue May 03, 2022 4:01 am
by lagraf
Hallo Meinhard,
das Komische auf meinem Win7 32bit PC ist, dass ich NET 4.8 installiert habe laut "Programme und Funktionen", samt SDK und Targeting Pack. Auch der manuelle Aufruf von csc.exe zeigt die Version 4.8.3761.0 und die ist in der XIDE auch eingetragen. Installiert ist das aber in einem Ordner c.windowsmicrosoft.netframeworkv4.0.30319.

Das paßt irgendwie nicht zusammen und laut deinem Posting müßte ja seit NET 4.6 schon csc.exe V6 drauf sein und das Statement compiliert werden.

Zugriff auf SmartCard Reader mit PCSC

Posted: Tue May 03, 2022 4:29 am
by wriedmann
Hallo Franz,
ich denke nicht, dass mit dem .NET Framework SDK auch immer der aktuellste C# Compiler installiert wird.
Da musst Du schon Visual Studio installieren - und ich denke, das wird an Windows 7 mit 32 Bit scheitern.
(dass es grob fahrlässig ist, Windows 7 noch mit dem Internet verbunden zu verwenden, brauche ich nicht zu wiederholen).
Wolfgang

Zugriff auf SmartCard Reader mit PCSC

Posted: Tue May 03, 2022 7:05 am
by lagraf
Hallo Wolfgang,
da ich ja kommerziell nicht mehr tätig bin, habe ich keine Lust noch auf W10 oder W11 umzustellen. Für diese eine DLL zahlt sich der Umstellungswaufwand auch nicht aus. Der PC ist auch ausreichend abgesichert, solange AV und FW drauf laufen, sehe ich da keine Probleme.

Ich habe inzwischen meine DLL in C# schon fertig und in C# läuft sie auch korrekt. Bei der Portierung auf X# gibt es aber ein Problem bei der Funktion EncryptAES256_CTR, das ich seit gestern suche und nicht finde:

Code: Select all

FUNCTION EncryptAES256_CTR(decrypted AS BYTE[] , encrypted OUT BYTE[] , key AS BYTE[] , kassenid AS STRING , renummer AS STRING) AS LOGIC
	LOCAL iV AS BYTE[]
	LOCAL aes256CounterMode AS Aes256CounterMode
	LOCAL memoryStream AS MemoryStream
	LOCAL cryptoStream AS CryptoStream
	//
	TRY
		iV := GetIV(kassenid, renummer)
		? "iV.Length", iV.Length
		aes256CounterMode := Aes256CounterMode{iV}
		memoryStream := MemoryStream{}
		cryptoStream := CryptoStream{memoryStream, aes256CounterMode:CreateEncryptor(key, NULL), CryptoStreamMode.Write}
		cryptoStream:Write(decrypted, 0, decrypted:Length)
		? "decrypted.Length", decrypted.Length	// 8
		? "key.Length", key.Length	// 32
		? ""
		// Bis hierher OK, dann löst Close die Exception aus
		cryptoStream:Close()
		encrypted := memoryStream:ToArray()
		aes256CounterMode:Dispose()
		RETURN TRUE

	CATCH ex AS Exception
		encrypted := NULL
		Console.WriteLine(ex:Message, 1)
		RETURN FALSE
	END TRY
ex:Message enthält die Meldung "Index was outside the bounds of the array."
Ich habe den Sourcecode der DLL auf eine Minimal App reduziert und sie in beiden Versionen C# und X# beigelegt.
Vielleicht hat jemand eine Idee, wo der Unterschied zwischen C# und X# in diesem Fall liegt.
Application1.zip
(2.88 KiB) Downloaded 73 times
CSharpApplication1.zip
(2.7 KiB) Downloaded 61 times

Zugriff auf SmartCard Reader mit PCSC

Posted: Tue May 03, 2022 7:15 am
by wriedmann
Hallo Franz,
das, was ich bzgl. Windows 7 meine, betrifft ausdrücklich auch Privatpersonen, denn auch privat sollte man keinen PC mehr mit Windows 7 betreiben. Ganz abgesehen davon ist auch die Verfügbarkeit von Antivirus-Programmen für Windows 7 immer eingeschränkter, und irgendwann wird es keinen mehr geben.

Was den Unterschied zwischen X# und C# betrifft: in Deinem Code gibt es ein Array

Code: Select all

LOCAL iV AS BYTE[]
und dazu noch welche als Parameter.
C# hat 0-basierte Indexe für Arrays, X# genau wie VO 1-basierte.
Möglicherweise musst Du diese Zeile

Code: Select all

cryptoStream:Write(decrypted, 0, decrypted:Length)
so schreiben

Code: Select all

cryptoStream:Write(decrypted, 1, decrypted:Length)
Das sollte aber nur gelten, wenn die CryptoStream-Klasse in X# geschrieben ist.
Wolfgang