C#-DLL in AutoIt einbinden

  • Hi,
    ich hab es bis jetzt noch nicht probiert aber ich denke das es ohne das .NET-Framework nicht funktioniert und bitte bitte. :D

    MFG.
    RAPTOR-ONE

  • Ich ziehe den Thread mal berechtigterweise nach oben (sowas gehört STICKY!), da in letzter Zeit schon mehrfach nach Einbindung "fremder" DLL´s gefragt wurde.
    @RAPTOR-ONE, VB bzw .Net würde ich auch noch in den Titel mit aufnehmen^^

    Ich selbst drifte gerade zw. VB.net(Visual Studio), Assembler und AutoIt hin und her, und muß zugestehen, Assembler bzw damit erstellte DLL´s benutze ich nur noch "just for Fun", oder wenn es wirklich auf das letzte bisschen Speed ankommt.Was zugegebenermaßen nicht sehr oft vorkommt, da VB.net von der Geschwindigkeit betrachtet in etwa so schnell ist wie C#.
    Gerade für das Problem 32Bit-DLL´s auf 64Bit-Systemen (und umgekehrt) sehe ich da Hoffnung, da nur noch eine DLL kompiliert werden muss....

  • mmm sehr schön ..

    ;) jetzt muss ich nur noch raus finden, wie das mit c++ express dll funktioniert ..

    das wunder schöne tool bringt nämlich n error..

    Spoiler anzeigen

    error : 'c:\dokumente und einstellungen\ich\eigene dateien\visual studio 2008\projects\get_back\debug\get_back.dll' has no valid CLR header and cannot be disassembled


    jemand n tip ?

  • hmmm...wer lesen kann ist klar im Vorteil^^
    C++<>C#
    um C++ dll´s in AutoIt einzubinden, mußt du garnichts machen, einfach per dllcall() aufrufen
    ggf cdecl beachten

  • Beim erstellen der DLL musst du auf ein paar Sachen achten, am besten so vorgehen wie für Visual Basic:
    http://www.shadoware.de/vb/tutorials/cpp_in_vb.html

    Code
    #define DLL_FUNC extern "C" _declspec(dllexport) _stdcall
    
    
    DLL_FUNC int testfunc(int integerparam) {
    	return integerparam + 5;
    }

    Einmal editiert, zuletzt von progandy (15. Juli 2010 um 22:24)

  • Hallo Forum :),

    ich bin durch einen Artikel im autoitscript.com Forum auf dieses Posting gestoßen. Hintergrund ist, dass ich schon seit geraumer Zeit auf der Suche nach einer Möglichkeit bin, über das IExtractImage Interface Vorschau-Bilder aus dem Explorer auszulesen. Nun habe ich auf espend.de eine entsprechende c# dll gefunden. Leider scheint das Tool aber bei dieser dll nicht zu funktionieren ;( , es werden keine zu exportierenden Funktionen gefunden. Mag da vielleicht mal jemand reinschauen, der ein wenig mehr Ahnung davon hat :S?

    Gruß
    Karsten

  • Inzwischen sollte eigentlich fast jedes Interface per AutoItObject ansprechbar sein. Mach am besten einen neuen Thread auf, IShellExtract ist leider nicht ganz trivial.

  • Schreibt eure Dll's einfach in C++...
    In C# isses meiner Meinung nach schwerer als einfach schnell die C++ Syntax zu lernen

  • @ RAPTOR-ONE

    Ich hab mir die ildasm.exe besorgt und aus dem framework-ordner die ilasm.exe und fusion.dll kopiert, so das ich von hand de/compilieren konnte.
    Könntest Du Dein Tool evtl. so modifizieren, dass es ohne Regkeys abzufragen und dann Fehler zu werfen, diese beiden Programme nutzt, wenn es sie im gleichen Ordner findet?
    Zweite Frage: eine Methode in der ManagedWifi.dll von Codeplex war als Void deklariert, und die dritte Methode in Deinem Beispiel ja auch als String. Müssen die trotzdem als Int32 exportiert werden, oder müsste das dann nicht auch so übernommen werden für den Export?

  • Hi,

    vielleicht komme ich am Wochenende dazu das Programm anzupassen.

    Bei Punkt 2 weiß ich nicht genau was du meinst mit als int32 exportieren.

    Falls du versucht hast manuell zu Exportieren und diese Zeilen meinst, dann kannst du das int32 stehen lassen das hat nicht mit den Parametern oder den Rückgabewerten zu tun.
    .vtfixup [1] int32 fromunmanaged at VT_01
    .data VT_01 = int32(0)

    Falls es das nicht war erkläre nochmal was du genau gemeint hast.

  • ja, das meinte ich.
    .vtfixup [1] int32 fromunmanaged at VT_01
    .data VT_01 = int32(0)
    es spielt also keine rolle, in welchem format die rückgabewerte vorliegen?

    allerdings stand .corflags bei mir auf 0x00000003 . habs auf 0x00000002 geändert, war das richtig?

    Evtl. lässt sich das Programm dann ja auch in AutoIt umsetzen und der Source hier veröffentlichen, so dass es nicht verloren geht. ilasm.exe und fusion.dll können aus dem framework-ordner kopiert werden, nur die ildasm.exe müsste der user sich besorgen aus dem frei verfügbaren c#-sdk.

    Einmal editiert, zuletzt von fakeraol (31. März 2012 um 17:33)

  • Hallo zusammen,

    Das program (dotNET DLL-Exporter.exe) ist bei mir leider ziemlich instabil; es schliesst sich andauernd von alleine wenn ich z.B. dabei bin nach einer Datei zu browsen. Ist dies ein bekannter Fehler?

    Ich habe W7 64-bit, falls es wen interessiert :)

    --
    Edit1: irgendwie muss sich die .exe-Datei korrumpiert haben; als ich sie neu aus der ZIP-Datei entnommen habe, hat sie einwandfrei funktioniert.
    ---

  • Hey Jungs,

    tut mir leid, so ein altes Thema wieder aufzugreifen,
    aber ich finde keinen Lösungsweg,
    eine C# DLL in AutoIt zu benutzen.

    Das Tool, von RAPTOR,
    sowieso seine "Methode", die ich
    nicht ganz verstehe, funktionieren nicht :(

    Ich hoffe auf Hilfe,

    Mfg.

  • Hi,
    sowohl Tool und Methode funktionieren noch einwandfrei...jedenfalls bei mir.

  • Hi,
    sowohl Tool und Methode funktionieren noch einwandfrei...jedenfalls bei mir.

    Ich habe folgenden C# Code (für die DLL):

    Spoiler anzeigen

    Nun, so mache ich es, und so funktionert es nicht...:

    1) Die C# DLL aus dem Projects/Projekt/Projekt/bin/debug/testdll.dll in das Programm von RAPTOR laden.
    => testdll.il & testdll.res entstehen im Ordner.

    2) Ich selektiere die "RechenFunktion" - Funktion, und drücke auf "CIL-Code Modifizieren".
    - Selektiert habe ich:

    Spoiler anzeigen

    {
    // Code size 9 (0x9)
    .maxstack 1
    .locals init ([0] int64 CS$1$0000)
    IL_0000: nop
    IL_0001: ldc.i4.s 10
    IL_0003: conv.i8
    IL_0004: stloc.0
    IL_0005: br.s IL_0007

    IL_0007: ldloc.0
    IL_0008: ret
    } // end of method AddierenClass::RechenFunktion

    3) Nachdem ich den CIL-Code gespeichert habe, drücke ich auf Kompilieren.
    => Ausgabe:

    Spoiler anzeigen

    4) Ich verschiebe die TestDLL.dll, die um 1KB kleiner geworden ist, in ein Verzeichniss,
    indem ich dieses Script ausführe:

    Spoiler anzeigen
    [autoit]

    $Dllopen = DllOpen(@ScriptDir & "\TestDLL.dll")
    $DLLcall = DllCall($Dllopen, "long", "RechenFunktion")
    MsgBox(0, "", $DLLcall)
    DllClose($Dllopen)

    [/autoit]


    Ausgabe: 0.

    Ich hoffe, dass ich es ausführlich genug ausgedrückt habe,
    'bin nicht so gut im Erklären...

    Danke!

    PS: TestDLL.dll - voher / nachher im Anhang!