Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以保护非固定受管阵列?_C#_Memory_Garbage Collection_Unmanaged_Unsafe - Fatal编程技术网

C# 是否可以保护非固定受管阵列?

C# 是否可以保护非固定受管阵列?,c#,memory,garbage-collection,unmanaged,unsafe,C#,Memory,Garbage Collection,Unmanaged,Unsafe,我需要保护托管阵列不被写入。我可以通过调用VirtualProtect来实现这一点。但GC可以执行紧凑的托管内存,并将非固定数组移动到另一个位置。访问权限是否会被转移,或者GC对其一无所知?在这种情况下,有没有办法防止写入非固定托管阵列 更新1: 更新2: GC.Alloc没有帮助。任何将ReadOnly属性放在内存页上的尝试都会导致GC抛出异常。它正在工作 问题是VirtualProtect会阻塞整个内存页。托管阵列未与页面边框对齐。因此,VirtualProtect会触及不属于数组的内存。

我需要保护托管阵列不被写入。我可以通过调用VirtualProtect来实现这一点。但GC可以执行紧凑的托管内存,并将非固定数组移动到另一个位置。访问权限是否会被转移,或者GC对其一无所知?在这种情况下,有没有办法防止写入非固定托管阵列

更新1:

更新2:
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