【发布时间】:2015-06-06 07:29:42
【问题描述】:
我在我的 C# 代码中调用了一个非托管函数。
该函数的声明如下:
int myFun(unsigned char* inputBuffer, unsigned char* &outputBuffer);
我使用这个函数如下:
[DllImport("myDLL.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int myFun([In] byte[] inputBuffer, out IntPtr outputBuffer);
byte[] a = Encoding.ASCII.GetBytes("sampletext!");
IntPtr b;
res = myFun(a, out b);
虽然我提到了[InAttribute] 为byte[] inputBuffer,但该函数仍然改变了a 的值。似乎 CLR 正在使用自己的默认封送处理行为。
我使用了byte[],因为它与unsigned char* 等效。
当我将 byte[] 替换为 char[] 时,CLR 将遵循我的 In-Out 属性。
非常感谢您的帮助。 如需更多信息,请阅读此msdn page。
【问题讨论】:
-
也许
MarshalAs就是您要找的东西? -
pinvoke marshaller 仅在必要时复制数据。它不必使用 byte[],它只是固定数组并将指针传递给第一个元素。因此,本机代码直接在托管数组上进行聚会。非常有效率。与 char[] 不同的是,元素必须从 16 位值转换为 8 位值。您将获得 Encoding.Default 值。 pinvoke marshaller必须复制,没有[Out]就不会复制回来。
标签: c# pinvoke marshalling dllimport