2010-11-23 8 views
4

ist es möglich, C# Methoden geschrieben in verwalteten Code (vielleicht in einer Klasse oder einer Bibliothek) von einem nativen c-Code (und wie)?Howto C# (mono, .net) Methoden, Delegaten von nativen c

thx

edit: mit "C#" i meist ist Linux oder sogar portable.net und das Betriebssystem beziehen sich auf Mono

+0

möglich Duplikat von [Wie C# Methoden exportieren?] (Http://stackoverflow.com/questions/2082159/how-to-export-c-methods) –

Antwort

6

Ihr C-Code kann Funktionen zum Registrieren von Rückrufen definieren. Der C# -Code kann diese Funktionen aufrufen und verwaltete Delegaten als Argumente übergeben. Der Marshalling-Code wird diese transparent in C-Funktionszeiger umwandeln.

Alternativ können Sie die Mono-Embedding-API verwenden, um Baugruppen zu laden, MonoMethods zu suchen und sie aufzurufen, indem Sie sich der C-Seite nähern.

Die Verwendung der Einbettungs-API ist viel komplizierter. Wenn Ihr Einstiegspunkt in C ist, müssen Sie die Einbettungs-API verwenden, aber es ist wahrscheinlich einfacher, einfach eine verwaltete Methode für die Rückrufregistrierung und jede andere verwaltete Konfiguration zu schreiben, dann müssen Sie nur diese einzelne Methode laden und aufrufen aus C-Code.

+0

Die Einstiegspunkte werden manchmal in C vielleicht auch Assembler sein. Nun, ich werde versuchen, diese http://www.mono-project.com/Embedding_Mono Anweisungen zu befolgen. Wenn Sie gute andere Tutorials haben, können Sie mir sagen. – Gobliins

+0

Wenn ich C-Code in Mono verwende, gehe ich normalerweise für dllimport. – Gobliins

2

Es gibt eine Overview of Managed/Unmanaged Code Interoperability auf der MSDN-Website, die etwas Licht für euch vergossen könnten. Ein Auszug aus:

direkt eine Managed API Zugriff auf

Wenn ein nicht verwalteten Client in C++ geschrieben ist, kann es mit der Visual Studio .NET C++ Compiler als „gemischter Modus kompiliert werden Bild." Nachdem dies getan ist, kann der nicht verwaltete Client direkt auf alle verwalteten API zugreifen. Einige Codierungsregeln gelten jedoch für Zugriff auf verwaltete Objekte von nicht verwalteten Code; Weitere Informationen finden Sie in der C++ Dokumentation.

Direktzugriff ist die bevorzugte Option , da es keine spezielle Berücksichtigung von verwalteten API Entwickler benötigt. Sie können ihre verwaltete API gemäß der verwaltete API Designrichtlinien (DG) entwerfen und davon überzeugt sein, dass die API weiterhin für nicht verwaltete Anrufer zugänglich sein wird .

eine Managed API als COM-API können

Jede öffentliche verwaltete Klasse nicht verwaltete Clients durch COM-Interop ausgesetzt werden aussetzt. Dieser Prozess ist sehr einfach zu implementieren, da die COM-Interop Schicht kümmert sich um alle COM Sanitär. So scheint zum Beispiel jede verwaltete Klasse IUnknown, IDispatch, ISupportErrorInfo und einige andere Standard-COM-Schnittstellen zu implementieren.

Trotz der Tatsache, dass verwaltete APIs als COM-APIs ist einfach, verwaltet und COM-Objekt-Modelle sind sehr unterschiedlich. Daher sollte die Offenlegung der verwalteten API für COM immer eine explizite Entscheidung sein. Einige Funktionen, die in der verwalteten Welt verfügbar sind, haben keine Entsprechung in der COM-Welt und werden nicht von COM-Clients verwendet werden. Wegen dieser, gibt es oft Spannung zwischen verwalteten API-Design-Richtlinien (DG) und Kompatibilität mit COM.

Wenn COM Kunden wichtig sind, schreiben Ihre verwalteten API nach den API-Design-Richtlinien verwaltet und dann eine dünne COM freundlich verwaltet Wrapper um Ihre verwalteten API schreiben, die wird für COM verfügbar gemacht werden.

eine Managed API als Wohnung API freilegen

Manchmal nicht verwalteten Clients nicht COM verwenden können. Zum Beispiel könnten sie bereits geschrieben werden, um flache APIs zu verwenden, und können nicht geändert oder neu kompiliert werden. C++ ist die nur High-Level-Sprache, die ermöglicht Sie verwaltete APIs als flache APIs verfügbar machen. Doing this ist nicht so unkompliziert wie eine verwaltete API als COM-API offen legen. Es ist eine sehr erweiterte Technik, die fortgeschrittene Kenntnisse von C++ - Interop und die Unterschiede zwischen den verwalteten und nicht verwalteten Welten erfordert.

Zeigen Sie Ihre verwaltete API nur dann als flache API an, wenn dies unbedingt erforderlich ist. Wenn Sie keine Wahl haben, achten Sie darauf, die C++ - Dokumentation zu überprüfen und von allen Einschränkungen vollständig zu kennen.

+0

C++/CLI nur unter Windows funktioniert, und die das Vorhandensein des "Mono" -Tags zeigt wahrscheinlich eine plattformübergreifende Unterstützung an. –

+0

Mach dir keine Sorgen, du hast die akzeptierte Antwort. – Lazarus