Gma.QrCodeNet.Encoding.dll

Deutschsprachiges X#-Forum – German language forum

Moderator: wriedmann

lagraf
Posts: 450
Joined: Thu Jan 18, 2018 9:03 am
Location: A

Gma.QrCodeNet.Encoding.dll

Post by lagraf »

Hallo Wolfgang,
ich versuche erstmal die einfachere Variante mit einer Function:
1) X# App RKSVDll als Library/Dll compiliert und die Dll in den VO App Ordner kopiert

Code: Select all

FUNCTION Test() AS LOGIC PASCAL
	System.Console.WriteLine("Hello aus Function")
	RETURN TRUE
2) VO

Code: Select all

_DLL FUNCTION Test() AS LOGIC PASCAL:RksvDll.Test
METHOD DoRksvDll() CLASS StandardShellWindow
	LOCAL lReturn AS LOGIC
	lReturn := Test()
	InfoBox{SELF, "DoRskvDll", "X#Dll returns " + AsString(lReturn)}:Show()
	RETURN SELF
Beim Start der Methode DoRksvDll() erhalte ich die Fehlermeldung "Anwendung konnte nicht korrekt gestartet werden (0xc000007b)".
Wenn die Dll nicht im VO App Ordner liegt erhalte ich korrekt die Meldung dass sie fehlt.
Hast du eine Idee, warum das nicht geht?
User avatar
wriedmann
Posts: 3755
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Gma.QrCodeNet.Encoding.dll

Post by wriedmann »

Hallo Franz,
ich habe jetzt mal gegooglet, wie das funktionieren könnte, und das hier gefunden:
https://stackoverflow.com/questions/481 ... ke-in-vs-c
Zum einen arbeitet .NET intern anders als z.B. C/C++, zum anderen kennt das .NET Framework gar keine Funktionen (die X#-Funktionen verdanken wir der Findigkeit der X#-Entwickler, denn die haben die Funktionen als statische Methoden einer internen versteckten Klasse implementiert).
Falls ich die nächsten Tage Zeit finde, werde ich das mal ausprobieren.
Wolfgang
P.S. auch auf der StackOverflow-Seite wird auf COM verwiesen
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

Gma.QrCodeNet.Encoding.dll

Post by lagraf »

Ich teste noch ein wenig mit .NET und X# zu Lernzwecken herum und habe den Code um Folgendes zur Anzeige des QRCodes erweitert:

Code: Select all

LOCAL panel AS Panel
LOCAL padding AS System.Drawing.Point
LOCAL dSize AS DrawingSize

qrEncoder := QrEncoder{ErrorCorrectionLevel.H}
qrCode := qrEncoder:Encode(cText)
renderer := GraphicsRenderer{FixedModuleSize{nSize, QuietZoneModules.Two}, System.Drawing.Brushes.Black, System.Drawing.Brushes.White}

panel := Panel{}
padding := System.Drawing.Point{10, 16}
dSize := renderer:SizeCalculator:GetSize(qrCode:Matrix:Width)
panel:AutoSize := FALSE
panel:Size := Size{dSize:CodeWidth, dSize:CodeWidth} + Size{2*padding:X, 2*padding:Y}
BEGIN USING VAR graphics := panel:CreateGraphics()
	renderer:Draw(graphics, qrCode:Matrix, padding)
END USING
Der Code compiliert ohne Fehler, aber eine Anzeige über Panel erfolgt nicht.
lagraf
Posts: 450
Joined: Thu Jan 18, 2018 9:03 am
Location: A

Gma.QrCodeNet.Encoding.dll

Post by lagraf »

Wolfgang,
ich habe mal den Eintrag [DllExport] in einer X# App ausprobiert, das wird aber von der XIDE mit einem Fehler quittiert. Muss dazu noch die NuGet Lib für Unmanaged Exports installiert werden? Was mache ich mit dem File microsoft.identity.client.4.42.1.nupkg, scheint als ob man damit nur in VS was anfangen kann.
User avatar
wriedmann
Posts: 3755
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Gma.QrCodeNet.Encoding.dll

Post by wriedmann »

Hallo Franz,
der X#-Compiler (übrigens auch der C#-Compiler) kann ohne die entsprechende Library mit dem Attribut DllExport nichts anfangen.
Eine Nuget-Datei (*.nupkg) ist übrigens eine Zip-Datei.
Du kannst sie einfach umbenennen und die Library RGiesecke.DllExport.dll in diesem Fall aus dem Unterverzeichnis Tools rausholen.
Es wäre möglich, dass Du auch Mono.Cecil.dll brauchst.
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

Gma.QrCodeNet.Encoding.dll

Post by lagraf »

Hallo Wolfgang,
ich habe von der Seite https://sites.google.com/site/robertgie ... gedexports das C# Beispiel in die XIDE übertragen, die References auf RGiesecke.DllExport und System.Runtime.InteropServices angelegt und den Code wie folgt erstellt:

Code: Select all

using RGiesecke.DllExport;
using System.Runtime.InteropServices;
class Test
{
  [DllExport("add", CallingConvention = CallingConvention.Cdecl)]
  public static int TestExport(int left, int right)
  {
     return left + right;
  } 
}
Beim Compilieren bekomme ich den Fehler
error CS0246: The type or namespace name 'DllExport' could not be found (are you missing a using directive or an assembly reference?)
für die [DllExport] Zeile. Auch mit zusätzlicher Verwendung von Mono.Cecil.Dll funktionierts nicht.

Das ganze dann als X# Beispiel sieht so aus (mit Mono.Cecil.dll):

Code: Select all

USING RGiesecke.DllExport
USING System.Runtime.InteropServices
USING Mono.Cecil.dll
[DllExport("add", CallingConvention = CallingConvention.Cdecl)]
CLASS Test
PUBLIC STATIC METHOD TestExport(left AS INT, right AS INT) AS INT PASCAL
	RETURN left + right
END CLASS
Hier bringt der Compiler den Fehler
error XS9002: Parser: unexpected CRLF, are you missing a token ?
bei der Zeile [DllExport]. Das i
TEST.zip
(2.38 KiB) Downloaded 83 times
st die gleiche Meldung wie ursprünglich, wo die RGiesecke Dll noch nicht eingebunden war.
FFF
Posts: 1580
Joined: Fri Sep 25, 2015 4:52 pm
Location: Germany

Gma.QrCodeNet.Encoding.dll

Post by FFF »

Franz,
hinter dem Attribut muß ein ";" dran, oder es muß auf der gleichen Zeile vor der Class stehen.
Allgemein die Bitte für alle:
postet keine Schnipsel, mehr, als einen Typo kann da niemand finden. Die beste Methode ist, den Ordner, in dem die App residiert als ganzes zu zippen, dann hat man Chancen, mit vertretbarem Aufwand zu helfen.
- Deine Test.zip etwa kann nicht compilieren, weil wir die beiden dlls nicht haben, es mach auch nicht viel Sinn, wenn wir sie uns suchen, weil dann noch lange nicht sicher ist, dass das genau das gleiche ist, was du benutzt.
Regards
Karl
(on Win8.1/64, Xide32 2.20, X#2.20.0.3)
lagraf
Posts: 450
Joined: Thu Jan 18, 2018 9:03 am
Location: A

Gma.QrCodeNet.Encoding.dll

Post by lagraf »

Hallo Wolfgang,
ich dachte ich schick dir die Exportfiles, weil du im anderen Thread diese haben wolltest. Und da du selber auf die Dlls verwiesen hast, nahm ich an, dass du die auch hast. Für den neuesten Stand bekommst du das Dir gezippt, zusätzlich die beiden Dlls für den Debug Ordner und das Export File.
UnmExpTest.zip
(159.77 KiB) Downloaded 93 times

Code: Select all

USING RGiesecke.DllExport
USING System.Runtime.InteropServices
USING Mono.Cecil
[DllExport("add", CallingConvention := CallingConvention.Cdecl)];
CLASS Test
PUBLIC STATIC METHOD TestExport(left AS INT, right AS INT) AS INT PASCAL
	RETURN left + right
END CLASS
bringt 3 Fehler in der [DllExport] Zeile:

Code: Select all

error XS0246: The type or namespace name 'DllExportAttribute' could not be found (are you missing a using directive or an assembly reference?)
error XS0246: The type or namespace name 'DllExport' could not be found (are you missing a using directive or an assembly reference?)
error XS1069: The type name 'CallingConvention' could not be found in the namespace 'System.Runtime.InteropServices'. This type has been forwarded to assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' Consider adding a reference to that assembly.
User avatar
wriedmann
Posts: 3755
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Gma.QrCodeNet.Encoding.dll

Post by wriedmann »

Hallo Franz,
ich habe auf die DLLs verwiesen, weil ich das irgendwo mal gelesen hatte und es mich interessiert hatte.
Die Integration von X# und VO ist definitiv eines der Gebiete, die für mich wichtig sind.
Erstes Problem: das Attribut DLLExport bezieht sich nicht auf die Klasse, sondern auf die Methode, gehört also eine Zeile weiter runter.
Der Code schaut also so aus:

Code: Select all

using RGiesecke.DllExport
using System.Runtime.InteropServices

class Test
[DllExport("add", CallingConvention := CallingConvention.Cdecl)];
public static method TestExport(left as int, right as int) as int pascal
	return left + right
end class
Das Hauptproblem ist, dass Du anscheinend die falsche DLL erwischt hast.
Robert Giesecke hat zwei Dinge gebaut, die komplett gegensätzlich funktionieren:
  • DllExport
  • UnmanagedExports
Bei zweiterem sagt die NuGet-Beschreibung das Folgende:
UnmanagedExports.png
UnmanagedExports.png (12.12 KiB) Viewed 573 times
und ich denke, es ist das, was Du möchtest.
Mit der richtigen Referenz wird das dann auch kompiliert (Wichtig: es kann nicht AnyCPU sein, sondern muss für VO x86 sein).
Allerdings scheint das nicht zu laufen, und wenn ich mit einem Tool (DLL Export Viewer von NirSoft) die DLL anschaue, dann hat die keine exportierte Funktion drin.
Ich habe das jetzt mal in Visual Studio und mit dem NuGet-Paket probiert, und auch da klappt es nicht.
Soweit ich das aber verstehe, passiert da ganz was anderes: die DLL dient nur dazu, die Dekorationen verständlich zu machen.
Anschließend wird eine Build-Operation in Visual Studio aufgerufen, die die erstellte DLL noch modifiziert.
Auf der Seite steht auch: "During compilation, my task will modify the IL to add the required exports."
Ob und wie das mit der XIDE geht, kann ich Dir nicht sagen - das muss der Chris ggf. anschauen.
Siehe auch hier:
https://sites.google.com/site/robertgie ... gedexports
Wolfgang
P.S. das Ganze schaut komplizierter aus als einfach COM zu verwenden-
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
wriedmann
Posts: 3755
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Gma.QrCodeNet.Encoding.dll

Post by wriedmann »

Hallo Franz,
ich habe gestern abend nochmal eine Stunde drauf investiert.
An und für sich sollte das auch mit X# und der XIDE funktionieren, denn auch in der XIDE kannst Du PostBuildActions definieren.
Mit der neueren Version von dieser Seite
https://github.com/3F/DllExport
sollte sich das auch implementieren lassen (das nützt genau wie das Tool von Giesecke ILDasm und ILAsm zum Erstellen der Exports).
Ich habe es allerdings auch mit Visual Studio nicht sofort zum Laufen gebracht, und irgendwann war ich zu müde.
Vielleicht hat jemand anderer Lust, sich damit zu beschäftigen - mir fehlt die Zeit und das berechtigte Interesse.
Zum einen habe ich die COM-Schnittstelle am Laufen, und die ist wesentlich leistungsfähiger und "sauberer" da objektorientiert im Gegensatz zur rein funktionalen Schnittstelle über das C-API.
Wolfgang
P.S. auch ILDAsm/ILAsm sind Teil des .NET SDKs, für das Dir der Dick gestern eine URL geliefert hat
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
Post Reply