代码之家  ›  专栏  ›  技术社区  ›  Padu Merloti

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

  •  1
  • Padu Merloti  · 技术社区  · 16 年前

    我正在创建一个管理的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 回复  |  直到 16 年前
        1
  •  2
  •   mcdave    16 年前

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

    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;
    }
    
    推荐文章