Welcome, Guest
Username: Password: Remember me
Hier wird Deutsch gesprochen

TOPIC:

Zugriff auf SmartCard Reader mit PCSC 23 Apr 2022 09:28 #22278

  • wriedmann
  • wriedmann's Avatar


  • Posts: 3195
  • Hallo Franz,
    also bei mir schaut das in der XIDE korrekt aus:


    Der C#-Compiler ist nicht Teil des Betriebssystem, da musst Du schauen, wo Du ein entsprechendes Exe hast - es kann sein, dass die XIDE auf eine veraltete Version zurückgreift, war bei mir so. Kannst Du auf jeden Fall unter Tools - Preferences - Compiler einstellen.

    Was die Strichpunkte betrifft: das ganze Linq-Statement gehört in eine Zeile.
    Wenn Du das in X# auf mehrere Zeilen aufteilen willst, brauchst Du die Strichpunkte. Das war auch unter VO und Clipper so.
    C# dagegen will jede Zeile mit Strichpunkt abgeschlossen haben - ein fehlender Strichpunkt heißt in diesem Fall dass die Zeile weitergeht.

    Wolfgang

    P.S. Grad festgestellt: mein Post Nr. 3.000 in diesem Forum
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it
    Attachments:

    Please Log in or Create an account to join the conversation.

    Zugriff auf SmartCard Reader mit PCSC 23 Apr 2022 10:38 #22279

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • Hallo Wolfgang,
    bei der Fehlermeldung hab ich dann nicht weit genug gelesen, muss wohl weiter nach rechts scrollen!
    Die X# Variante wird bei mir auch korrekt in der XIDE dargestellt, die C# Variante nicht.
    Compiler Version für C# ist bei mir v4.0.30319.
    An Strichpunkte ja/nein zwischen C# und X# muß ich mich noch gewöhnen, dass die genau anders rum sind.
    Aber wie gesagt: die ersten Methoden für die SmartCard laufen inzwischen, hoffentlich gehts so weiter, dann kriege ich vielleicht doch noch eine abgespeckte Version meiner Sorgenkind DLL hin.
    Danke für deine Hilfe!

    Please Log in or Create an account to join the conversation.

    Zugriff auf SmartCard Reader mit PCSC 23 Apr 2022 11:41 #22280

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3195
  • Hallo Franz,
    wenn Du Deine Festplatte mal nach csc.exe durchsuchst, solltest Du mehrere finden....
    Das ist mein Suchergebnis:

    Vermutlich ist der erste Eintrag der aktuellste.
    Was das COM-Modul betrifft: ich bin da noch beim Suchen, und hoffe, heute noch eine Lösung zu finden.
    Wolfgang
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it
    Attachments:

    Please Log in or Create an account to join the conversation.

    Zugriff auf SmartCard Reader mit PCSC 23 Apr 2022 19:09 #22282

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • Hallo Wolfgang,
    die neueste Version der zahlreich am PC befindlichen habe ich in XIDE drinnen (4.8....), aber wahrscheinlich gibts unter neueren OS noch höhere Versionen. Ein paar neuere Statements gehen halt nicht, aber es gab dafür immer einen älteren Ersatz.

    Ich habe allerdings ein anderes Probelm, das ich in einer kurzen Testapp demonstriere:
    namespace RKSVComComplete
    {
    	using System;
    	using RKSV.Light.APDU;	
    	public class Program
    	{
    		static void Main()
    		{
    			private APDUMaster m_APDU = new APDUMaster();
    			private CardOSVersion cardType = m_APDU.GetCardType(readerName);
    			Console.WriteLine(cardType);
    		}
    	}	// class
    }	// namespace
    
    namespace RKSV.Light.APDU
    {
    	public class APDUMaster
    	{
    		public CardOSVersion GetCardType()
    		{
    			return CardOSVersion.AT_OS_5_3;
    		}
    		public enum CardOSVersion
    		{
    			Unknown,
    			GT_OS_5_3,
    			AT_OS_5_3
    		}
    	}	//class
    }	// namespace
    Ich bekomme folgende Fehler und finde den Grund nicht, die {} und Console.WriteLine() sind imho korrekt:
    error CS1513: } expected	8,4	Program.cs	RKSVComComplete.Program:Main
    error CS1519: Invalid token '(' in class, struct, or interface member declaration 11,21 Program.cs RKSVComComplete.Program:Main
    error CS1519: Invalid token ')' in class, struct, or interface member declaration 11,30 Program.cs RKSVComComplete.Program:Main
    error CS1022: Type or namespace definition, or end-of-file expected 14,1 Program.cs RKSVComComplete.Program:Main

    Please Log in or Create an account to join the conversation.

    Last edit: by lagraf.

    Zugriff auf SmartCard Reader mit PCSC 23 Apr 2022 19:18 #22283

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3195
  • Hallo Franz,
    irgendwas stimmt in der Zeile 8, Spalte 4 von Deinem Programm nicht - das ist aber ein syntaktisches Problem.
    Um das zu kontrollieren, braucht es die korrekte C#-Datei und nicht nur einen eingefügten Teil.
    Wolfgang
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    Zugriff auf SmartCard Reader mit PCSC 24 Apr 2022 08:33 #22285

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • Ich find an dieser Stelle nur ein Tab Zeichen.
    Anbei der Export und der App Ordner.

    File Attachment:

    File Name: CSharpApp4Ordner.zip
    File Size:3 KB

    File Attachment:

    File Name: CSharpApp4Export.zip
    File Size:1 KB
    Attachments:

    Please Log in or Create an account to join the conversation.

    Zugriff auf SmartCard Reader mit PCSC 24 Apr 2022 08:52 #22286

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3195
  • Hallo Franz,
    sorry, bin in C# alles andere als sattelfest - kann es lesen, aber nicht schreiben.
    "private" definiert eine Instanzvariable einer Klasse und kann nicht innerhalb einer Methode verwendet werden.
    So kompiliert das:
    namespace RKSVComComplete
    {
    	using System;
    	using RKSV.Light.APDU;
    
    	public class Program
    	{
    		private APDUMaster m_APDU = new APDUMaster();
    		private CardOSVersion cardType = m_APDU.GetCardType(readerName);
    		static void Main()
    		{
    			Console.WriteLine(cardType);
    		}
    	}	// class
    }	// namespace
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    Zugriff auf SmartCard Reader mit PCSC 24 Apr 2022 09:00 #22287

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3195
  • Hallo Franz,
    mangels DLL kompiliert das bei mir nicht.
    Es gibt einen weiteren Fehler:
    static void Main()
    ist eine statische Methode und hat demzufolge keinen Zugriff auf Instanzvariablen der Klasse.
    Dein Code ist also so zu schreiben:
    namespace RKSVComComplete
    {
    	using System;
    	using RKSV.Light.APDU;
    
    	public class Program
    	{
    		static void Main()
    		{
    			APDUMaster m_APDU = new APDUMaster();
    			CardOSVersion cardType = m_APDU.GetCardType(readerName);
    			Console.WriteLine(cardType);
    		}
    	}	// class
    }	// namespace
    also die Variablen-Deklaration in der Main()-Methode, aber ohne "private"-Zusatz.
    Wolfgang
    P.S. sorry, für C# bin ich der Falsche.... aber über Google solltest Du das selber auch rauskriegen.
    Wenn Code nicht kompiliert, dann so lange Zeilen auskommentieren, bis es kompiliert. Und dann bei Google nachfragen, was falsch sein könnte.
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    Zugriff auf SmartCard Reader mit PCSC 24 Apr 2022 09:34 #22290

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • Hallo Wolfgang,
    ich hab schon stundenlang bei Google gesucht, wie der Klasse Program beizubringen ist, dass CardOSVersion keine DLL ist, sondern im nachfolgenden Namespace RKSV.Light.APDU in der public enum CardOSVersion definiert ist. Aber das ist schwierig, wenn ich nicht mal weiß unter welchem Begriff hierfür zu suchen ist.
    namespace RKSVComComplete
    {
    	using System;
    	using RKSV.Light.APDU;	
    	public class Program
    	{
    		static void Main()
    		{
    			APDUMaster m_APDU = new APDUMaster();
    			CardOSVersion cardType = m_APDU.GetCardType(readerName);
    			Console.WriteLine(cardType);
    		}
    	}	// class
    }	// namespace
    
    namespace RKSV.Light.APDU
    {
    	public class APDUMaster
    	{
    		public CardOSVersion GetCardType()
    		{
    			return CardOSVersion.AT_OS_5_3;
    		}
    		public enum CardOSVersion
    		{
    			Unknown,
    			GT_OS_5_3,
    			AT_OS_5_3
    		}
    	}	//class
    }	// namespace
    Dabei erhalte ich den Fehler:
    error CS0246: The type or namespace name 'CardOSVersion' could not be found (are you missing a using directive or an assembly reference?) für die Zeile "CardOSVersion cardType = m_APDU.GetCardType(readerName);"

    Er findet also den Typ CardOSVersion nicht, der in einem anderen Namespace durch "public enum CardOSVersion" definiert wird.

    Wenn ich aber den Typ "public enum CarOSVersion" auch in der Klasse Program definiere, dann bekomme ich den Fehler:
    error CS0266: Cannot implicitly convert type 'RKSV.Light.APDU.APDUMaster.CardOSVersion' to 'RKSVComComplete.Program.CardOSVersion'. An explicit conversion exists (are you missing a cast?) weil es ja 2 unterschiedliche Typen sind.

    Please Log in or Create an account to join the conversation.

    Last edit: by lagraf.

    Zugriff auf SmartCard Reader mit PCSC 28 Apr 2022 10:15 #22315

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • Wenn ich folgenden C# code habe:
    ExecuteCommand( out var _ );
    übersetzt das X# Plugin in ILSpy dies wie folgt:
    self:ExecuteCommand( out _ )
    In C# steht _ für eine Variable, die nicht benötigt wird. Der X# Compiler kennt dies aber nicht, daher ersetze ich diese durch einen echten Namen:
    self:ExecuteCommand( out response )
    error XS0103: The name 'response' does not exist in the current context
    Also die Variable vordefinieren:
    LOCAL response as BYTE[]
    self:ExecuteCommand( out response )
    warning XS0219: The variable 'response' is assigned but its value is never used
    Nun läuft die App zwar, aber ich habe jede Menge Warnings XS0219.
    Wie kann ich die Warnings am Besten wegbekommen?

    Please Log in or Create an account to join the conversation.

    Zugriff auf SmartCard Reader mit PCSC 28 Apr 2022 19:25 #22317

    • Karl-Heinz
    • Karl-Heinz's Avatar


  • Posts: 773
  • Hallo Franz,

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

    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

    Please Log in or Create an account to join the conversation.

    Zugriff auf SmartCard Reader mit PCSC 29 Apr 2022 11:44 #22323

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • Super, danke Karl-Heinz, mit der Version und Syntax funktionierts!
    LG Franz

    Please Log in or Create an account to join the conversation.

    Last edit: by lagraf.

    Zugriff auf SmartCard Reader mit PCSC 02 May 2022 08:48 #22343

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • 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:
    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:
    public int InputBlockSize
    {
    	get
    	{
    		return _symmetricAlgorithm.BlockSize / 8;
    	}
    }
    Damit compiliert der csc.exe zumindest ohne Fehler.

    Please Log in or Create an account to join the conversation.

    Last edit: by lagraf.

    Zugriff auf SmartCard Reader mit PCSC 02 May 2022 09:56 #22344

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3195
  • 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):
    InputBlockSize => { _symmetricAlgorithm.BlockSize / 8 }
    Da es sich aber hier um eine Property handelt, kannst Du die in X# standardmäßig in einer Zeile schreiben:
    public property InputBlockSize as int get _symmetricAlgorithm.BlockSize / 8
    Grade wenn es um Properties geht, hat X# eine extrem effiziente und kurze Syntax.
    Wolfgang
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    Last edit: by wriedmann.

    Zugriff auf SmartCard Reader mit PCSC 02 May 2022 11:51 #22347

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • 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!
    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

    Please Log in or Create an account to join the conversation.

    Zugriff auf SmartCard Reader mit PCSC 02 May 2022 19:48 #22353

    • Meinhard
    • Meinhard's Avatar


  • Posts: 73
  • 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: www.tutorialsteacher.com/csharp/csharp-version-history

    Regards
    Meinhard

    Please Log in or Create an account to join the conversation.

    Zugriff auf SmartCard Reader mit PCSC 03 May 2022 06:01 #22357

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • 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.\windows\microsoft.net\framework\v4.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.

    Please Log in or Create an account to join the conversation.

    Zugriff auf SmartCard Reader mit PCSC 03 May 2022 06:29 #22358

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3195
  • 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
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    Zugriff auf SmartCard Reader mit PCSC 03 May 2022 09:05 #22359

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • 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:
    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.

    File Attachment:

    File Name: Application1.zip
    File Size:3 KB

    File Attachment:

    File Name: CSharpAppl...ion1.zip
    File Size:3 KB
    Attachments:

    Please Log in or Create an account to join the conversation.

    Zugriff auf SmartCard Reader mit PCSC 03 May 2022 09:15 #22360

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3195
  • 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
    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
    cryptoStream:Write(decrypted, 0, decrypted:Length)
    so schreiben
    cryptoStream:Write(decrypted, 1, decrypted:Length)
    Das sollte aber nur gelten, wenn die CryptoStream-Klasse in X# geschrieben ist.
    Wolfgang
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    Moderators: wriedmann