"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.
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