.net-DLL in Autoit nutzen

  • Hi,

    nachdem ich lange gesucht habe wie ich eine .net-Dll in Autoit ohne großen Aufwand nutzen kann habe ich eine Lösung gefunden. Das ganze läuft über die Windows eigenen Powershell als "Vermittlungsstelle". Hier mal ein kleines Beispiel dazu falls das mal jemand brauchen sollte:

    Spoiler anzeigen
    [autoit]

    #include <Constants.au3>
    $dllpfad = @ScriptDir & "\Mathematik.dll"
    $namespace = "Mathematik"
    $class = "Math"
    $methode = "Add"
    $parameter = "'2','100'"

    [/autoit] [autoit][/autoit] [autoit]

    $foo = Run("powershell.exe -Command [Reflection.Assembly]::LoadFile('" & $dllpfad & "');" & _
    "$obj = [" & $namespace & "." & $class & "]::" & $methode & "(" & $parameter & ");" & _
    "$obj;", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)

    [/autoit] [autoit][/autoit] [autoit]

    $anzeigen = 0
    While 1
    $line = StdoutRead($foo)
    If @error Then ExitLoop
    If $anzeigen = 1 Then
    ConsoleWrite($line)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If StringInStr($line, $dllpfad) Then
    $anzeigen = 1
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $line = StderrRead($foo)
    If @error Then ExitLoop
    ConsoleWrite($line)
    WEnd

    [/autoit]

    Hier noch der Code der Mathematik.dll (die DLL befindet sich auch in der Zip im Anhang):

    Spoiler anzeigen
  • Hey.

    Also an sich find ich das eine super Idee, damals hat es mich echt genervt, dass man keine .Net DLL's nutzen kann.
    Allerdings bekomme ich einen Fehler.
    Ich habe die DLL gedownloaded und sie ist nun im selben Verzeichnis wie das Skript (in meinem Fall auf dem Desktop) ich habe auch nix am AutoIt code geändert.

    Hier ist das Error-log

    Spoiler anzeigen

    Ich benutze Win7 64Bit und hab AutoIt 3.3.8.1 drauf.
    Das .NET Framework habe ich natürlich auch drauf (Version 4.5)

    An sich ist es jedoch eine super Idee :)

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.

  • Ich habs zum laufen gebracht.
    Änderungen: überflüssige Includes entfernt, für .NET 2-0 compiliert.
    Irgendwie sollte das ja auch unter 4.0 machbar sein, aber für so ne einfache .dll reicht 2.0 ;)

    [autoit]


    using System;
    using System.Collections.Generic;
    using System.Text;

    [/autoit][autoit][/autoit][autoit]

    namespace Mathematik
    {
    public class Math
    {
    public static long Add(long i, long j)
    {
    return (i + j);
    }
    }
    }

    [/autoit]
  • Hatte ich vergessen zu erwähnen. Die Powershell läuft warum auch immer mit .net 2.0

    Mit diesen zwei Registryänderungen behebt man das und die Powershell läuft zukünftig immer mit der aktuell installiereten .net-Version:

    Zitat

    reg add hklm\software\microsoft\.netframework /v OnlyUseLatestCLR /t REG_DWORD /d 1
    reg add hklm\software\wow6432node\microsoft\.netframework /v OnlyUseLatestCLR /t REG_DWORD /d 1

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Mit den neuen Registry Einträgen funktioniert es nun, danke! :)

    Ich finds genial, dass es doch eine recht simple Lösung ist. :)

    Es ist nicht zufällig möglich, alle Funktionen aus einer .NET DLL mittels PowerShell aufzulisten, oder?

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.

  • Ich kapiers noch nicht so recht, aber versuch mal Folgendes:
    (Achtung, habs nur in PowerShell ISE getestet, nix AutoIt)

    [autoit]


    [Reflection.Assembly]::LoadFile("C:\temp\Mathematik\bin\Debug\Mathematik.dll")
    [Mathematik.Math] | get-member -static

    [/autoit]


    Ich krieg als Ergebnis:

    [autoit]


    TypeName : Mathematik.Math
    Name : Add
    MemberType : Method
    Definition : static long Add(long i, long j)

    [/autoit][autoit][/autoit][autoit]

    TypeName : Mathematik.Math
    Name : Equals
    MemberType : Method
    Definition : static bool Equals(System.Object objA, System.Object objB)

    [/autoit][autoit][/autoit][autoit]

    TypeName : Mathematik.Math
    Name : ReferenceEquals
    MemberType : Method
    Definition : static bool ReferenceEquals(System.Object objA, System.Object objB)

    [/autoit]


    Mehr zum Thema gibts u.a. hier: http://technet.microsoft.com/en-us/library/dd315241.aspx

    Wer andern eine Bratwurst brät
    der hat ein Bratwurstbratgerät.