当C#中的字节数组传递给结构中的非托管代码时,会发生什么情况
What happens to a byte array in C# when passed to unmanaged code in a struct?
我正在开发一个.NET DLL来访问给定的C++库。在C++库中,有这样一个结构:
typedef struct FOO
{
DWORD DataSize;
BYTE *pData;
}
我在C#中重新创建了它,因此:
[StructLayout(LayoutKind.Sequential)]
public struct FOO
{
public uint DataSize;
public byte[] pData;
}
接下来是从C++DLL导入。我将包括来自C++方面的标题。C++中的方法将指针指向我正在传递的结构,因此根据我所能收集到的在中传递引用的信息,在这种情况下可以工作:
// C++ Header
HRESULT CallFoo(FOO * pFoo);
[DllImport("SomeLibrary.DLL", EntryPoint = "CallFoo")]
private static extern uint CallFoo(ref FOO rFoo);
当我进入C++端的代码时,我得到了结构,但pData中的值是内存地址。这似乎污染了C++库中的代码,但我无法理解它返回给我的HRESULT(我已经向C++库的所有者提出了一个问题,询问错误消息是什么)。
基于这个问题的答案,我采取的另一种方法是尝试传递IntPtr而不是字节数组。我修改了结构:
[StructLayout(LayoutKind.Sequential)]
public struct FOO
{
public uint DataSize;
public IntPtr pData;
}
并称之为
FOO fooParm = new Foo();
var ptr = IntPtr.Zero;
byte[] bArr = MethodThatReturnsAByteArray();
ptr = Marshal.AllocHGlobal(bArr.Length);
Marshal.Copy(bArr, 0, ptr, bArr.Length);
fooParm.pData = ptr;
fooParm.DataSize = bArr.Length;
uint i = CallFoo(fooParm);
不幸的是,这也不起作用。我得到了与原始方法相同的错误代码。
您的整个方法并不好。有一些关于托管结构/类布局的信息,但最好不要使用它。试着这样做:
[DllImport("SomeLibrary.DLL", EntryPoint = "CallFoo")]
private static extern uint CallFoo(uint DataSize, IntPtr pData);
你来回传递的参数越简单,结果就越好。
我面前没有C++库,所以我觉得很难准确回答这个问题,但听起来你得到了一个指针,而库对此有问题。是否可以使用Marshal::PtrToStructure
将byte[]
指针映射到适当的struct
?
这里有一个链接,指向我正在谈论的特定方法。接近底部的第二个代码示例(在C++中)可能适用:http://msdn.microsoft.com/en-US/library/4ca6d5z7.aspx
相关文章:
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 如何使用指针直接从托管代码中的非托管代码中读取矢量数据
- 异步接口托管 - > 非托管代码
- 从C++(非托管代码)检索数组到 C 尖锐形式(托管)
- 将C++非托管代码转换为 C#
- 将托管事件处理程序传递给 Linux 中的非托管代码
- 使用 P/Invoke 时存储非托管代码的数据
- Windows 服务导入C++非托管代码
- P/从获取"tried to access protected memory error"调用非托管C++代码
- 将数据从非托管代码传递到托管代码
- 从 VB.NET 调用非托管代码C++ dll
- 当C#中的字节数组传递给结构中的非托管代码时,会发生什么情况
- 在托管代码和非托管代码之间传递非托管结构的安全数组
- 如何调试C++非托管代码中的较低级别文件访问异常/崩溃
- 自定义Direct2D呈现托管代码和非托管代码之间的批封送处理
- winform中的C++非托管代码
- 如何减少 Visual Studio 非托管代码中的发布生成时间
- 让非托管 C++ 代码调用调用 C# 代码的托管 C++ 代码
- 需要从非托管c++代码中调用托管代码
- 当64位非托管代码通过COM调用托管代码时会发生什么