c++下dll有一个接口,参数是BYTE*类型的,传入的一帧帧图像数据,本人在c#中用intptr类型接收后本人想转换成byte[]类型数组,查找资料发现可以使用marshal中copy函数,将intptr内容拷贝到byte[]中,可是假如本人不想使用这个copy函数,想像c++下一样直接用intptr指向的那块地址操作数据怎么办?
本人本人的思路是:
(1)在c#下将intptr参数改成byte[]去接收c++下的BYTE*指针,发现接收到的只是一个指针值,并不能转换成数组,也就是说本人不能对传进来的这个byte[]进行操作,不然直接报“受保护的内存被读写”这样的错误。
(2)在c#下还是用intptr去接收,然后使用topointer()方法,用void*data = intptr.Topointer();这样得到void*值,再转换成byte*,这样就可以像c++一样操作数据块,可是这段c#下操作指针又是不安全的,所以也放弃了。
跪求各位大大,问一下有什么方法可以直接操作c++转过来的指针数据,或是可以将intptr转换成byte[]数组的方法。
本人本人的思路是:
(1)在c#下将intptr参数改成byte[]去接收c++下的BYTE*指针,发现接收到的只是一个指针值,并不能转换成数组,也就是说本人不能对传进来的这个byte[]进行操作,不然直接报“受保护的内存被读写”这样的错误。
(2)在c#下还是用intptr去接收,然后使用topointer()方法,用void*data = intptr.Topointer();这样得到void*值,再转换成byte*,这样就可以像c++一样操作数据块,可是这段c#下操作指针又是不安全的,所以也放弃了。
跪求各位大大,问一下有什么方法可以直接操作c++转过来的指针数据,或是可以将intptr转换成byte[]数组的方法。
解决方案
5
虽然 unsafe 被翻译成 不安全的,但实际上是指被操作的内存不受 C# 的保护
但你的指针本来就是 C++ 传入的,你也不可能指望 C# 会去管理 C++ 的内存
假如你一定要 safe 的话,可以 Marshal.Copy 到 C# 中来。只是都用些内存而已
但你的指针本来就是 C++ 传入的,你也不可能指望 C# 会去管理 C++ 的内存
假如你一定要 safe 的话,可以 Marshal.Copy 到 C# 中来。只是都用些内存而已
5
用byte[]接收不也是复制了一次么。你new一个byte[],在内存中开辟了一块地给byte[],然后用这个byte[]来接收数据,不也是把数据从C++分配的A内存复制到byte[]的B内存区么。
想要不复制,又不用unsafe,你可以把这块代码用C++继续写下去。
想要不复制,又不用unsafe,你可以把这块代码用C++继续写下去。
5
C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源
byte[] 是 C# 的托管类型
两者不能直接沟通
在 C# 的 unsafe 下,你可以用指针直接去访问 C++ 的指针
但你要用 byte[] 的话,就要有 Marshal.Copy
从别人口袋里拿,是不保险的
放在本人口袋里,就安心了
byte[] 是 C# 的托管类型
两者不能直接沟通
在 C# 的 unsafe 下,你可以用指针直接去访问 C++ 的指针
但你要用 byte[] 的话,就要有 Marshal.Copy
从别人口袋里拿,是不保险的
放在本人口袋里,就安心了
5
谁告诉你不提倡了?.net库本身就大量unsafe,微软官方给的很多示例代码也都是unsafe的,用unsafe就是为了提高性能或与C交互能够更加简单,题主真是强迫症