【发布时间】:2010-10-22 00:29:16
【问题描述】:
在an answer 到他自己的controversial question 中,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# 代码中)unsafe 关键字是执行此类操作所必需的。为什么这里不需要? 这是否意味着纯托管的“安全”代码根本不安全?
【问题讨论】:
-
感谢您改变提出相同问题的方式。上一个线程已过火。
-
@Mash:没问题。希望这会更加积极地关注您的原始问题。
-
@wcoenen:这并不重要,真的,即使我在考虑它——我的问题是社区内容,我没有从中获得任何收益。所以唯一重要的是积极的讨论。看起来你的问题看起来更好:)