在回答他自己有争议的问题时,Mash已经说明您不需要“不安全”关键字来直接读取和写入任何 .NET 对象实例的字节。您可以声明以下类型:
[StructLayout(LayoutKind.Explicit)]
struct MemoryAccess
{
[FieldOffset(0)]
public object Object;
[FieldOffset(0)]
public TopBytes Bytes;
}
class TopBytes
{
public byte b0;
public byte b1;
public byte b2;
public byte b3;
public byte b4;
public byte b5;
public byte b6;
public byte b7;
public byte b8;
public byte b9;
public byte b10;
public byte b11;
public byte b12;
public byte b13;
public byte b14;
public byte b15;
}
然后你可以做一些事情,比如改变一个“不可变”的字符串。以下代码在我的机器上打印“bar”:
string foo = "foo";
MemoryAccess mem = new MemoryAccess();
mem.Object = foo;
mem.Bytes.b8 = (byte)'b';
mem.Bytes.b10 = (byte)'a';
mem.Bytes.b12 = (byte)'r';
Console.WriteLine(foo);
您还可以通过使用相同技术破坏对象引用来触发AccessViolationException。
问题:我认为(在纯托管 C# 代码中)不安全关键字是执行此类操作所必需的。为什么这里不需要?这是否意味着纯托管的“安全”代码根本不安全?