Yas*_*eni 6 c# pinvoke marshalling dllimport
我在我的C#代码中调用了一个非托管函数.
该功能的声明如下:
int myFun(unsigned char* inputBuffer, unsigned char* &outputBuffer);
Run Code Online (Sandbox Code Playgroud)
我使用这个函数如下:
[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);
Run Code Online (Sandbox Code Playgroud)
虽然我提到[InAttribute]过byte[] inputBuffer,但该功能仍然改变了它的值a.似乎CLR正在使用其自己的默认编组行为.我用过,byte[]因为它是C#的等价物unsigned char*.
当我byte[]用char[]CLR 替代时,将遵循我的In-Out属性.
我非常感谢你的帮助.有关更多信息,请阅读此msdn页面.
从文档中,我强调:
作为优化,仅包含blittable成员的blittable类型和类的数组被固定而不是在编组期间被复制.当呼叫者和被呼叫者在同一个公寓中时,这些类型可以看起来被编组为输入/输出参数.但是,这些类型实际上是作为In参数封送的,如果要将参数封送为In/Out参数,则必须应用InAttribute和OutAttribute属性.
因为byte是blittable,所以你的字节数组被固定而不是复制,因此编组为In/Out.
当我用char []替换byte []时,CLR将遵循我的In-Out属性.
C#的类型char是不blittable.一个数组char未固定,因此[In] char[]编组为In参数.