2009-04-24 10 views
3

Ich habe in der Tat zwei unbeschädigte C++ - Bibliotheken, eine von ihnen nutzt die andere. Beide sind ziemlich groß, daher ist Neuschreiben für mich keine Option.expose unmanaged C++ - Klassenbibliothek zu C#

Ich habe einiges über das Erstellen einer verwalteten C++ - Bibliothek gelesen, die den nicht verwalteten Code umgibt. Aber ich bekomme wirklich nicht, wie man anfängt, und wie man all diese Sachen in einem Projekt kombiniert ...

gibt es irgendwelche Schritt für Schritt Führer oder gute leicht zu verstehende Beispiele, wie man das macht?

TIA

+1

Bereits beantwortet http://stackoverflow.com/questions/761930/getting-object-functionallity-out-of-c-code-in-c/762012#762012 sowie zahlreiche andere Beiträge; Das war in letzter Zeit eine sehr häufige Frage. –

Antwort

1

Ich denke, es hängt davon ab, wie viel von der Bibliothek Funktionen, die Sie tatsächlich aussetzen müssen.

Ich weiß nicht, über ein verwaltetes C++ Wrapper zu schaffen, aber ich habe persönlich zwei andere Ansätze zur Lösung dieses Problems:

  1. Verwenden SWIG automatisch C# PInvoke Wrapper für Ihre C++ Klassen zu erzeugen. Diese Art von Arbeiten, aber ist es wirklich nur wert, wenn Sie eine Los von Klassen und Mitgliedern aussetzen müssen. Meiner Erfahrung nach musste der automatisch generierte Code noch manuell angepasst werden.

  2. Schreiben Sie nicht verwaltete C-Wrapper für genau die Funktionalität, die Sie benötigen, exportieren Sie sie aus einer DLL und codieren Sie die wenigen PInvoke-Wrapper, die Sie in C# importieren müssen. Ich habe herausgefunden, dass dies in einigen Fällen geeigneter ist, z. Es gibt eine große C++ - Klassenbibliothek, die verschiedene Arten von Bilddateikonvertierungen durchführt. Sie möchten jedoch nur eine einzige Funktion anzeigen lassen: DoTheConversion(LPWSTR inputFile). Mein C# -Programm musste nicht alle Feinheiten der zugrunde liegenden Klassenbibliothek kennen.

0

einige dieser Artikel lesen könnte ein Anfang sein - es ist ein ziemlich weites Feld, und es gibt keine ‚perfekte‘ Art und Weise, es zu tun:

http://www.ondotnet.com/pub/a/dotnet/2004/03/29/mcpp_part3.html http://www.codeguru.com/cpp/cpp/cpp_managed/interop/article.php/c6867

Keiner dieser Ansätze verwendet p/invoke, und es ist ein Ansatz, den wir in den Projekten verwenden, in denen ich arbeite, wo wir eine wahnsinnig alte C++ - Service-Bibliothek verbinden müssen.

1

Sie können verwaltetes und nicht verwaltetes C++ im selben Projekt schreiben. Sie können also einen Wrapper in Managed C++ schreiben, der Ihre nativen C++ - Klassen usw. aufruft. In C# erscheinen dann Ihre verwalteten C++ - Klassen wie jede andere .net-Referenz. In diesem Fall muss P/Invoke nicht verwendet werden.

1

Sie haben zwei Optionen, eine heißt ijw "es funktioniert einfach", wo Sie Managed C++ schreiben und unmanaged C++ aufrufen können. Die andere Option erfordert die Verwendung von Pinvoke.

, wenn Sie verwenden pinvoke Sie so etwas wie dieses

C#

somefunction("str1", "str2", "str3", "str4"); 

[DllImport(@"myproj.dll", EntryPoint = "somefunction")] 
public static extern IntPtr SomeFunction([MarshalAs(UnmanagedType.LPWStr)]string jarg1, [MarshalAs(UnmanagedType.LPWStr)]string jarg2, [MarshalAs(UnmanagedType.LPWStr)]string jarg3, [MarshalAs(UnmanagedType.LPWStr)]string jarg4); 

haben, werde C++

extern "C" __declspec(dllexport) void* __stdcall somefunction(wchar_t * jarg1, wchar_t * jarg2, wchar_t * jarg3, wchar_t * jarg4) 
{ 
//do some stuff with strings 
} 

wenn Sie SWIG verwenden, swig werden versuchen, den obigen Code automatisch zu generieren, aber es ist ein harter Meister.

Ich verwaltete C++ einmal, aber ich erinnere mich nicht ganz, was ich davon hielt.

3

Sie könnten einen COM-Wrapper für Ihren C++ - Code mit ATL schreiben. Ich zeige, wie man das in einer blog post macht. Auf diese Weise stellt Microsoft Funktionen bereit, die in C++ geschrieben wurden (z. B. Windows 7 Libraries-Funktionen). COM wird leicht von .NET/C# konsumiert (siehe this post). Wenn Sie diesen Weg gehen, können Sie registration free COM betrachten, wenn Sie Ihren Wrapper nicht mit anderen teilen müssen.

Verwandte Themen