C++ - managed <-> unmanaged

ulmerschwabe

Grünschnabel
Hallo alle zusammen

ich habe schon viel Rumgegooglet und auch schon das ein oder andere versucht, aber immer ist es am Laden der dll bzw. am Aufruf der Funktion gescheitert

Grob: Ich möchte von einer unmanaged C++-dll Objekte in C# verwenden.

Mein Betriebssystem ist XP-Prof, ich entwickle unter VS2008-Prof., verwende .Net 3.5 und die unmanaged dll wurde ebenfalls unter VS2008/C++ entwickelt.

Um nun mein Problem anzugehen, habe ich mir einen C++ (managed) Wrapper geschrieben, der auf eine Funktion von der C++(unmanaged)-dll zugreifen soll.

Hier der unmanaged Code:

Code:
#ifdef UNMANAGED_EXPORTS
	#define UNMANAGED_API __declspec(dllexport)
#else
	#define UNMANAGED_API __declspec(dllimport)
#endif
...
UNMANAGED_API void GetUnmanagedObject( CIUnmanagedObject& p_pUnmanagedObject ) ;


In meiner (managed)C++-dll verfahre ich wie folgt:

Code:
using namespace System::Runtime::InteropServices;
[DllImport("unmanaged.dll", EntryPoint = "GetUnmanagedObject")]
extern void GetUnmanagedObject( CIUnmanagedObject& p_pUnmanagedObject );

CManagedObject::Method()
{
	...
	CIUnmanagedObject foo;
	GetUnmanagedObject(foo);
}

Beim Kompilieren wird mir die Kompilerwarnung "warning C4273: 'GetUnmanagedObject': Inkonsistente DLL-Bindung." um die Ohren geworfen.
Dies konnte ich allerdings bis jetzt noch nicht beheben. Evtl. liegt dies einfach daran, dass die (unmanaged)dll mit dem define: UNMANAGED_EXPORTS erstellt wurde und meine ohne... Aber vielleicht liegt mein Problem auch gerade hier :(

Rufe ich nun CManagedObject::Method von meiner C#-Applikation "normal" auf, so stürzt die Applikation ab, im Debugger läuft alles soweit gut, bis ich an den Aufruf von GetUnmanagedObject komme. Hier wird folgender Fehler geworfen:
"Eine nicht behandelte Ausnahme des Typs "System.EntryPointNotFoundException" ist in unmanaged.dll aufgetreten.
Zusätzliche Informationen: Der Einstiegspunkt GetUnmanagedObject wurde nicht in der DLL unmanaged.dll gefunden.
"

GetUnmanagedObject wurde aber in der (unmanaged)-Dll richtig exportiert und via einer (unmanaged)-exe kann ich auch darauf zugreifen?

Gebaut habe ich die (managed)-dll mit /clr, falls das noch weiterhilft.

Ich hoffe, dass mir hierbei jemand weiterhelfen kann und bedanke mich schoneinmal im Vorraus


Liebe Grüße
 
Hi.

  1. du könntest dir die Arbeit sparen und SWIG (http://www.swig.org/) verwenden.
  2. du könntest dir die halbe Arbeit sparen und einfach IJW (It just works) mit C++/CLI verwenden. Diese Variante ist sogar etwas effizienter.

    Du mußt in C++/CLI kein P/Invoke verwenden und mit diesen DllImport Annotationen hantieren. D.h. es gibt eigentlich keinen Unterschied zwischen einer managed und unmanaged DLL in C++/CLI (auf "Programmierebene").
  3. die Exception resultiert daher, dass in deiner (unmanaged) DLL tatsächlich kein Einsprungspunkt namens "GetUnmanagedObject" vorhanden ist. Die Funktion wird durch das C++ name mangling umbenannt.
  4. der C4273 rührt daher, das du die Funktion mit verschiedenen export Optionen deklariert hast. In der Header Datei stand "dllexport" und im managed Code stand "extern". Das passt nicht.

Ergo: nimm einfach die komplette P/Invoke Definition weg \edit: und stelle sicher, das dein Projekt nicht /clr:pure oder /clr:safe verwendet. \edit_2: achso, das hast du ja schon.

Gruß
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück