在托管库之间共享非托管结构最好(简单而不会增加很多开销)是什么?
假设我有一个托管类库,如下所示:
// MyClassLib.h
#pragma once
#include "MyLegacyStruct.h"
using namespace System;
namespace MyClassLib {
public ref class Class1
{
protected:
MyLegacyStruct* m_internalBuffer;
public:
Class1() { }
~Class1() { }
MyLegacyStruct* GetBuffer()
{
return m_internalBuffer;
}
};
}
...结构定义(在库中):
// MyLegacyStruct.h
#pragma once
namespace MyClassLib {
typedef struct MyLegacyStruct
{
unsigned int m_someVar;
} MyLegacyStruct;
}
...以及一个想要使用该库的简单控制台应用程序:
// ConsoleApp.cpp : main project file.
#include "stdafx.h"
#include "MyLegacyStruct.h"
using namespace System;
using namespace MyClassLib;
int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Hello World");
Class1^ c1 = gcnew Class1();
MyLegacyStruct* s1 = c1->GetBuffer(); // <-- This is a problem
return 0;
}
...这使编译器发牢骚:
2>.\ConsoleApp.cpp(14) : error C3767: 'MyClassLib::Class1::GetBuffer': candidate function(s) not accessible
内部缓冲区用于一些相当繁重的处理算法,然后将这些算法与 .net 代码粘合在一起,使其一切都变得漂亮和模块化,并挂接到 C# gui 以及一些命令行重新处理工具中。
这样做的正确方法是什么?返回一个void *
?制作一个.net ref struct,使用它复制模块之间的所有数据,然后再转换回来?