如何通过ref将托管数组传递给非托管库?

时间:2010-07-01 02:52:20

标签: .net c++-cli marshalling

我正在创建一个托管的C ++ / CLI DLL,它包装并提供驻留在c ++静态库中的单个函数。

除了一个持久的唠叨点之外,我得到了大部分工作。

这是我的非托管lib的.h文件中的函数。

typedef struct 
{
    float a;
    float b;
}MyStruct;

bool GetData(float p1, float* p2, MyStruct buffer[]);

这是我到目前为止在C ++ / CLI包装器上的内容:

H档:

using namespace System::Runtime::InteropServices

public ref struct MyManagedStruct
{
    float a;
    float b;
}

public ref class Wrapper
{
    bool static GetDataManaged(
      float p1, [Out] float %p2, 
      array<MyManagedStruct^> ^ managedBuffer);
}

CPP文件:

bool Wrapper::GetDataManaged(
    float p1, [Out] float %p2,
    array<MyManagedStruct^> ^ managedBuffer)
{
    float f;

            //managed buffer is assumed allocated by the .net caller
    MyStruct* unmanagedBuffer = new MyStruct[managedBuffer->Length];

    bool retval = GetData(p1, &f, unmanagedBuffer);

            /* this doesn't work... any better suggestions?
    for (int i=0;i<n;i++)
        BallDatabuffer[i] = buffer[i];
            */

    p2 = f;

    return retval;
}

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您可以从非托管结构获取数据到托管结构的一种方法是为托管结构声明一个构造函数,该结构接受对非托管结构的引用,如下所示:

public ref struct MyManagedStruct
{
    float a;
    float b;

internal:
    MyManagedStruct(const MyStruct &s)
    {
        a = s.a;
        b = s.b;
    }
};

注意internal:可见性,因为构造函数接受非托管结构,因此您不希望它在C ++ / CLI DLL外部可见。

声明了这个构造函数,然后你可以写:

bool Wrapper::GetDataManaged(
    float p1, [Out] float %p2,
    array<MyManagedStruct^> ^ managedBuffer)
{
    float f;

    //managed buffer is assumed allocated by the .net caller
    MyStruct* unmanagedBuffer = new MyStruct[managedBuffer->Length];
    int n = managedBuffer->Length;

    bool retval = GetData(p1, &f, unmanagedBuffer);

    for (int i=0;i<n;i++)
        managedBuffer[i] = gcnew MyManagedStruct(unmanagedBuffer[i]);

    p2 = f;

    return retval;
}