2016-06-08 18 views
0

Wenn Sie ein C# -Programm geschrieben haben und ein Teil des Codes mit dem Schlüsselwort unsafe geschrieben wurde, würde dieser Code dann immer noch als "verwalteter" Code betrachtet?Wird C# unsicherer Code verwaltet?

dh. Würde es unter der CLR laufen?

+4

Ja würde es unter CLR laufen. Siehe diese Antwort http://stackoverflow.com/a/3771092/1600654 Es ist nicht vollständig verwaltet. Es ist zwischen verwaltet und nicht verwaltet. – Alex

Antwort

4

"Verwalteter Code" hilft Ihnen nicht, über das Schlüsselwort unsafe richtig nachzudenken. Der wichtigste Aspekt bei verwaltetem Code ist, dass er mit dem Garbage Collector kompatibel ist. Es muss in der Lage sein, Objektverweise zurück zu finden, die von diesem Code verwendet werden, damit er richtig feststellen kann, ob das Objekt verwendet wird. Dies erfordert ein sehr spezifisches Detail. Zur Laufzeit muss der GC eine Tabelle finden können, die beschreibt, wo Objektreferenzen gespeichert sind. Lokale Variablen und Methodenargumente sind die heiklen. Diese Tabelle wird vom Just-in-Time-Compiler oder von einem Compiler wie Ngen.exe oder .NET Native generiert.

C# immer generiert verwalteten Code, es gibt keine Option zum Generieren von Methoden, die der GC nicht untersuchen kann. Das Generieren von nicht verwaltetem Code in einer .NET-Assembly ist möglich, der C++/CLI-Compiler kann dies tun. Implizit ist, dass C# -Code immer die CLR erfordert, GC ohne sie nicht.

Was ist sehr spezifisch für unsafe Code ist, dass es nicht verifizierbar ist. Es verwendet MSIL-Anweisungen, die der Just-in-Time-Compiler nicht überprüfen kann, um sicherzustellen, dass der Speicher nicht beschädigt wird. Zeiger sind der offensichtlichste Fall, der Jitter kann nicht wissen, ob eine Zeigerdereferenz sicher ist, er kennt den Zeigerwert noch nicht.

Die Folge von nicht verifizierbarem Code ist, dass jemand Ihre Assembly in eine Sandbox laden kann und darauf besteht, dass der gesamte Code verifizierbar sein muss. Es wird nicht funktionieren. Und die ultimative Konsequenz natürlich, fummeln Sie den Code und schreiben Sie an eine beliebige Adresse im Speicher, wodurch ein sehr schwieriger Bug zu diagnostizieren. Eine Woche deines Lebens zu verlieren, diesen Fehler zu finden wird erwartet.

2

verwaltetem Code (von MSDN):

Managed Code wird Code geschrieben in einem von über zwanzig hochrangige Programmiersprachen, die für die Verwendung mit dem Microsoft .NET Framework verfügbar sind, C#, einschließlich , J #, Microsoft Visual Basic .NET, Microsoft JScript .NET und C++. Alle diese Sprachen teilen sich einen vereinheitlichten Satz von Klassenbibliotheken und können in eine Intermediate Language (IL) codiert werden. Ein laufzeitbewusster Compiler kompiliert die IL in nativen ausführbaren Code innerhalb einer verwalteten Ausführungsumgebung, die Typ Sicherheit, Array-gebundene und Indexprüfung, Ausnahmebehandlung und Garbage Collection gewährleistet. Durch die Verwendung von verwaltetem Code und Kompilieren in dieser verwalteten Ausführungsumgebung können Sie viele typische Programmierfehler vermeiden, die zu Sicherheitslücken und instabilen Anwendungen führen. Auch viele unproduktive Programmieraufgaben werden automatisch erledigt, wie Typ Sicherheitsprüfung, Speicherverwaltung und Zerstörung von nicht benötigten Objekten.

Managed Code läuft unter Aufsicht der CLR, die unter anderem für die Speicherverwaltung und Garbage Collection verantwortlich ist.

Ansonsten nicht verwalteten Code läuft außerhalb des Kontextes der CLR.

Der unsichere Code läuft immer noch unter der CLR und wird in IL übersetzt, aber Sie können direkt auf den Speicher zugreifen.