2009-08-28 5 views
3

Angenommen, ich habe in .Net eine Klassenbibliothek (dll) geschrieben, und jetzt haben Entwickler sie in ihren .Net-Anwendungen verwendet..Net - Kann eine in .Net geschriebene Klassenbibliothek (dll) von einer in C oder C++ geschriebenen Anwendung verwendet werden?

Die Bibliothek selbst könnte jedoch auch für Entwickler nützlich sein, die nativ schreiben (in C oder C++). Also meine Frage ist, ob meine verwaltete DLL in C oder C++ verwendet werden kann?

Wenn nicht, warum? Vielleicht muss ich einen speziellen Code hinzufügen, um ihn für native Programmierer verfügbar zu machen?

Danke.

EDIT: Falls jemand anderes in diesem Thema interessiert ist, fand ich this Artikel von Google Books, die eine Einführung gibt, wie Net.classes von COM zu verwenden.

Antwort

10

Die einzige Möglichkeit, eine .NET-Assembly außerhalb einer CLR-basierten Sprache verfügbar zu machen, ist über COM Interop. Es gibt nichts, was Sie tun können, um .NET direkt in einer nicht verwalteten Sprache zu referenzieren.

Der Grund dafür ist, dass die Dateierweiterung ".dll" nur für das Aussehen und die Illusion der Konsistenz verwendet wird. .NET generierte .dll-Dateien enthalten keinen Maschinencode, sie enthalten IL (Zwischensprache), die zur Laufzeit kompiliert wird (Just-In-Time Compilation oder JIT genannt). Der Code wird nicht zum Zeitpunkt kompiliert, in dem er in der DLL-Datei gespeichert wird. Daher kann die nicht verwaltete Sprache nicht ausgeführt werden.

COM-Interop ermöglicht es der CLR, die DLL zu laden, diese JIT-Kompilierung durchzuführen und das COM-System für die Kommunikation zwischen dem systemeigenen Code und der .NET-DLL zu verwenden.

+0

Ich habe keine Einwände! Mein Wissen darüber ist nicht viel und ich lerne. Vielen Dank für Ihre Erklärung. Wenn ein C++ - Entwickler jedoch meine verwaltete Dll/Assembly aufrufen und deren Methoden verwenden möchte, bestätige ich, dass er dies tun kann, solange er COM Interop verwendet (worüber ich nichts weiß) oder muss Ich mache etwas mit meiner Bibliothek, um COM Interop für ihn zu aktivieren? Sorry für alle Fragen, aber ich bin ziemlich neu in diesem fortgeschrittenen Zeug. – moster67

+1

Sie müssen Ihre Assembly in .NET als COM-exposed markieren (dies ist eine Projekteigenschaft), und Sie müssen einige Installationsarbeiten mit dem Code ausführen, damit es funktioniert. Es gibt viele Artikel darüber, wie Sie Ihre .NET-Assembly und -Klassen für COM verfügbar machen. Der C++ - Entwickler muss dann die COM-Schnittstelle verwenden, um mit Ihren Klassen zu interagieren. Es ist keineswegs ein einfacher oder nahtloser Prozess. –

+0

Adam: Vielen Dank für die Hinweise. Ich denke, ich muss mit jemandem zusammenarbeiten, der sich in einer nicht verwalteten Sprache entwickelt, und gemeinsam versuchen, dies zum Laufen zu bringen. Nochmals vielen Dank für Ihre Hilfe. Einen schönen Tag/Wochenende haben. – moster67

1

Ich muss Adam Robinson widersprechen. Seine Beschreibung, insbesondere der Kommentar, der die COM-exposed-Eigenschaft erklärt, ist sicherlich eine Möglichkeit, sie zu implementieren. Das andere ist die C- oder C++ - Anwendung host the Microsoft CLR und lassen Sie damit Ihre .Net-DLL laufen. Möglicherweise können Sie auch Mono hosten, es sollte jedoch genauso gut in der Lage sein, reine .Net-DLLs auszuführen. (Dh kein P/Invoke Tricks)

+1

@MSalters: Während Sie die CLR in Ihrer Anwendung hosten können, ist dies eine großartige Möglichkeit, Ihre Anwendung erweiterbar zu machen (d. H., indem Entwicklern ermöglicht wird, Plugins in einer .NET-Schnittstelle zu schreiben), ist es keine echte (oder praktikable) Lösung, einfach eine .NET-DLL in Ihrer Anwendung zu "verwenden". Die C++ - Installation dafür ist ziemlich umfangreich und es ist kaum intuitiv. Ich nehme an, dass es eine theoretische Möglichkeit ist, das Ziel der Verwendung einer .NET-Assembly in nativem Code zu erreichen, aber die COM-Lösung scheint geeigneter zu sein und ist im Vergleich dazu ein geringer Aufwand. –

+0

Oh, ich würde definitiv mit dir übereinstimmen, wenn du mit "Bei weitem der einfachste Weg zu ..." begonnen hättest. Dieser Beitrag hat nur versucht, die Liste der Optionen zu vervollständigen. Ich meine, Hosting Mono scheint noch gruseliger. Dies ist jedoch möglicherweise der einzige Weg, wenn Sie diese .Net DLL in einer nativen Linux C App verwenden möchten – MSalters

0

Wenn Sie weniger als eine voll ausgeblasen C++ Klasse absetzen können, und weiß nicht, wie COM-Wrapper, dann this solution oder this one verwenden, mit denen Sie statische Methoden als Funktion Exporte belichten oder einfache C# -Strukturen als C++ - Strukturen. Visual Studio ist dafür erforderlich, wird jedoch von Microsoft nicht unterstützt. Sie verwenden es daher auf eigenes Risiko. Ich kann bestätigen, dass es für mich funktioniert hat. Ein anderer Weg ist die Verwendung von Mono und CXXI, wie von de Icaza in seinem Blog beschrieben.

Verwandte Themen