.NET Funktionen in AutoIt Verwenden - Teil 2

  • Hallo zusammen,
    nach dem ich bei diesem Thema in so ziemlich alle Stolperfallen reingetreten bin die es gibt, wollte ich eine kurze Anleitung schreiben was es alles zu beachten gibt.
    Angefangen hat es mit meinem ersten Post zu diesem Thema siehe hier
    Ziel war es .NET Klassen und Methoden in AutoIt zu verwenden. Da eine direkte Adressierung aller PowerShell in AutoIt nicht möglich ist, muss man hier einen Umweg über einen COM Wrapper machen. Dazu gibt es auf MSDN eine recht ausführlich Beschreibung unter dem Namen "Verfügbarmachen von .NET Framework-Komponenten in COM". Siehe hier
    Zusammenfassend waren für mein Vorhaben folgende Punkte wichtig
    1. Interface deklaration mit [ClassInterface(ClassInterfaceType.AutoDual)] siehe hier + die dazugehörige using Anweisung using System.Runtime.InteropServices;
    2. Setzen der ComVisible Eigenschaft für die Klasse. Siehe hier
    3. Es muss einen Standardkonstruktor geben der als public deklariert ist. Siehe hier
    4. Alle Methoden, die man mit COM ansprechen möchte, müssen public sein
    5. Compilieren der Klasse für alle Plattformen "Any CPU"
    6. Damit die Registrierung mit RegAsm /codebase funktioniert muss eure Klasse einen "Starken Namen" verwenden. Damit ist an der Stelle CodeSigning gemeint. Siehe hier . CodeSigning kann man im Visual Studio in den Projekteigenschaften einschalten.
    7. Registrieren der Klasse mir RegAsm /codebase. Siehe hier. Hier muss man darauf achten die richte Version von RegAsm zu verwenden. Wird das Autoit Skript für x86 kompiliert so ist auch das RegAsm aus dem x86 Verzeichniss zu verwenden.
    Zum kompilieren der Klasse gibt es noch folgendes zu sagen: Wenn zusätzliche .NET DLLs ins Projekt eingebunden werden, so müssen diese sich danach im gleichen Verzeichnis wie eure Wrapper DLL befinden.
    War die Registrierung der DLL erfolgreich, so kann die Klasse mittels ObjCreate ins AutoIt eingebunden werden.
    Bei der Verwendung der Methoden gibt es teilweise Probleme mit den Variablen Typen. String und Int kann man 1:1 übergeben. Beim Array gibt es Probleme. z.B

    Code
    string[] test = new string[2]


    ist nicht das Gleiche wie

    [autoit]

    Global test[2]

    [/autoit]


    in AutoIt. Wenn also eure Wrapper Methode einen String Array als Übergabeparameter erwartet, kann man an der Stelle kein AutoIt Array übergeben.
    Evtl. kann man an der Stelle mit DllStructCreate arbeiten (siehe hier), habe ich aber noch nicht getestet.
    Das war's. Ich hoffe es hilft euch weiter und erspart stundenlange Fehlersuche.

    Einmal editiert, zuletzt von edmann (7. August 2012 um 09:47)