从非托管结构获取数据到托管结构的一种方法是为接受对非托管结构的引用的托管结构声明一个构造函数,如下所示:
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;
}