C# 是否可以保护非固定受管阵列?
我需要保护托管阵列不被写入。我可以通过调用VirtualProtect来实现这一点。但GC可以执行紧凑的托管内存,并将非固定数组移动到另一个位置。访问权限是否会被转移,或者GC对其一无所知?在这种情况下,有没有办法防止写入非固定托管阵列 更新1: 更新2:C# 是否可以保护非固定受管阵列?,c#,memory,garbage-collection,unmanaged,unsafe,C#,Memory,Garbage Collection,Unmanaged,Unsafe,我需要保护托管阵列不被写入。我可以通过调用VirtualProtect来实现这一点。但GC可以执行紧凑的托管内存,并将非固定数组移动到另一个位置。访问权限是否会被转移,或者GC对其一无所知?在这种情况下,有没有办法防止写入非固定托管阵列 更新1: 更新2: GC.Alloc没有帮助。任何将ReadOnly属性放在内存页上的尝试都会导致GC抛出异常。它正在工作 问题是VirtualProtect会阻塞整个内存页。托管阵列未与页面边框对齐。因此,VirtualProtect会触及不属于数组的内存。
GC.Alloc
没有帮助。任何将ReadOnly属性放在内存页上的尝试都会导致GC抛出异常。它正在工作
问题是VirtualProtect会阻塞整个内存页。托管阵列未与页面边框对齐。因此,VirtualProtect会触及不属于数组的内存。简言之,否-GC中目前没有API可用于写保护由它管理的任何内存。NET运行时有只读段的概念,但它们不是公开可用的。CLR托管在这里也没有帮助-您可以控制虚拟API调用,但可以控制所有内存。在这样低层次的需求中,我会使用这样的写保护数组离开堆;如果您使用的是非托管内存,请记住,您可以使用
内存和Span
,并使用指针作为后盾,这样您的C#仍然可以与它对话,而不需要不安全的和到处都有指针(或者如果您已将其标记为只读,则可能使用只读内存/只读Span
)@不幸的是,Span还没有被引入.NET框架。如果我使用非托管内存,内存将帮助我解决问题。但我需要调用VirtualProtect,以在内存区域返回池后对其进行保护。@LunarWisper-一直到.NET Framework 4.5和.NET Standard 1.1