【问题标题】:What happens to a byte array in C# when passed to unmanaged code in a struct?将 C# 中的字节数组传递给结构中的非托管代码时会发生什么情况?
【发布时间】: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


    【解决方案1】:

    你的整个方法都不好。关于托管结构/类的布局有一些信息,但最好不要使用它。尝试这样做:

    [DllImport("SomeLibrary.DLL", EntryPoint = "CallFoo")]
    private static extern uint CallFoo(uint DataSize, IntPtr pData);
    

    来回传递的参数越简单,结果就越好。

    【讨论】:

    • 我不想使用这些自定义结构,但不幸的是,我无法控制该库。我已经为它编写了一个托管的 C++ 包装器,我可能可以在调用库之前处理翻译,我也会看看这种方法。
    【解决方案2】:

    我面前没有 C++ 库,所以我觉得很难准确地回答这个问题,但听起来你得到了一个指针,而库对此有问题。是否可以使用Marshal::PtrToStructurebyte[] 指针映射到正确的struct

    这是我正在谈论的特定方法的链接。靠近底部的第二个代码示例(在 C++ 中)可能适用:http://msdn.microsoft.com/en-US/library/4ca6d5z7.aspx

    【讨论】:

    • 今晚下班后我会仔细看看这个。我尝试过但没有提及的另一种方法是将整个结构作为 IntPtr 传递,也许我需要再次访问该方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多