我正在将一个纯非托管 VC++ 9 项目包装在 C++/CLI 中,以便从 .NET 应用程序中简单地使用它。我知道怎么写wrappers https://stackoverflow.com/questions/15505992/can-you-use-c-libraries-natively-in-a-c-cli-winforms-application?rq=1,以及非托管代码可以从.NET执行 https://stackoverflow.com/questions/15487831/how-to-use-a-c-project-from-within-a-net-application,但我不能完全理解的是:
非托管库是一个非常复杂的 C++ 库,使用了大量内联和其他功能,因此我无法将其编译为/clr
- 标记的托管 DLL。我需要使用普通的 VC++ 编译器将其编译为单独的 DLL。
如何从该非托管代码中导出符号,以便可以在 C++/CLI 项目中使用它?我是否将我需要的每个课程标记为可见extern
?是这么简单还是还有更复杂的事情?
如何访问 C++/CLI 项目导出的符号?我是否只包含非托管的头文件源代码C++ 链接器会从非托管 DLL 中获取实际代码吗?或者我是否必须在指向 DLL 中的类的新头文件中手动编写一组单独的“外部”类?
当我的 C++/CLI 项目创建非托管类时,非托管代码会在正常的 VC9 运行时中完美运行还是会被迫在 .NET 中运行?导致更多兼容性问题?
C++ 项目创建了大量实例,并拥有自己的自定义实现的垃圾收集器,全部用纯 C++ 编写,它是一个 DirectX 声音渲染器并管理大量 DirectX 对象。所有这些都会正常工作吗?或者此类 Win32 功能会受到任何影响吗?
您可以从普通的本机 C++ 项目(例如,从十多年前的 Visual Studio 6.0 导入)开始,当您今天构建它时,它将链接到 VC 运行时的当前版本。
然后您可以添加一个新的foo.cpp
文件,但配置该文件,使其启用 /CLR 标志。这将导致编译器从该文件生成 IL,并链接一些额外的支持,导致 .NET 框架在启动时加载到进程中,因此它可以进行 JIT 编译,然后执行 IL。
应用程序的其余部分仍然像以前一样本地编译,并且完全不受影响。
事实上,即使是“纯粹的”CLR 应用程序实际上也是一个混合体,因为 CLR 本身(显然)是本机代码。混合 C++/CLI 应用程序只是通过允许您添加更多与某些 CLR 托管代码共享进程的本机代码来扩展此功能。它们在进程的整个生命周期中共存。
如果你做了一个标题foo.h
并附有声明:
void bar(int a, int b);
您可以在本机代码或foo.cpp
CLR 代码。编译器/链接器组合负责处理所有事情。应该不需要做anything特别适合从 CLR 代码中调用本机代码。
您可能会收到有关不兼容开关的编译错误:
-
/ZI
- 用于编辑和继续的程序数据库,将其更改为仅节目数据库
-
/Gm
- 你需要禁用最小重建
-
/EHsc
- C++异常,改为是,但有 SEH 例外 (/EHa)
-
/RTC
- 运行时检查,将其更改为Default
- 预编译头文件 - 将其更改为不使用预编译头
-
/GR-
- 运行时类型信息 - 将其更改为On (/GR)
所有这些更改只需要对特定的 /CLR 启用的文件进行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)