Verknüpfen der nicht verwalteten C ++ - DLL mit der verwalteten C ++ - Klassenbibliothek-DLL

8

Wie in der Frage Erstellen eines einfachen C ++ .net-Wrappers. Schritt für Schritt

Ich verwende C ++ - Klassen in .NET aber ich habe Probleme beim Erstellen in Visual Studio (2008).

Ich habe eine nicht verwaltete Klasse A (C ++ kompiliert mit / clr). Ich habe eine C ++ / CLR-Klasse 'Class1' erstellt, die A und mit Matching umschließt Methode delegiert an A's Methoden.

Wenn ich die Quelldatei der Klasse A in die Klassenbibliothek einbeziehe Projekt für Class1 (verwaltet) Ich habe keine Probleme alles verlinkt und funktioniert gut, Aber ich habe viele nicht-verwaltete C ++ - Klassen wie A und ich versuche, sie einzufügen eine DLL und verlinke diese DLL mit der verwalteten Bibliothek (von Klassenwrappern). [Ich sehe derzeit keine Notwendigkeit, diese DLLs zu verknüpfen, aber der Compiler scheint es zu benötigen und gibt die gleichen Fehler wie unten gezeigt.]

Ich habe eine VisualC ++ / CLR / Class-Bibliothek erstellt und fügte meine C ++ - Klasse (A unten aufgeführt) und Build hinzu. [Ich habe die Standardeinstellungen aber verwendet In den Projekt Linker Einstellungen habe ich beides ausprobiert Registrieren Sie die Ausgabe mit Ja und Nein.] Es gab keine Fehler und die .DLL-Datei wurde erstellt.

Ich habe eine VisualC ++ / CLR / Class-Bibliothek erstellt und erstellt die Wrapper-Klasse 'Class1' Ich habe alle Standardeinstellungen verwendet. Unter Projekteigenschaften habe ich auf 'Referenzen' 'Neue Referenz hinzufügen' geklickt. und wählte die DLL aus, die im ersten Schritt erstellt wurde.

Ich bekomme Linkfehler:

%Vor%

Die gleichen Fehler, als ob ich A.cpp im Wrapper-Klassenbibliotheksprojekt entfernen würde (die Option, die funktioniert). Ich verstehe nicht, warum der Build überhaupt versucht, das Äußere aufzulösen weil dies eine Bibliothek ist, kein Programm.

Gibt es noch etwas, das ich den Wrapper-Klassenbibliothek-Projekteigenschaften hinzufügen muss? oder die DLL von nicht verwalteten Klassen oder Compileroptionen registrieren? Benötige ich auch eine .lib-Datei, um mit der DLL zu gehen? (Im Zielverzeichnis des Projekts wird keine lib-Datei angezeigt.)

Muss ich noch __declspec (dllexport) verwenden [dachte, das sei nur für C-Style-Funktionen keine Klassenmitglieder.] wie in der Frage: Exportieren von nicht verwalteten Klassen aus einer Visual C ++ DLL? obwohl die nicht verwaltete C ++ - Bibliothek mit aktivierter CLR kompiliert wurde.

(Ich habe auch versucht, als statische Bibliothek zu kompilieren, aber ich kann nicht herausfinden, wie ich hinzufügen kann die .lib-Datei zum CLR-Klassenbibliotheksprojekt).

Meine Testklasse ist

%Vor%

mit der Implementierung:

%Vor%

Und die Wrapper-Klasse ist

%Vor%

Wie bei der Frage: C ++ / CLI Mixed-Mode-DLL-Erstellung Ich habe es auch versucht:

%Vor%

Und auch dieses Drängen ist um A.cpp gelungen.

Aktualisierung: Wie mcdaves Antwort habe ich die / clr entfernt, was eine DLL hervorbrachte. Wie stelle ich diese DLL nun meiner test_NET_library zur Verfügung?

Ich habe versucht, Referenzen / neue Referenz hinzufügen, und wählte die neue diese neue DLL; und bekam die Nachricht "Konnte den Verweis auf die Datei 'C: .. \ unmanaged_lib.dll' nicht hinzufügen, da es weder eine .NET-Assembly noch ein registriertes ActiveX-Steuerelement ist." Die DLL wurde der Dateiliste des Projekts hinzugefügt, aber der Compiler scheint sie zu ignorieren.

Ich habe das Add / Existing-Element ausprobiert und die neue DLL ausgewählt. .DLL-Dateien sind jedoch kein auswählbarer Dateityp.

    
Roger Nelson 23.10.2010, 03:05
quelle

1 Antwort

6

Mit den wenigen Hinweisen von deinem Update werde ich zwei Vermutungen versuchen ...

  1. Wenn unmanaged_lib eine statisch verknüpfte lib ist, haben Sie das unmanaged_lib-Projekt als eine Abhängigkeit von test_NET_library definiert? (Klicken Sie im Projekt-Explorer mit der rechten Maustaste auf test_NET_library, wählen Sie "Project Dependencies ..." und dann unmanaged_lib.)
  2. Wenn unmanaged_lib eine DLL ist, müssen Sie die Klasse aus der DLL exportieren, indem Sie diese Antwort und machen Sie auch die test_NET_library von dem Projekt unmanaged_lib abhängig.
mcdave 07.11.2010, 10:10
quelle

Tags und Links