Page 1 of 7
RKSV Lib
Posted: Fri Jan 17, 2020 6:46 am
by lagraf
In all meinen Kassenprogrammen verwende ich für die österr. Registrierkassensicherheitsverordnung (RKSV) eine C# Dll zum Erstellen des QR-Codes und zur Signierung mittels Smartcard. Dafür habe ich eine VO Wrapper Lib, welche die OLE Lib benötigt. Beim Import nach X# erhalte ich die Meldung
Was bedeutet das für meinen Wrapper? Wie bekomme ich ihn zum Laufen?
LG Franz
RKSV Lib
Posted: Fri Jan 17, 2020 6:52 am
by wriedmann
Hallo Franz,
die VO-Wrapper-Lib kannst Du komplett vergessen - verwende einfach die C#-Lib direkt!
COM/OLE geht in einer migrierten App nicht.
OCX-Controls muß man in WinForms-Controls einbinden, aber Dein Code wird hier definitiv einfacher.
Unter .NET kannst Du Assemblies aller .NET-Sprachen beliebig mischen.
Wolfgang
RKSV Lib
Posted: Fri Jan 17, 2020 8:48 am
by lagraf
Hallo Wolfgang,
damit ich nicht alle Aufrufe in meinen Kassenprogrammen ändern muss, wäre es sinnvoll, den Wrapper so umzuschreiben, dass er als Zwischenstück funktioniert!
Wie binde ich die C# Dll ein, gibt es da ein Beispiel, welche ich mir ansehen kann?
LG Franz
RKSV Lib
Posted: Fri Jan 17, 2020 9:11 am
by wriedmann
Hallo Franz,
klar kannst Du den Wrapper so umschreiben, dass er dieselbe Schnittstelle hat wie die VO-Version, wäre auch so anzuraten.
Um eine C#-Library einzubinden, kannst Du sie einfach in den References hinzufügen.
Dann musst Du noch den Namespace kennen und die Klassen - oder Du schaust Dir das Ganze mit dem ILSpy an. Wenn Du den noch nicht hast: es gibt ein Plugin dafür, daß Dir dann z.B. C# Code als X# anzeigt (so weit möglich):
https://www.xsharp.eu/itm-downloads?fol ... %252FTools
Wolfgang
RKSV Lib
Posted: Fri Jan 17, 2020 9:53 am
by lagraf
Hallo Wolfgang,
der ILSpy zeigt mir eine ganze Liste an Namespaces: von RKSV.Common.Configuration bis RKSVComComplete.Properties, was davon ist für mich interessant?
In meinem Wrapper rufe ich nur eine Klasse auf: RKSVCOM{}
Code: Select all
// RKSVCom initialisieren
_oRKSVCom := RKSVCOM{}
IF !_oRKSVCom:fInit
_cMsgLast := _RKSV_INIT
_cMsgFirst:= IIF(Empty(_cMsgFirst), _cMsgLast, _cMsgFirst)
_oRKSVCom := NULL_OBJECT
RETURN SELF
ENDIF
Die Methoden dieser Klasse sind mit Parameter und Return Value bekannt, verwende ich ja im Wrapper, z.B:
Code: Select all
METHOD GetReaderAt(nPos AS WORD; // Position des Readers
) AS STRING PASCAL CLASS RKSV
// Ermittelt den Readernamen für Reader Nummer (0-n) und speichert diesen in _cReader
// -> Return: Readername oder NULL_STRING
LOCAL uRet AS USUAL
uRet := _oRKSVCom:GetReaderAt(nPos)
IF ValType(uRet) <> "C" .OR. Empty(uRet)
_cMsgLast := StrTran(_RKSV_GetReaderAt, "%POS%", AsString(nPos))
_cMsgFirst:= IIF(Empty(_cMsgFirst), _cMsgLast, _cMsgFirst)
RETURN NULL_STRING
ENDIF
_cReader := uRet
RETURN uRet
Läßt sich damit was anfangen?
Franz
RKSV Lib
Posted: Fri Jan 17, 2020 10:08 am
by wriedmann
Hallo Franz,
dann würde ich mal in der Assembly nach einer solchen Klasse suchen.
Wolfgang
RKSV Lib
Posted: Fri Jan 17, 2020 10:44 am
by lagraf
Hallo Wolfgang,
Fehler von mir, die C# Klasse heißt RKSVComComplete, RKSVCom war noch von mir!
Code: Select all
METHOD Init(ObjID, fROTCHECK) CLASS RKSVCOM
SELF:cIID := "{987E40A2-2708-3453-B906-A8849E9BDA00}"
SELF:cProgId := "RKSVComComplete"
SELF:cClsId := "{9A79D6C4-A084-4D27-9D0D-AAE7703571B0}"
IF (ObjID=NIL)
ObjId := "RKSVComComplete"
ENDIF
SUPER:Init(ObjID, 0, .T., fRotCheck)
SELF:_dwFuncs := 39
SELF:_dwVars := 0
RETURN SELF
Wenn ich jetzt daraus eine Methode verwenden möchte, z.B. GetReaderAt, wie kann ich die Klasse direkt verwenden und die Methode daraus aufrufen?
RKSV Lib
Posted: Fri Jan 17, 2020 11:07 am
by wriedmann
Hallo Franz,
wenn Du den betreffenden Namespace in einem Using-Statement angibst, kannst Du die Klasse wie eine normale X#/VO Klasse instanzieren und verwenden - das ist kein Unterschied, denn das ist effektiv genau so eine .NET Klasse wie alle anderen Methoden in Deiner migrierten Applikation.
Gegenüber VO und COM wird das Ganze schneller und sicherer (keine Konvertierung der Parameter mehr über COM und genaue Typ-Prüfung).
Wolfgang
RKSV Lib
Posted: Fri Jan 17, 2020 2:10 pm
by lagraf
Hallo Wolfgang,
gibt es eine Möglichkeit in X#, sich die Aufrufe wie unter VO (Tools / Automation Server) generieren zu lassen, oder ist alles Handarbeit?
RKSV Lib
Posted: Fri Jan 17, 2020 2:16 pm
by wriedmann
Hallo Franz,
das brauchst Du nicht - Du kannst die Methoden direkt aufrufen, und der Compiler prüft sogar die Parameter, bzw XIDE/Visual Studio helfen da sogar mit Intellisense.
Den Zwischenschritt gibt/braucht es nicht mehr.
Wolfgang