当前位置:  开发笔记 > 编程语言 > 正文

如何在C#中使用p/invoke将指针传递给数组?

如何解决《如何在C#中使用p/invoke将指针传递给数组?》经验,为你挑选了2个好方法。

示例C API签名:

void Func(unsigned char* bytes);

在C中,当我想将指针传递给数组时,我可以这样做:

unsigned char* bytes = new unsigned char[1000];
Func(bytes); // call

如何将上述API转换为P/Invoke,以便我可以将指针传递给C#字节数组?



1> asponge..:

传递字节数组的最简单方法是将import语句中的参数声明为字节数组.

[DllImport EntryPoint="func" CharSet=CharSet.Auto, SetLastError=true]
public extern static void Func(byte[]);

byte[] ar = new byte[1000];
Func(ar);

您还应该能够将参数声明为IntPtr并手动编组数据.

[DllImport EntryPoint="func" CharSet=CharSet.Auto, SetLastError=true]
public extern static void Func(IntPtr p);

byte[] ar = new byte[1000];
IntPtr p = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(byte)) * ar.Length);
Marshal.Copy(ar, 0, p, ar.Length);
Func(p);
Marshal.FreeHGlobal(p);



2> FlySwat..:

您可以使用不安全的代码:

unsafe 
{
     fixed(byte* pByte = byteArray)
     IntPtr intPtr = new IntPtr((void *) pByte);
     Func(intPtr);
}

如果您需要使用安全代码,可以使用一些技巧:

IntPtr intPtr = Marshal.AllocHGlobal(Marshal.SizeOf(byteArray));
Marshal.Copy(byteArray, 0, intPtr, Marshal.SizeOf(byteArray));

Func(intPtr);

Marshal.FreeHGlobal(intPtr);

但是,安全代码将会很慢恕我直言.

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有