C# von C aufrufen

Lesezeit: 3 Minuten

Hat jemand daran gearbeitet, ein C#-Modul aus dem C-Modul aufzurufen. Ich habe versucht, im Internet zu suchen, aber keine guten Beispiele gefunden. Viele Websites sagen zwar so etwas wie die Verwendung von COM-Interop, konnten jedoch kein richtiges Beispiel oder keinen Artikel finden, der dies erklärt.

Wenn mir da jemand weiterhelfen kann, wäre das super

Danke, Sweerap

Benutzer-Avatar
Dirk Vollmar

Es gibt mehr als nur COM-Interop, wenn Sie verwalteten Code von C oder C++ aufrufen möchten. Es gibt auch die folgenden weniger bekannten Methoden (entnommen aus MSDN-FAQ):

Wie rufe ich eine .NET-Assembly aus nativem Visual C++ auf?

Grundsätzlich gibt es vier Methoden zum Aufrufen der .NET-Assembly aus nativem VC++-Code:

  1. CLR-Hosting-API: Native VC++-Modulaufrufe CLR-Hosting-APIs Um CLR zu hosten, laden und rufen Sie die .NET-Assembly auf (Beispielcode: CppHostCLR).

  2. COM-Interop: Wenn die .NET-Assembly als COM-Komponente verfügbar gemacht werden kann, kann das native VC++-Modul die .NET-Assembly über .NET – COM-Interop aufrufen (Beispielcode: CppCOMClient).

  3. Reverse-PInvoke: Der verwaltete Code ruft nativen Code auf und übergibt einen Delegaten, den der native Code zurückrufen kann (Beispielcode: CSPInvokeDll).

  4. C++/CLI: Wenn das Modul, das nativen VC++-Code enthält, dazu berechtigt ist CLR aktivierenkann der native VC++-Code die .NET-Assembly direkt aufrufen (Beispielcode: Nutzung der C#-Bibliothek in nativem C oder C++ mit C++/CLI)

  • Danke für die Hilfe, ich werde sie im Detail untersuchen und meine Antwort posten

    – sveerap

    13. Dezember 2010 um 11:48 Uhr

  • Danke, ich habe die COM-Interop ausprobiert und konnte eine Hallo-Welt-Anwendung machen.

    – sveerap

    15. Dezember 2010 um 7:09 Uhr

  • Die Links für One Code- und CLR-Hosting-APIs sind defekt. Können Sie ein Update bereitstellen (ich konnte die richtigen Links nicht finden)

    – Roboter-Chaos

    5. November 2015 um 13:09 Uhr

Benutzer-Avatar
MajesticRa

Hier ist eine Lösung. Die Lösung ermöglicht das Aufrufen einer C#-Funktion aus C, indem Sie Ihre Funktion mit dekorieren [DllExport] -Attribut (Gegenteil von P/Invoke DllImport).

https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports

C#-Code

class Test
{
     [DllExport("add", CallingConvention = CallingConvention.StdCall)]
     public static int Add(int left, int right)
     {
         return left + right;
     } 
}

C-Code

 int main()
 {
      int z = add(5,10);
      printf("The solution is found!!! Z is %i",z);
      return 0;
 }

Wie @iceflow19 unten kommentierte:

Der Autor des Links stellt einen CLR-IL-Präprozessor als zusätzlichen Schritt während der Kompilierung bereit. Da Assemblys das gleiche binäre Containerformat (DLL) unter Windows verwenden, ist Windows intelligent genug, um die CLR aufzurufen, um diesen Code beim Aufrufen auszuführen, wenn Sie die Offsets der .Net-Funktionen in IL manuell zur vtable (der Exportliste der DLL) hinzufügen von C. Es gibt jedoch Overhead. Es ist eine nicht beworbene Funktion. So funktionieren gemischt verwaltete Bibliotheken in C++/CLI. Um es zu verwenden, fügen Sie es einfach über Nuget hinzu. Das zusätzliche Ziel, das in Ihrer MSBuild-Projektdatei hinzugefügt wird, sorgt für den IL-Vorverarbeitungsschritt

  • Ich habe diesen Link gelesen, aber er hatte nicht wirklich ein Beispiel für die Verwendung. Was müssen Sie im c-Projekt tun, um den c# (dll?)-Code zu laden? Musst du LoadLibrary FreeLibrary usw.

    – Westen

    12. September 2012 um 13:26 Uhr

  • Was hilfreich wäre, wäre eine .csproj-Beispieldatei plus MSBUILD-Anweisungen, die es dem Schüler ermöglichen würden, die Beispielanwendung zu erstellen.

    – W. V. Koslow

    30. Januar 2019 um 12:31 Uhr

  • Ich glaube nicht, dass dies mit dem neuesten .NET funktioniert, weil es immer noch auf 3.5 verweist, oder zumindest konnte ich es nicht zum Laufen bringen =(. Eine Problemumgehung, die ich in Win10 glaube, ist das Herunterladen des 3.5-Frameworks. Ich werde das jetzt versuchen

    – Gaspa79

    25. Juli 2019 um 19:49 Uhr


Benutzer-Avatar
Madhur Ahuja

Sie könnten Ihr C#-Modul als COM verfügbar machen:

http://www.codeproject.com/KB/cs/ManagedCOM.aspx

Beste Methode zum Aufrufen von verwaltetem Code (c#) aus nicht verwaltetem C++

http://www.codeproject.com/KB/COM/cominterop.aspx

  • Danke, ich habe die COM-Interop ausprobiert und konnte eine Hallo-Welt-Anwendung machen.

    – sveerap

    15. Dezember 2010 um 7:08 Uhr

Benutzer-Avatar
Fabian

Es besteht auch die Möglichkeit, native Bibliotheken aus C#-Code zu erstellen CoreRT und rufe sie von C aus an.
Hier ist ein Beispiel.

Bearbeiten: CoreRT wurde in die Runtimelab-Funktion NativeAOT verschoben. Link aktualisiert.

1385060cookie-checkC# von C aufrufen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy