Leo*_*Leo 5 c++ clr managed-c++
我有一个非托管库暴露了一些接口.用户可以使用自定义实现实现接口并将其粘贴到库中.
我想为这个库提供一个托管包装器.使用托管接口包装非托管接口很容易.但在我的情况下,我想支持各种接口的用户实现,这意味着我需要采用接口的托管实现,并使用其非托管对应物将其包装,然后再将其发送到库的非托管部分的深度.
我尝试过类似的东西:
class UnmanagedWrapper {
DoSomething() {m_clr.DoSomething();}
IManaged^ m_clr;
}
Run Code Online (Sandbox Code Playgroud)
但编译器声称,我无法在非托管类中拥有托管成员.
我可以在这里做任何优雅的事吗?
以下是当一个库不受托管并且托管语言使用这些库时解决方法的一些相关信息。
此信息的上下文是在 Visual Studio 中使用 GoogleTest 的一种方法:
Visual C++ 用户的重要说明如果将测试放入库中,而 main() 函数位于不同的库或 .exe 文件中,则这些测试将不会运行。原因是 Visual C++ 中的一个错误。当您定义测试时,Google Test 会创建某些静态对象来注册它们。这些对象没有从其他地方引用,但它们的构造函数仍然应该运行。当 Visual C++ 链接器发现库中没有任何内容被其他地方引用时,它会抛出该库。您必须通过主程序中的测试来引用您的库,以防止链接器丢弃它。以下是具体操作方法。在库代码中的某处声明一个函数:
__declspec (dllexport) int PullInMyLibrary() { return 0; }如果将测试放在静态库(而不是 DLL)中,则 __declspec(dllexport) 是
不需要。现在,在主程序中编写调用该函数的代码:
Run Code Online (Sandbox Code Playgroud)int PullInMyLibrary(); static int dummy = PullInMyLibrary();这将使您的测试保持引用,并使它们在启动时自行注册。
此外,如果您在静态库中定义测试,请将 /OPT:NOREF 添加到主程序链接器选项中。如果您使用 MSVC++ IDE,请转到 .exe 项目属性/配置属性/链接器/优化,并将引用设置设置为保留未引用的数据 (/OPT:NOREF)。这将防止 Visual C++ 链接器丢弃最终可执行文件中测试生成的各个符号。
不过,还有一个陷阱。如果您使用 Google Test 作为静态库(这就是 gtest.vcproj 中的定义方式),您的测试也必须驻留在静态库中。如果必须将它们放在 DLL 中,则必须将 Google Test 更改为也构建到 DLL 中。否则,您的测试将无法正确运行或根本无法运行。这里的一般结论是:让你的生活更轻松 - 不要在库中编写测试!
| 归档时间: |
|
| 查看次数: |
575 次 |
| 最近记录: |