我正在尝试在 C++/CLI 中围绕 .Net 库创建一个本机包装器,以便常规 C++ 代码可以使用它。对于此示例,假设这是我要包装的 C# 代码:
class Foo
{
public Bar GetBar() {...}
public string SomeProperty { get; set; }
}
class Bar
{
public void Baz() {...}
}
我基本上试图在 C++/CLI(dll 项目)中大致做到这一点:
class __declspec(dllexport) NativeFoo
{
public:
NativeBar GetBar();
std::string GetName();
void SetName(const std::string &value);
private:
Foo ^m_foo;
};
class __declspec(dllexport) NativeBar
{
friend class NativeFoo;
public:
void Baz();
private:
Bar(Bar ^bar);
Bar ^m_bar;
};
这样,一个 C++ 库可以链接到这个,使用 NativeFoo 就好像它是一个常规的 C++ 类一样。在内部,NativeFoo 将转换参数以将实现传递给 m_foo,将所有管理的内容编组回本地表示并将其返回给它的调用者......
但是,我遇到的问题是我不能拥有非托管类的托管成员:
error C3265: cannot declare a managed 'm_bar' in an unmanaged 'NativeFoo'
同样,我不能将 NativeFoo 标记为“ref”(本身就是一个托管类),因为这样我就不能导出它:
C3386: 'NativeFoo' : __declspec(dllexport)/__declspec(dllimport) cannot be applied to a managed type
在我的 C++ 对象中使用托管指针的正确方法是什么?