HELP: Neues Objekt von .Lib in .Dll erstellen
-
Hallo Leute,
ich bin ganz neu hier und habe gleich ein für mich unlösbares Problem.
Aber zuerst was über mich: Ich bin der Vince, Technische Informatik Student aus Berlin. Arbeite gerade an einem Projekt, wo ich das GUI eines Programms von Win32 ins C#-GUI übertragen muss.Nun zu meinem Problem:
Ich habe einen Wrapper geschrieben, um den Aufruf von C++ Funktionen in C# Umgebung zu ermöglichen. Die C++ Codes werden als statische Bibliothek .lib kompiliert und der Wrapper in C++/CLI geschrieben, wird als .dll kompiliert.
Jedes mal, wenn ich ein neues Objekt von einer Klasse in .lib erstellen möchte, kommt eine Fehlermeldung mit "nicht aufgelöstes Token" bzw. "nicht aufgelöster Verweis".
Muss ich irgendwas beachten, wenn ich sowas machen möchte? irgendwas mit dllimport und dllexport?
Ich hoffe, ihr könnt mir weiterhelfen.Schöne Grüßen,
Vince
-
Hallo,
hast du die C++ Library (.lib) denn als Verweis in den Linker Einstellungen unter "Additional Dependencies" (des C++/CLI Projekts) angegeben?
Eine ausführliche Anleitung dazu gibt es unter C++/CLI bridge to connect a C# project to a native C++ DLL.Ich hoffe, das hilft dir.
-
Th69 schrieb:
Hallo,
hast du die C++ Library (.lib) denn als Verweis in den Linker Einstellungen unter "Additional Dependencies" (des C++/CLI Projekts) angegeben?
Eine ausführliche Anleitung dazu gibt es unter C++/CLI bridge to connect a C# project to a native C++ DLL.Ich hoffe, das hilft dir.
Hi,
das habe ich bereits getan. Visual Studio findet ja auch alles. Aufruf von statische Funktionen ohne Erstellung neues Objekts ist möglich. Aber Beim Aufruf:
MyObject* newObj = new MyObject();fängt der Linker an zu meckern.
PS. "And the last preparation step is to add the dependency to our BL DLL in Additional Dependencies:" Hmm, jetzt bin ich mir unsicher, ob ich das getan habe. Ich schaue heute Abend nochmal, wenn ich Zuhause bin. Vielen Dank für deine Hilfe und sehr schönen Verweis.
-
Soo, nach der Klausurvorbereitung bin ich wieder mit dem Projekt beschäftig.
Leider hat mir die obige Anleitung keinen Ausweg gezeigt. Das Problem ist noch das selbe. Vielleicht liegt es daran, dass ich ein C++ Projekt als .lib und Wrapper als .dll kompiliere. In der Anleitung ist die Rede nur von C# -> Wrapper als .dll -> C++ Projekt als .dll.
Hat jemand schonmal so etwas gemacht?
-
Wenn deine C++/CLI Wrapper DLL eine "unmanaged" C++ Schnittstelle hat, dann sollte man sie aus jedem C++ Programm heraus verwenden können. (*)
Ob der C++ Code der die Wrapper DLL verwendet aus einer .LIB kommt sollte dabei keine Rolle spielen.Was bei .LIBs die .DLLs verwenden allgemein zu beachten ist:
Bei der .LIB kannst du in den Project-Settings keine "additional dependencies" angeben. D.h. du kannst dort auch nicht einstellen dass das .LIB File der Wrapper DLL zu dem Programm welches die LIB einbindet dazugelinkt werden muss.
Ohne das .LIB File der Wrapper DLL wird es aber nicht funktionieren.Um das zu lösen gibt es mehrere Möglichkeiten. U.a.:
-
Gib das .LIB File der Wrapper DLL im Programm an (zusätzlich zum .LIB File in dem die Wrapper DLL verwendet wird).
-
Schreib ein
#pragma comment(lib, "WrapperDLLName.lib")
in ein Source-File deiner C++ LIB.
- Schreib das
#pragma comment(lib, "WrapperDLLName.lib")
in ein Include-File deiner C++ LIB.
*:
Natürlich funktioniert die Sache nicht ganz so problemlos wie man es sich wünschen würde. Manchmal weigert sich die .NET Runtime einfach zu starten, und aus den Fehlermeldungen wird man oft nicht klar. Dummerweise hab' ich die diversen Gründe die das haben kann aber schon wieder vergessen. Dabei kommt es aber nicht zu Linkerfehlern, sondern die .exe weigert sich einfach zu starten (bzw. LoadLibrary schlägt fehl wenn der .NET Code in einer dynamisch geladenen DLL ist).
-