xsharp.eu • RKSV Lib
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

Code: Select all

Library OLE not found
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