静态成员是否存储在.NET中的固定位置?

时间:2015-11-04 15:53:37

标签: .net interop marshalling

请考虑以下代码:

class Foo
{
    static readonly Guid guid = Guid.Parse("...");
}

静态guid字段的基础地址可以在初始化后更改吗?如果没有,该如何获得这个地址?

常数怎么样?

注意:我知道GC中一般可以移动引用类型(无论是否存在带有句柄的静态变量),但这对静态值类型和常量有何作用?

这个问题出现了,因为我们正在研究一些需要与非托管API互操作的代码,如果它们已经在内存中的固定地址,我们希望避免将字节的额外副本复制到HGlobal中开头。

我更感兴趣的是知道CLI标准对此的描述(与特定的.NET实现 相比),因为我更喜欢不依赖于巧合实现细节的健壮代码

1 个答案:

答案 0 :(得分:1)

据我所知,标准没有提到这一点 - 这并不奇怪,因为它绝对是一个在托管运行时不应该关心的实现细节。

由于您希望在非托管互操作中重用此地址,因此我可以放心 - 您无法在不安全的代码中真正访问这些静态字段的地址。我不知道为什么(可能作为一些保护措施),但似乎是这种情况。

当然,noöne会阻止您制作自己的帮助程序类型,为您想要的任何内容分配一块非托管内存,并用读取非托管内存的属性替换这些字段 - 您甚至不必关心GC ,因为静态字段只会与域(通常是过程)一起死亡。