C++ 使用非托管接口包装托管
我有一个非托管库,它公开了一些接口。用户可以实现接口,并使用自定义实现将其粘贴到库中 我想为这个库提供一个托管包装器。 用托管接口包装非托管接口很容易。但在我的例子中,我希望支持各种接口的用户实现,这意味着我需要获取接口的托管实现,并在将其发送到库的非托管部分之前使用其非托管对应项对其进行包装 我试过这样的方法:C++ 使用非托管接口包装托管,c++,clr,managed-c++,C++,Clr,Managed C++,我有一个非托管库,它公开了一些接口。用户可以实现接口,并使用自定义实现将其粘贴到库中 我想为这个库提供一个托管包装器。 用托管接口包装非托管接口很容易。但在我的例子中,我希望支持各种接口的用户实现,这意味着我需要获取接口的托管实现,并在将其发送到库的非托管部分之前使用其非托管对应项对其进行包装 我试过这样的方法: class UnmanagedWrapper { DoSomething() {m_clr.DoSomething();} IManaged^ m_clr; } 但我不能在非托管类中
class UnmanagedWrapper {
DoSomething() {m_clr.DoSomething();}
IManaged^ m_clr;
}
但我不能在非托管类中拥有托管成员,编译器正确地宣称
我可以在这里做些什么吗?这里是一些相关信息,用于在一个库处于非托管状态且托管语言使用这些库时的解决方法 此信息的上下文是在Visual Studio中使用GoogleTest的一种方法: <> P> Visual C++用户如果把测试放进一个 库和main()函数位于不同的库或 .exe文件,这些测试将不会运行。原因是视觉上的一个缺陷 C++。当您定义测试时,GoogleTest会创建某些静态测试 对象来注册它们。这些对象不是从中引用的 其他地方,但他们的构造器仍然应该运行。什么时候 VisualC++链接器可以看到库中没有引用任何东西。 在其他地方,它把图书馆扔掉了。你必须参考你的 库中包含来自主程序的测试,以防止链接器 丢弃它。下面是如何做到这一点。在库代码中的某个地方 声明一个函数:
int PullInMyLibrary();
static int dummy = PullInMyLibrary();
\uu declspec(dllexport)int PullInMyLibrary(){return 0;}
如果将测试放在静态库(而不是DLL)中,那么u declspec(dllexport)是
不需要。现在,在主程序中,编写一个调用
该职能:
int PullInMyLibrary();
static int dummy = PullInMyLibrary();
这将
保持您的测试被引用,并使它们在
启动
此外,如果在静态库中定义测试,请添加
/OPT:NOREF到主程序链接器选项。如果使用MSVC++IDE,
转到.exe项目属性/配置
属性/链接器/优化和设置要保留的引用设置
未引用的数据(/OPT:NOREF)。这将保持VisualC++链接
从最终版本中丢弃测试生成的单个符号
可执行文件
不过,还有一个陷阱。如果您使用googletest作为静态
库(gtest.vcproj中就是这样定义的)您的测试必须
还驻留在静态库中。如果必须将它们保存在DLL中,
您必须更改Google测试以将其构建到DLL中。否则
您的测试将无法正确运行或根本无法运行。将军
这里的结论是:让你的生活更轻松——不要用英语写测试
图书馆
也许就是你想要的:
class UnmanagedWrapper {
DoSomething() {m_clr.DoSomething();}
gcroot<IManaged^> m_clr;
}
类非托管说唱程序{
DoSomething(){m_clr.DoSomething();}
gcroot m_clr;
}
没有足够的上下文。使用gcroot或Marshal::GetFunctionPointerForDelegate()。