none
Import - DLL - Vorgehensweise RRS feed

  • Frage

  • Hallo Community,

    ich habe ein mittelschweres Problem;.-)

    Ich muss eine klassische C++ unmanaged DLL in C# einbinden.

    Was muss ich nun machen, um diese in C# verwenden zu können?
    long functionProduct(VARIANT inputUser, VARIANT inputProductNo, VARIANT * outID1, VARIANT * outID2, VARIANT * outErrMsg);
    long functionArticle(VARIANT inputUser, VARIANT inputArticleNo, VARIANT * outErrMsg);
    string functionGetCurrentUser();

    Einen Wrapper schreiben, denke ich. Wie gehe ich dabei vor?

    Gruß, Oliver

    Dienstag, 23. Mai 2017 16:53

Antworten

  • Hallo Oliver,

    etwas genauer sollte Dein DLL-Lieferant bei den Variant-Datentypen schon sein, sonst könnte es relativ mühselig werden.

    Generell kann man ein Variant über System.Object abbilden, problematisch ist dabei u. U., dass ein Variant unterschiedliche Datentypen aufnehmen kann, siehe dazu: Default Marshaling for Objects; für Zeichenketten, die ebenfalls enthalten sein können:  How to: Marshal COM Strings Using C++ Interop.

    In den Fällen, bei denen es sich um eine Rückgabe handelt, siehe den Abschnitt Marshaling ByRef Variants und es wäre festzulegen, wer den Speicher allokiert bzw. freigibt, damit es kein Speicherleck gibt.

    Besser könntet ihr fahren, wenn die Bibliothek nicht nur Variant nutzen würde, sondern als COM Bibliothek aufgebaut wäre, siehe dazu:  COM Wrappers (ff.)

    Gruß Elmar

    Mittwoch, 24. Mai 2017 18:04
    Beantworter
  • Hallo Oliver,

    ich glaube, dass das Thema inhaltlich besser in das "Visual C++/CLI" passt.

    Sehen Sie sich bitte die Beiträge in den unten angegebenen Artikeln an:

    Writing unmanaged C++ DLLs for use in C#

    Unmanaged C++ Dll call From Managed C# Application

    Hoffentlich werden Sie auch in Ihrem Fall hilfreich sein.

    Gruß

    Michaela


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 24. Mai 2017 14:39
    Moderator

Alle Antworten

  • Hallo Oliver,

    ich glaube, dass das Thema inhaltlich besser in das "Visual C++/CLI" passt.

    Sehen Sie sich bitte die Beiträge in den unten angegebenen Artikeln an:

    Writing unmanaged C++ DLLs for use in C#

    Unmanaged C++ Dll call From Managed C# Application

    Hoffentlich werden Sie auch in Ihrem Fall hilfreich sein.

    Gruß

    Michaela


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 24. Mai 2017 14:39
    Moderator
  • ich glaube, dass das Thema inhaltlich besser in das "Visual C++/CLI" passt.


    Hallo Michaela,
    ich werde es mir anschauen, sobald ich die DLL erhalten habe. Ich brauche es in C# halt.
    D.h. die DLL ist fertig, mit den VARIANT Datentypen.
    Deine Links gehen sicherlich in diese Richtung.
    Was muss ich bei VARIANT beachten, wie muss ich das konvertieren?  Welcher Datentyp?
    Es gibt dort ca. 40 Funktionen mit ähnlichem Aufbau.
    Der Kunde lieferte uns die Spezifikation und eben noch nicht die DLL.
    Vielleicht hast noch da einen Tipp.
    [DllImport("OutDll.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern string subtract(variant a, variant b);

    Also so z.B.
    long UpdateExemption(VARIANT inUser, VARIANT inID, VARIANT inAngle, VARIANT inRetry, VARIANT * outErrMsg);
    Kurzum, mein Hauptproblem sind die In und Outs und der Datentyp VARIANT.
    Gruß, Oliver
    Mittwoch, 24. Mai 2017 17:05
  • Hallo Oliver,

    etwas genauer sollte Dein DLL-Lieferant bei den Variant-Datentypen schon sein, sonst könnte es relativ mühselig werden.

    Generell kann man ein Variant über System.Object abbilden, problematisch ist dabei u. U., dass ein Variant unterschiedliche Datentypen aufnehmen kann, siehe dazu: Default Marshaling for Objects; für Zeichenketten, die ebenfalls enthalten sein können:  How to: Marshal COM Strings Using C++ Interop.

    In den Fällen, bei denen es sich um eine Rückgabe handelt, siehe den Abschnitt Marshaling ByRef Variants und es wäre festzulegen, wer den Speicher allokiert bzw. freigibt, damit es kein Speicherleck gibt.

    Besser könntet ihr fahren, wenn die Bibliothek nicht nur Variant nutzen würde, sondern als COM Bibliothek aufgebaut wäre, siehe dazu:  COM Wrappers (ff.)

    Gruß Elmar

    Mittwoch, 24. Mai 2017 18:04
    Beantworter