C# DLL in c++ benutzen



  • Hallo Leute,
    ich habe eine C# DLL in der Funktionen für einen Controller von Phoenix bereitgestellt werden. Die Demo-Dateien von denen sind alle in C#.
    Ich habe einen Echtzeittimer den man nur mit c++ anwenden kann. Also will ich die C# dateien in C++ umschreiben. Ich weiß leider nicht genau wie ich vorgehen soll.

    #include <windows.h> 
    
    extern "C" int __cdecl myPuts(LPWSTR);   // a function from a DLL
    
    int main(VOID) 
    { 
        int Ret = 1;
    
        Ret = myPuts(L"Message sent to the DLL function\n"); 
        return Ret;
    }
    

    http://msdn.microsoft.com/en-us/library/ms686923(VS.85).aspx

    das hab ich bei msdn gefunden. Muss ich denn jede einzelne Funktion einbinden? Geht das nicht mit der Kompletten Datei???????

    Bitte um Hilfe



  • So bindest du C-DLLs ein. C#-DLLs sind wieder was anderes. C# und C++ zu mischen ist nicht so leicht, vermutlich wirst du dafür nicht drumrum kommen, Teile der C++-Anwendung in C++/CLI zu schreiben (was wiederum was anderes ist als C++, aber dank .NET mit C# verknüpft werden kann).

    Alternativ gibts doch bestimmt eine .NET-Bibliothek, mit der du deinen Echtzeittimer ersetzen kannst.



  • du kannst von c++(nativ) direkt kein managed code (C#) rufen.
    Sondern du benötigst einen native<->managed "bridge", welche du z.b. mit c++/CLR erstellen kannst.



  • kannst du das vielleicht ein wenig genauer erklären?



  • C++/CLI ist eine C++ "Spracherweiterung" von Microsoft die es dir erlaubt C# und anderes .NET Gedöns aus einem C++ Programm heraus zu verwenden - oder auch umgekehrt.
    Googeln macht schlau.
    "Ein wenig genauer erklären" ist nicht, so lange du keine konkreteren Fragen stellst.



  • Wie gesagt, ich habe eine C# Bibliothek und ich muss über c++ oder wie ihr sagt durch die Erweiterung auf diese Bibliothek zugreifen.
    Nach welchem Begriff soll ich da genau suchen?





  • vnecked schrieb:

    http://www.codeproject.com/Articles/3906/Unmanaged-to-Managed-Calls

    das sieht doch ganz nett aus oder?

    Das ist "managed C++". "Managed C++" ist der Vorgänger von "C++/CLI", und wird von MS nicht mehr supported. Eines dieser "ja, wir haben das gemacht, sorry, bitte verwendet es einfach nicht mehr - wir wissen heute auch dass es schrecklich ist" Projekte.

    "C++/CLI" ist im Prinzip das selbe, nur in weniger schlecht.

    => lass die Finger von "managed C++".



  • #include <iostream>
    #using <mscorlib.dll>
    
    #using <dlltest.dll>
    
    using namespace System;
    using namespace System::Collections;
    using namespace std;
    
    using namespace dlltest;
    
    void main(void)
    {
    Adder a;
    cout << a.add(3,5) << endl;
    while(1);
    }
    

    das ist ja C++/Cli oder?



  • Kann genau so gut "managed C++" sein.
    Die __gc Schreibweise ist "managed C++", die ^ Schreibweise ist C++/CLI.



  • Hallo,

    die vermutlich einfachste Methode ist das Exportieren von Funktionen in der DLL (also in der "echten" C++ Datei).
    .NET kann die exportierten Funktionen importieren ("DllImport"). Damit setzt du einen Callback auf einen .NET Delegate. Den kannst du im Unmanaged Code einfach als Function Pointer speichern.

    Hier mal ein kleines Beispiel von vor X-Jahren:

    #include <iostream>
    
    #define NULL 0
    
    typedef void (__stdcall *FunctionVoidNoParam)();
    typedef int (__stdcall *FunctionIntNoParam)();
    typedef void (__stdcall *FunctionVoidOneParam)(int param);
    typedef int (__stdcall *FunctionIntOneParam)(int param);
    
    extern "C"
    {
    	extern __declspec(dllexport) void __stdcall RegisterVoidNoParam(FunctionVoidNoParam func);
    	extern __declspec(dllexport) void __stdcall RegisterIntNoParam(FunctionIntNoParam func);
    	extern __declspec(dllexport) void __stdcall RegisterVoidOneParam(FunctionVoidOneParam func);
    	extern __declspec(dllexport) void __stdcall RegisterIntOneParam(FunctionIntOneParam func);
    	extern __declspec(dllexport) void __stdcall InvokeVoid();
    	extern __declspec(dllexport) int __stdcall InvokeInt();
    }
    
    FunctionVoidNoParam funcVoidNoParam = NULL;
    FunctionIntNoParam funcIntNoParam = NULL;
    FunctionVoidOneParam funcVoidOneParam = NULL;
    FunctionIntOneParam funcIntOneParam = NULL;
    
    extern __declspec(dllexport) void __stdcall RegisterVoidNoParam(FunctionVoidNoParam func)
    {
    	funcVoidNoParam = func;
    	std::cout << "Given address is 0x" << std::hex << func << std::endl;
    }
    
    extern __declspec(dllexport) void __stdcall RegisterIntNoParam(FunctionIntNoParam func)
    {
    	funcIntNoParam = func;
    	std::cout << "Given address is 0x" << std::hex << func << std::endl;
    }
    
    extern __declspec(dllexport) void __stdcall RegisterVoidOneParam(FunctionVoidOneParam func)
    {
    	funcVoidOneParam = func;
    	std::cout << "Given address is 0x" << std::hex << func << std::endl;
    }
    
    extern __declspec(dllexport) void __stdcall RegisterIntOneParam(FunctionIntOneParam func)
    {
    	funcIntOneParam = func;
    	std::cout << "Given address is 0x" << std::hex << func << std::endl;
    }
    
    extern __declspec(dllexport) void __stdcall InvokeVoid()
    {
    	std::cout << "InvokeVoid called." << std::endl;
    
    	if (funcVoidNoParam)
    	{
    		funcVoidNoParam();
    	}
    
    	if (funcVoidOneParam)
    	{
    		funcVoidOneParam(1337);
    	}
    
    	std::cout << "InvokeVoid finished." << std::endl;
    }
    
    extern __declspec(dllexport) int __stdcall InvokeInt()
    {
    	std::cout << "InvokeInt called." << std::endl;
    
    	int result = 0;
    
    	if (funcIntNoParam)
    	{
    		result += funcIntNoParam();
    	}
    
    	if (funcIntOneParam)
    	{
    		result += funcIntOneParam(1337);
    	}
    
    	std::cout << "InvokeInt finished." << std::endl;
    
    	return result;
    }
    

Anmelden zum Antworten