Wird der nicht verwaltete C # -Code in IL kompiliert und auf der CLR ausgeführt?

8

Inmitten der Frage nach der manuellen Verwaltung von CLR-Speicher erkannte ich, dass ich sehr wenig weiß.

Mir ist bewusst, dass die CLR einen "Cookie" auf den Stapel legt, wenn Sie einen verwalteten Kontext verlassen, so dass der Garbage Collector Ihren Speicherplatz nicht mit Füßen tritt; In allem, was ich gelesen habe, ist die Annahme, dass Sie eine in C geschriebene Bibliothek aufrufen.

Ich möchte eine ganze Schreibschicht meiner Anwendung in C # außerhalb des verwalteten Kontexts verwenden, um Daten auf niedriger Ebene zu verwalten. Dann möchte ich auf diese Ebene von einer verwalteten Schicht zugreifen.

In diesem Fall wird mein nicht verwalteter C # -Code nach IL kompiliert und auf der CLR ausgeführt? Wie funktioniert das?

    
kd8azz 12.09.2012, 13:47
quelle

2 Antworten

12

Ich nehme an, dass es sich um dasselbe C # -Datenbankprojekt handelt, das Sie in der Frage erwähnt haben.

Es ist technisch möglich , ganze Schreibschichten in C / C ++ oder einer anderen Sprache zu implementieren. Und es ist technisch möglich , alles andere in C # zu haben. Ich arbeite derzeit an einer Anwendung, die nicht verwalteten Code für einige leistungsstarke Low-Level-Kram und C # für Business-Logik und Verwaltung der oberen Ebene verwendet.

Die Komplexität der Aufgabe darf jedoch nicht unterschätzt werden . Der typische Weg dazu besteht darin, einen Vertrag zu entwerfen, den beide Parteien verstehen können. Der Vertrag wird der verwalteten Sprache ausgesetzt, und die verwaltete Sprache löst Aufrufe an die native Anwendung aus. Wenn Sie jemals versucht haben, eine C ++ - Methode von C # aus aufzurufen, bekommen Sie die Idee ... Außerdem hat jeder Aufruf von nicht verwaltetem Code einen beträchtlichen Performance-Overhead, der die gesamte Idee der Low-Level-Performance zunichtemachen könnte.

Wenn Sie wirklich an relationalen Hochleistungsdatenbanken interessiert sind, dann verwenden Sie eine einfache Sprache auf niedriger Ebene.

Wenn Sie eine naive, aber voll funktionsfähige Implementierung einer Datenbank haben möchten, verwenden Sie einfach C #. Mischen Sie diese beiden Sprachen nur, wenn Sie die Komplexität vollständig verstanden haben. Siehe Raven DB - eine dokumentbasierte NoSQL-Datenbank, die nur in C # erstellt wurde.

  
    

Wird mein nicht verwalteter C # -Code nach IL kompiliert und auf der CLR ausgeführt?

  

Nein, es gibt keine nicht verwalteten C #. C # -Code wird immer in den IL-Code kompiliert und von CLR ausgeführt. Dies ist der Fall, wenn verwalteter Code nicht verwalteten Code aufruft. Unmanaged Code kann in mehreren Sprachen C / C ++ / Assembly usw. implementiert werden, aber CLR wird keine Ahnung haben, was in diesem Code passiert.

Von einem Kommentar aktualisieren. Es gibt ein Tool (ngen.exe), mit dem C # direkt in nativen Architektur-spezifischen Code kompiliert werden kann. Dieses Tool wurde entwickelt, um die Leistung der verwalteten Anwendung zu verbessern, indem die JIT-Kompilierungsstufe entfernt und systemeigener Code direkt in das ausführbare Bild oder die Bibliothek eingefügt wird. Dieser Code wird jedoch immer noch vom CLR-Host verwaltet - Speicherzuordnung und -sammlung, verwaltete Threads, Anwendungsdomänen, Ausnahmebehandlung, Sicherheit und alle anderen Aspekte werden weiterhin von der CLR gesteuert. Obwohl C # technisch in nativen Code kompiliert werden kann, wird dieser Code nicht als eigenständiges natives Abbild ausgeführt.

  
    

Wie funktioniert das?

  

Verwalteter Code interoperiert mit nicht verwaltetem Code. Es gibt mehrere Möglichkeiten, dies zu tun:

  • Durch den Code über .Net Interop. Das ist relativ schnell, sieht aber im Code etwas hässlich aus (und es ist schwer zu warten / zu testen) ( guter Artikel mit C # / C / Assembly-Proben )
  • Ein sehr viel langsamerer Ansatz, aber offener für andere Sprachen: Web-Dienste (SOAP, WS, REST und Firma), Warteschlangen (wie MSMQ, NServiceBus und andere), auch (möglicherweise) Interprozesskommunikation. Ein nicht verwalteter Prozess befindet sich an einem Ende und eine verwaltete Anwendung befindet sich auf dem anderen.
oleksii 12.09.2012, 14:02
quelle
1

Ich weiß, dass dies eine C # -Frage ist, aber wenn Sie sich mit C ++ auskennen, könnte C ++ / CLI eine erwägenswerte Option sein.

Damit können Sie Teile Ihres C ++ - Codes selektiv entweder in einem verwalteten oder in einem nicht verwalteten Kontext kompilieren. Beachten Sie jedoch, dass Code, der mit CLR-Typen interagiert, in einem verwalteten Kontext ausgeführt werden muss.

Mir sind die Laufzeitkosten für den Übergang von managed-context zu unmanaged-context und umgekehrt innerhalb des C ++ - Codes nicht bewusst, aber ich gehe davon aus, dass die Kosten für den Aufruf einer nativen Methode über .net Interop ähnlich sein müssen C #, das wie @oleksii bereits hingewiesen hat, ist teuer. Meiner Erfahrung nach hat sich dies wirklich gelohnt, wenn Sie häufig mit nativen C- oder C ++ - Bibliotheken interagieren müssen - IMHO ist es viel einfacher, sie in einem C ++ / CLI-Projekt aufzurufen, als die erforderlichen .net Interop-Schnittstellen in C # zu schreiben.

Sehen Sie sich diese Frage an, um ein paar Informationen darüber zu erhalten, wie es ist fertig.

    
user1222021 12.09.2012 18:40
quelle

Tags und Links