Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.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#_.net_.net Core_Static_Value Type - Fatal编程技术网

C# 是否可以长期固定静态值类型字段?

C# 是否可以长期固定静态值类型字段?,c#,.net,.net-core,static,value-type,C#,.net,.net Core,Static,Value Type,我需要在内存中固定静态值类型字段,并且我需要长期固定,即使用固定的GCHandle(或等效项),不固定的局部变量(例如C#中的fixed块或C++/CLI中的pin_ptr) 我要发疯了,我不能接受这是不可能的 因此,我可以使用fixed/pin\u ptr将值类型静态字段本地固定到函数,但当函数返回时,我会丢失该固定 使用类型为GCHandleType.pinted的GCHandleType,我可以随意固定对象,但它仅适用于对象、引用类型。我知道值类型静态字段在内部存储为框(e:似乎这只适用于

我需要在内存中固定静态值类型字段,并且我需要长期固定,即使用固定的
GCHandle
(或等效项),不固定的局部变量(例如C#中的
fixed
块或C++/CLI中的
pin_ptr

我要发疯了,我不能接受这是不可能的

因此,我可以使用
fixed
/
pin\u ptr
将值类型静态字段本地固定到函数,但当函数返回时,我会丢失该固定

使用类型为
GCHandleType.pinted
GCHandleType
,我可以随意固定对象,但它仅适用于对象、引用类型。我知道值类型静态字段在内部存储为框(e:似乎这只适用于非基本类型,我正在处理基本类型),但我无法获取对内部框对象的引用:如果我将字段传递给
GCHandle
,我将从字段的当前值创建一个新框

通过阅读.NET内部构件,我知道静态数据存储在汇编对象中,汇编对象过去是非GC的,并保证在内存中保持固定。但在最新版本的Core和Framework中,程序集已经变得可以收集,我不知道这是否仍然适用(可能不适用,或者我们不需要
FixedAddressValueTypeAttribute

我无法将该字段标记为
[FixedAddressValueType]
,因为它位于第三方程序集中,我无法替换或修改

总之,我可以锁定任何东西,只要我在本地对一个函数执行。我可以非本地锁定,但仅当我有一个对象的引用时。值类型静态字段包装在对象中,但我无法获取对它的引用。理想情况下,不依赖于特定于实现的内部结构,或者根本不受支持,是否有希望实现这一点


(…为了让它变得更难,理想情况下,我需要使用本机COM API从非托管代码中执行。同样理想情况下,我需要同时支持.NET Framework和.NET Core)

如何访问这个固定变量?仅仅是地址?是的,仅仅是地址,但它确实需要在整个过程中保持不变