我曾经在一些互操作中做了一些愚蠢的事情(使用DllImport
),但它仍然可以在 32 位机器上运行。
在 64 位应用程序上做了哪些不同的操作(以及为什么?)导致方法 1 的行为不同?
方法1(错误的方式):
ref byte param //Signature of `DllImport`ed function
ref myarray[0] //Parameter passed in when calling function
方法2(正确的方法):
byte[] param //Signature of `DllImport`ed function
myarray //Parameter passed in when calling function
无论哪种方式,导入函数最终看到的地址都应该是第一个数组元素的地址。由于数组将在内存中连续分配,我的期望是这两种方法是等效的。
应用程序是针对 CPU 类型“Any”编译的。在 32 位计算机上,方法 1 和方法 2 都有效,并且表现符合预期。 在 64 位机器上,只有方法 2 可以正常工作。使用方法 1,应用程序只能看到数组的第一个元素。数组的其余部分被清零。
最佳答案
64 位框架可能会在函数调用之前复制到某个临时存储空间,然后在函数完成后将该数据复制回原始的“ref”参数。
关于c# - 为什么(错误地)使用 ref myarray[0] 传递数组可以工作,但仅在 32 位应用程序中有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4147423/