我在一些互操作中做了一些愚蠢的事情(使用DllImport
)在某一时刻,但它仍然可以在 32 位机器上运行。
在 64 位应用程序上做了哪些不同的操作(以及为什么?)导致方法 1 的行为不同?
方法一(错误的方法):
ref byte param //Signature of `DllImport`ed function
ref myarray[0] //Parameter passed in when calling function
方法二(正确的方法):
byte[] param //Signature of `DllImport`ed function
myarray //Parameter passed in when calling function
不管怎样,导入函数最终看到的地址应该是第一个数组元素的地址。由于数组将在内存中连续分配,因此我的期望是这两种方法是等效的。
应用程序是针对“任何”CPU 类型编译的。在 32 位计算机上,方法 1 和方法 2 都有效,并且表现符合预期。
在 64 位机器上,只有方法 2 可以正常工作。使用方法 1,应用程序只能看到数组的第一个元素。数组的其余部分被清零。
64 位框架可能会在函数调用之前复制到某个临时存储空间,然后在函数完成后将该数据复制回原始“ref”参数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)