Zugriff auf SmartCard Reader mit PCSC

Deutschsprachiges X#-Forum – German language forum

Moderator: wriedmann

User avatar
wriedmann
Posts: 3757
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Zugriff auf SmartCard Reader mit PCSC

Post by wriedmann »

Hallo Franz,
also bei mir schaut das in der XIDE korrekt aus:
tobytexide.png
tobytexide.png (5.1 KiB) Viewed 554 times
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
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
lagraf
Posts: 450
Joined: Thu Jan 18, 2018 9:03 am
Location: A

Zugriff auf SmartCard Reader mit PCSC

Post by lagraf »

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!
User avatar
wriedmann
Posts: 3757
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Zugriff auf SmartCard Reader mit PCSC

Post by wriedmann »

Hallo Franz,
wenn Du Deine Festplatte mal nach csc.exe durchsuchst, solltest Du mehrere finden....
Das ist mein Suchergebnis:
csc_exe.png
csc_exe.png (122.12 KiB) Viewed 554 times
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
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
lagraf
Posts: 450
Joined: Thu Jan 18, 2018 9:03 am
Location: A

Zugriff auf SmartCard Reader mit PCSC

Post by lagraf »

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:

Code: Select all

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:

Code: Select all

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
User avatar
wriedmann
Posts: 3757
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Zugriff auf SmartCard Reader mit PCSC

Post by wriedmann »

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
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
lagraf
Posts: 450
Joined: Thu Jan 18, 2018 9:03 am
Location: A

Zugriff auf SmartCard Reader mit PCSC

Post by lagraf »

Ich find an dieser Stelle nur ein Tab Zeichen.
Anbei der Export und der App Ordner.
CSharpApp4Ordner.zip
(2.88 KiB) Downloaded 82 times
CSharpApp4Export.zip
(1.17 KiB) Downloaded 85 times
User avatar
wriedmann
Posts: 3757
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Zugriff auf SmartCard Reader mit PCSC

Post by wriedmann »

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:

Code: Select all

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
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
wriedmann
Posts: 3757
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Zugriff auf SmartCard Reader mit PCSC

Post by wriedmann »

Hallo Franz,
mangels DLL kompiliert das bei mir nicht.
Es gibt einen weiteren Fehler:

Code: Select all

static void Main()
ist eine statische Methode und hat demzufolge keinen Zugriff auf Instanzvariablen der Klasse.
Dein Code ist also so zu schreiben:

Code: Select all

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
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
lagraf
Posts: 450
Joined: Thu Jan 18, 2018 9:03 am
Location: A

Zugriff auf SmartCard Reader mit PCSC

Post by lagraf »

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.

Code: Select all

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.
lagraf
Posts: 450
Joined: Thu Jan 18, 2018 9:03 am
Location: A

Zugriff auf SmartCard Reader mit PCSC

Post by lagraf »

Wenn ich folgenden C# code habe:

Code: Select all

ExecuteCommand( out var _ );
übersetzt das X# Plugin in ILSpy dies wie folgt:

Code: Select all

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:

Code: Select all

self:ExecuteCommand( out response )
error XS0103: The name 'response' does not exist in the current context
Also die Variable vordefinieren:

Code: Select all

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?
Post Reply