c# - 为什么(错误地)使用 ref myarray[0] 传递数组可以工作,但仅在 32 位应用程序中有效?

标签 c# 64-bit pinvoke dllimport

我曾经在一些互操作中做了一些愚蠢的事情(使用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/

相关文章:

c# - PInvoke:在 C++ 中分配内存并在 C# 中释放它

c# - 将 C++ 结构编码(marshal)到 C# 的最有效方法是什么?

c# - "this"直接初始化类成员变量时不可用

c# - Json.NET 和 NHibernate - 反序列化持久对象

c# - 无法识别的数组错误

assembly - 如何使用存储在 x64 位置的 x64 内存地址进行跳转?

c# - 在 ASP .NET 5 中默认阻止匿名访问

visual-studio-2008 - 安装程序仅在 x64 系统上安装到 root

.net - 在 64 位 .NET 应用程序中使用 32 位非托管 COM 服务器

c# - 如何在 WinRT 8.1 上 P/调用 kernel32.dll