c#-dll in c++ Projekt einbinden



  • Hi,
    ich möchte in ein c++ Projekt (.Net 2003), welches die Initialisierung einer FireWire-Industriekamera vornimmt, eine c# dll einbinden .

    Wie kann ich das machen, kann mir da einer helfen ?

    Luchan



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Eigentlich sollte die Sprache, in der die dll geschrieben wurde völlig egal sein.

    Was hast du denn von dieser dynamischen Bibliothek gegeben? Headerdatei, Libdatei?

    /edit: Warum wurde dieser Thread verschoben? Das hat doch nun gar nichts mit MFC zu tun ...



  • Ich habe ein C# Projekt, mit Quelldateien, Recourcen, Form1 usw. in ein dll kompiliert, und ich kann sie z.B. von einen anderen C# project aufrufen mit:

    PictureAnalysis2.Form1 b; // PictureAnalysis2 ist der namespace in der dll
    b = new PictureAnalysis2.Form1();
    b.SubMain(); // Aufruf der Funktion "SubMain" von der dll

    in meiner dll wird dann diese Funktion in der Klasse "Form1" aufgerufen:

    public class Form1 : System.Windows.Forms.Form
    {
    ...

    public void SubMain()
    {
    MessageBox.Show("PictureAnalysis2.dll is starting");
    new Form1().Show ();
    }

    ... usw.

    Luchan



  • Der einfachste Weg in C++ ist, dass du die Header-Datei der dll einbindest und gegen die *.lib der dll linkst.
    Aber das setzt voraus, dass du eine *.h und eine *.lib für deine dll zur Verfügung hast.

    In einer C++ dll müssen die Funkionen noch exportiert werden:

    __declspec (dllexport) void MeineFunktion();
    

    Aber wie das bei C# läuft kann ich dir leider nicht sagen, sorry.



  • danke für deine Antwort 🙂



  • Wenn ich mich nicht irre, kannst du zwar mit C++/CLI aus eine unmanaged Dll aufrufen, aber eine managed Dll (C#) aus unmanaged Code (C++) zu laden geht nicht.

    Korrigiert mich, wenn ich falsch liege.



  • Stelle Dein "unmanaged" Projekt nach "managed" um (also durch Aktivierung des "/clr"-Compiler switches) und binde dann die C#-DLL einfach durch ein "#using" und ein "Add Reference..." ein.
    Das ist zumindest die Einfachste Variante.

    Eine weitere Möglichkeit ist noch, dass Deine C#-DLL eine COM-Schnittstelle zur Verfügung stellt, die Du dann auch direkt aus unmanaged Code ansprechen kannst (was auf beiden Seiten etwas aufwendig ist).

    Oder Du kannst natürlich noch selber die CLR hosten...
    http://www.gotdotnet.com/team/clr/about_clr_Hosting.aspx



  • Danke Jochen für deine Antwort,

    "Stelle Dein "unmanaged" Projekt nach "managed" um (also durch Aktivierung des "/clr"-Compiler switches)"

    - diese Einstellung kann ich so nicht finden in den Properties,
    aber das ist bestimmt "Use Managment Extension" welche ich auf
    yes gestellt habe, oder ?

    dann füge ich im header des files wo ich die dll nutzen möchte meine
    c# dll ein: using "PictureAnalysis2.dll"

    wenn ich es dann kompeliere bekomme ich folgende Fehlermeldung:
    "... Command line error D2016 : '/RTC1' and '/clr' command-line options
    are incompatible"

    - meine Properties sind u.a.:
    C/C++ -> Code Generation -> Basic Runtime Checks: Default (auch mit den
    anderen gehts nicht)
    -> Runtime Library: Multi-threaded Debug DLL(/MDd)

    Als Info, ich nutze .net 2003 mit dem .Net Framework 1.1,
    dann habe ich ein "fertiges" MFC - Projekt und eine c# dll, welche ich beide
    mit dem .net 2003 kompiliere habe.

    Danke und Gruss,
    Luchan



  • Ja, Du musst die passenden Änderungen machen, damit die Projekteinstellungen passen. Dann sollte es aber gehen.



  • Hallo Jochen,

    also mit .net 2003 habe ich die Fehlermeldung:

    "... Command line error D2016 : '/RTC1' and '/clr' command-line options
    are incompatible "

    nicht wegbekommen, auch mit verschiedensten Änderungen in der Properties:
    Basic Runtime Checks: Default, ...
    Runtime Library: Multi-threaded Debug DLL(/MDd), ... usw.,

    nun habe ich das mit "Visual Studio 2005" probiert, da kommt wenn ich die dll

    using "PictureAnalysis2.dll"

    einbinde kommt dann sogar die Fehlermeldung:

    "... error C2059: syntax error : 'string' ..."

    Sonst lese ich aber auch in den Foren das man das mit einen Wrapper, bzw. als
    Com verpacken muss, das mit using wäre wohl leider zu einfach

    Luchan



  • Du musst von /RTC1 auf "Default" stellen; dann dürft die Meldung nicht mehr kommen.

    Und wie am Anfang gesagt! Es gibt verschiedene Arten auf C#-DLLs zuzugreifen! Siehe mein erstes Posting...



  • Hi Jochen,
    habe alles schon probiert, geht trotzdem nicht,
    der Run Time Check war auch schon auf Default gestellt,
    ich denke da ist noch etwas anderes mit den MFC-Projekt
    weshalb es so nicht geht (?),
    dieses MFC-Projekt wird zum initialisieren von Firewire-Kameras
    genommen und kann runtergeladen werden von der homepage der
    deutschen Firma: http://www.alliedvisiontec.de/

    es gebe noch die möglichkeit ,falls du sowas überhaupt machst,
    das du es dir ma runterlädst (ca. 7MB)und startest, (würde nur 2min dauern, ich würde dir dann noch den genauen Pfad schicken) und versuchst es mit einer c# dll zu verbinden
    (ich kann dir noch meine c# dll (40kb) schicke falls das erforderlich wäre)
    - ich bräuchte dann natürlich noch deine E-Mail adresse,

    weil so klappt das bei mir jedenfalls nicht obwohl das so schön einfach
    klingt, zu schön um wahr zu sein :-),

    falls nicht muss ich es dann doch mit einer Com-Schnittstelle
    probieren oder einen Wrapper 😞

    Luchan



  • Ich hab eine E-Mail Adresse hinterlegt... schick mir mal eine Mail...


Anmelden zum Antworten