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
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:
CLR-Hosting-API: Native VC++-Modulaufrufe CLR-Hosting-APIs Um CLR zu hosten, laden und rufen Sie die .NET-Assembly auf (Beispielcode: CppHostCLR).
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).
Reverse-PInvoke: Der verwaltete Code ruft nativen Code auf und übergibt einen Delegaten, den der native Code zurückrufen kann (Beispielcode: CSPInvokeDll).
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
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).
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 LoadLibraryFreeLibrary 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
Madhur Ahuja
Sie könnten Ihr C#-Modul als COM verfügbar machen: