managed Funktionen aus C++ DLL in C# aufrufen



  • Hallo,

    so, ich häng jetzt schon gefühlte 3 Wochen an ein und demselben Problem. Ich habe eine unmanaged C++ DLL, welche ich nach langer Recherche endlich, ich sag mal gewrappt und gemanaged bekommen habe. Jetzt kann ich diese managed DLL im Visual Studio über "Verweise" endlich meinem Projekt hinzufügen. Nun taucht aber ein neues Problem auf. Aus C# heraus muss ich auf eine managed Funktion des C++ Codes (DLL) zugreifen. Irgendwie finde ich aber einfach keinen Weg diese Funktion zu exportieren. Bei unmanaged läuft das ganze ja über "__declspec(dllexport)", bei managed funktioniert das so aber leider nicht. Ich hab's jetzt schon über public und static versucht, aber leider ohne Erfolg. Kann mir da eventuell jemand weiter helfen? Bin echt am verzweifeln...

    Hier die C++ Header:

    [code]
    #include "stdafx.h"
    #using <mscorlib.dll>
    #include "Unmanaged.h"
    
    using namespace System::Runtime::InteropServices;
    using namespace System;
    
    namespace ManagedLib
    {
    public __gc class Managed
    	{		
    	public:
    		Managed();	// ctor
    		virtual ~Managed();	// dtor
    
    		// ZU EXPORTIERENDE FUNKTION	
    		public:void Output( int i, int j, bool b);
    
    	private:
    		ABC __nogc* m_pABC;
    	};
    }
    [/code]
    

    und der C++ Code

    [code]
    #include "stdafx.h"
    #include "Managed.h"
    #using <mscorlib.dll>
    
    namespace ManagedLib
    {
    	Managed::Managed()
    	{
    		m_pABC = new ABC(...);
    	}
    
    	Managed::~Managed()
    	{
    		delete m_pABC;
    	}
    
    	void Managed::Output( int i, int j, bool b)	
    	{
    		m_pABC->function_1();
    		m_pABCr->function_2();
    		m_pABC->Output(i,j,b);
    	}
    }
    [/code]
    


  • So wie es oben steht geht es bei mir mit VS2010 (/clr:oldSyntax).
    Was geht denn genau nicht?

    Bei "managed" ist eine Member- Funktion "exportiert" sobald die Klasse public ist und die Member Funktion public ist.

    Simon

    Edit
    - Ev. hilfts noch ABC vorwärts-zu-deklarieren und das include ins CPP zu verschieben.



  • Hallo,

    hmm..., bei mir kommt folgender Compilerfehler: "CS0117: ManagedLib.Managed enthält keine Definition für Output."
    Ich muss noch dazu sagen das die managed DLL in das Visual Studio 2008 Express über Verweise eingebunden wird. Man kann also kein gemischtes Projekt aus C# und C++ erstellen. Man erstellt einfach nur ein C# Projekt, lädt die managed.dll und greift über (so hab ich es bis jetzt versucht 😉 )
    ManagedLib.Managed mManaged = new ManagedLib.Managed();
    mManaged.Output(1,2,true);
    auf die Funktion zu und gibt hier die Übergabeparameter an.

    Einmal meckerte der Compiler auch das bei ... = new ManagedLib.Managed(); --> "CS0143: Der Typ ManagedLib.Managed hat keine definierten Konstruktoren." ?
    Wenn man dann das = new ManagedLib.Managed(); auskommentiert, ist zwar der Compilerfehler verschwunden aber zugleich ist natürlich auch mManaged keine zugewiesene lokale Variable mehr.



  • Kann es der "klassische" Fehler sein, dass das referenzierte Assembly nicht das aktuelle Asselmbly ist? Weil Du es zB umkopieren musstest?

    Ich empfehle es so zu machen (mindestens zu Testzwecken):
    1. Mach eine gemeinsame Solution
    2. Mach ein Projekt mit dem Wrapper
    3. Mach ein C# Projekt und erzeuge eine Referenz auf das Wrapper Projekt (und nicht auf ein Assembly!)

    Simon


Log in to reply