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.
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
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