C++ cli 导出使用托管句柄的类? 我试图在C++/CLI中创建.NET库中的本地包装器,以便常规C++代码可以使用它。对于本例,假设这是我试图包装的C代码: class Foo { public Bar GetBar() {...} public string SomeProperty { get; set; } } class Bar { public void Baz() {...} }
我基本上是在C++/CLI dll项目中大致做到这一点:C++ cli 导出使用托管句柄的类? 我试图在C++/CLI中创建.NET库中的本地包装器,以便常规C++代码可以使用它。对于本例,假设这是我试图包装的C代码: class Foo { public Bar GetBar() {...} public string SomeProperty { get; set; } } class Bar { public void Baz() {...} },c++-cli,C++ Cli,我基本上是在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 {
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++库可以链接到这个,使用NATEVEFO,就像它是一个普通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++对象中使用托管指针的正确方法是什么?您需要使用GCROOT来声明非托管类型的托管句柄。对于任何非托管类型,无论是否为dllexported,都需要此选项
上面有一个很好的信息和一些样品
我相信你最终会得到这样的结果:
class __declspec(dllexport) NativeFoo
{
public:
NativeBar GetBar();
std::string GetName();
void SetName(const std::string &value);
private:
gcroot<Foo^> m_foo;
};
您需要使用gcroot在非托管类型上声明托管句柄。对于任何非托管类型,无论是否为dllexported,都需要此选项
上面有一个很好的信息和一些样品
我相信你最终会得到这样的结果:
class __declspec(dllexport) NativeFoo
{
public:
NativeBar GetBar();
std::string GetName();
void SetName(const std::string &value);
private:
gcroot<Foo^> m_foo;
};
您可以使用uu declspecdllexport而不是类导出托管函数。一般来说,你忽略了一个鸡和蛋的问题。必须有人加载CLR,这样托管代码才能执行。dllexport指令创建一个存根来处理这个问题。但这并不理想。您首先需要决定是创建一个容易调用本机代码的托管程序,还是创建一个难执行托管代码的本机程序。您可以使用_declspecdllexport而不是类导出托管函数。一般来说,你忽略了一个鸡和蛋的问题。必须有人加载CLR,这样托管代码才能执行。dllexport指令创建一个存根来处理这个问题。但这并不理想。您首先需要决定是创建一个容易调用本机代码的托管程序,还是创建一个难执行托管代码的本机程序。回答得好。我从gcroot开始,后来发现了autogcroot。i、 e.msclr::auto_gcroot m_foo;记住把这个和include一起使用。回答得好。我从gcroot开始,后来发现了autogcroot。i、 e.msclr::auto_gcroot m_foo;记住,将此与include一起使用。