【发布时间】:2012-10-12 06:08:57
【问题描述】:
我正在开发一个 .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++ 库的所有者提出了关于错误消息是什么的问题)。
我基于this question's answer 采取的另一种方法是尝试传递一个 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);
不幸的是,这也不起作用。我得到与原始方法相同的错误代码。
【问题讨论】:
标签: c# c++ arrays struct unmanaged