2010-10-25 12 views
11

Bisher habe ich herausgefunden, dass ich die Bibliothek als .dll anstelle von .lib, /clr und /EHa anstelle von /EHsc neu kompilieren musste. Jetzt habe ich eine gemanagte DLL, die ich als Referenz in meinem C# -Projekt hinzugefügt habe.Wie verwende ich eine C++ - Bibliothek in einer C# -App?

Jetzt wie verwende ich es?

Ich bin bereit, einige Wrapper zu schreiben, aber ich weiß nicht, wo ich anfangen soll oder wie ich "sehen" kann, auf welche Funktionen ich Zugriff habe. Ich habe ein wenig darüber gelesen, wie die Klassennamen und Funktionen vom Compiler gestört werden können ... Muss ich zurückgehen und __declspec Exporte überall hinzufügen (wenn ja, wie?), Oder gibt es eine Option in VS2010, dass sagt: "Mach es nicht kaputt!"

Die fragliche C++ - Bibliothek befindet sich noch in der Entwicklung, daher hoffe ich, dass ich die C++ - Bibliothek so wenig wie möglich modifizieren kann und sie nur periodisch mit einigen Schaltern neu kompiliere und die neue Funktionalität dann freischalte .

Antwort

8

Wenn Sie Ihr C++ kompilieren möchten (wenn ursprünglich nicht verwaltetes C++ war), müssen Sie viel mehr tun als nur den Schalter/clr hinzuzufügen. Damit C# die DLL verwenden kann, müssen Sie verwaltete Klassen und andere auf CTS basierende Typen erstellen, die mit C# (.NET) kompatibel sind.

See und Ref-Klassen.

Ein gutes Buch über das Thema (IMHO) zu lesen ist diese one

+0

Also ... um die verwalteten Klassen zu erstellen, muss ich das in C++/CLI tun, oder was? Ich brauche ein bisschen mehr, um weiterzumachen. – mpen

+0

Ja, du brauchst mehr, um weiterzumachen, ich würde vorschlagen, die Links zu überprüfen. Es gibt auch einige Tools, um C++ von Microsoft in verwaltetes C++ zu konvertieren, dies kann auch helfen. Check out this: http://stackoverflow.com/questions/151776/are-there-any-tools-for-converting-managed-c-to-c-cli –

6

Sie entweder die Funktionen als C-Stil-Funktionen aussetzen kann (das heißt, keine Mangeln) von Ihrem dll oder Sie können sie als COM-Objekte aus.

+0

Wie verwende ich sie als COM-Objekte? – mpen

4

Ich würde vorschlagen, einen COM-Wrapper zu schreiben und stattdessen verwenden. Sehen Sie sich http://msdn.microsoft.com/en-us/library/035x3kbh%28v=VS.80%29.aspx für Intro-Anweisungen an. Sie sollten Ihre Objektschnittstellen von IDispatch ableiten lassen und automatisierungskompatibel sein, damit die Laufzeit sie ohne benutzerdefiniertes Marshalling konsumieren kann.

Ein netter Vorteil dieses Ansatzes besteht darin, dass Sie weiterhin Ihren nativen Code als Bibliothek erstellen können und Ihr COM-Projekt dazu verwenden kann. Außerdem ist es immer noch systemeigener Code innerhalb des COM-Objekts, so dass das Potenzial für unbekannte Probleme viel geringer ist (sobald Sie die Schnittstellenebene aktiviert haben).

Das ist sowieso mein Vorschlag.

2

Ja, wickeln Sie es in ein COM-Objekt. Ich glaube ATL ist das, was Sie getan haben, um dies mit der geringsten Anstrengung zu tun.

+0

ATL? Du sprichst mit jemandem, der das noch nie gemacht hat. – mpen

+0

ActiveX-Vorlagenbibliothek. Es ist Teil der MS-Entwicklungsumgebung und wird zum Erstellen von COM-Objekten in C++ verwendet. –

Verwandte Themen