Wie kann ich eine C# - dll in einer Win32-C++ - Projekt?
Bin ich an einer Lösung arbeiten, die meisten seiner Kern-engine entwickelt wird, als Win32 C++ (und ist Plattform-unabhängig und ist auch für den Einsatz auf OS X), vor einiger Zeit haben wir benötigt zum Aufruf von C++ - dll ' s der core-engine von C# und ich war in der Lage zu Laden, Haupt-Lösung mit der DLL in C# (durch die Hilfe von einigen Fäden hier SO). aber jetzt haben wir einige Dinge realisiert, die in Managed C# - dll und müssen verwenden Sie es in Win32 C++ - Projekt? (und nur Funktionsdefinitionen und dll sind vorhanden)
- Es gibt keine Plattform-unabhängige Art und Weise zum Aufruf von C# - code von einem C++ - Programm.
- zur Zeit brauche ich eine temporäre Lösung nur für windows aber immer noch nicht erlaubt die Verwendung von COM. Wahrscheinlich, wird später der Anschluss der DLL in C++ für die Portabilität. (aber kann ich nicht verwenden, einige mono-basierte Lösung für die Portabilität, auch ?)
- Also, es gibt keinen anderen Weg, außer für die Verwendung von com-basierenden wrapper für die Verwendung von Managed C# - Dll in unmanaged C++. Thnx für die Erklärung Spike & Dewb.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstellen Sie eine verwaltete C++ - interop-DLL, das als wrapper um die C# - Bibliothek.
Meisten tutorials auf verwaltete C++ leider nur erklären wie wrap unmanaged C++ für die Verwendung in C#. Aber es kann funktionieren die anderen übrigens auch.
Definieren eine abstrakte interface-Klasse, die in Ihrem systemeigenen C++ - code, dann erstellen Sie eine konkrete Unterklasse innerhalb des verwalteten C++ - DLL. Rufen Sie in Ihrem C# - Objekte in der Methode Implementierungen.
Schließlich, exportieren Sie eine factory-Funktion, die Sie instanziieren, die Umsetzung Klasse und geben einen Basis-Klassen-Zeiger, die Ihre native code verwenden können.
Hier ein kurzes Beispiel:
Ersten, die die Klasse definiert die Schnittstelle in Ihre native DLL.
interopclassbase.h
Nun müssen Sie erstellen Sie ein C++/CLI-DLL, die Ihnen erlauben, zu mischen nativen und verwaltetem code in eine einzelne assembly. Fügen Sie eine neue C++ - Projekt zu Ihrer Lösung und in der Projekt-Konfiguration legen Sie die "Common Language Runtime-Unterstützung" option Gemischt (/clr).
Sobald Sie Hinzugefügt haben eine Referenz zu dem C# - Bibliothek (die wir rufen ManagedLibrary) können wir die Umsetzung der interop-Klasse:
interopclass.cpp
Nun müssen Sie nur laden Sie die interop-DLL aus einer einheitlichen Projekt, und nennen Sie die exportierte Funktion.
Ist eine Lösung für COM-Interop. Möglicherweise die einzige Lösung. Es ein großes Thema. Es gibt eine große, Dicke, Blaue Buch bei der Arbeit, die ich verwende. Hunderte von Seiten nichts, aber für COM-Interop.
Die kurze version ist, dass Sie einige label-Klassen und-Schnittstellen in der verwalteten Seite, und haben interop-Assemblys erstellt, die Aussehen wie COM-dlls, aber sind Sie wirklich proxies, um die verwalteten Assemblys. Die interop-Assemblys sind eingetragene wie die COM dlls und Los gehts.
MSDN hat eine Menge von Informationen über Sie.
Ist dies wahrscheinlich ein guter starting Punkt.
"Aufdeckt .NET Framework-Komponenten COM"
http://msdn.microsoft.com/en-us/library/aa720072%28VS.71%29.aspx
Es kann überraschend einfach, aber versuche es einfach zu halten.
Erstellen eines verwalteten Objekt und rufen Methoden auf, die Sie brauchen, um die CLR ausgeführt werden, die in Ihrem C++ - Prozess.
Unter windows können Sie den host der CLR durch Referenzierung mscoree.dll und hosting der CLR in den Prozess.
http://msdn.microsoft.com/en-us/magazine/cc163567.aspx
http://msdn.microsoft.com/en-us/library/ms230997.aspx
Für Mono -, binden Sie die Mono runtime in C++ - Anwendung.
http://www.mono-project.com/Embedding_Mono