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
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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
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?
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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
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{}
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
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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
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?
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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it