如何以正确的方式处理c# - c++项目交互
How to handle C# - C++ project interaction the right way?
我真的需要更深入地了解如何正确地设置东西,以便在我的c++和c#代码库之间获得优雅的交互。我想要实现的是为我的游戏引擎(c++/DX)编写一个用c#编写的游戏内置编辑器。为此,我让VS将我的引擎构建为带有一些附加函数(非托管代码)的c++ dll,以便从c#编辑器代码库访问我的引擎所需的功能。到目前为止一切顺利。
让我烦恼的第一件事是我必须用CLR支持来构建dll。否则c#会因为某些原因而不接受dll。它甚至不允许我将其添加到资源中("无法添加对'C:Users…frame_workTestframe_work .dll'的引用")。请确保该文件是可访问的,并且它是有效的程序集或COM组件。")。
当我用CLR支持构建dll并将其添加到c#中的引用时,在没有CLR支持的情况下重新构建,启动我的编辑器并从dll中进行函数调用,然后我得到一个异常HRESULT: 0x8007007E。我搜索了它,但我发现的唯一一件事与依赖关系有关,但这并不适合我在将dll添加到资源时得到的警报。
另一点是,我总是必须在应用程序(.exe)和dll之间切换配置类型。这取决于我是想直接运行我的引擎还是从编辑器中运行,每次完整的项目都是全新的。
那么,有人能告诉我如何正确地组织这个吗?c#希望用CLR支持编译dll的可能原因是什么?
谢谢大家
有两种方法可以处理这个问题。
你可以让你的c++代码提供一个API,它有一个完全兼容的COM对象。如果对象是COM,那么c#可以直接与它交互。(这就是为什么你不能直接添加它作为引用)
然而,我认为你真正想做的是涉及到p/Invoke(从c#调用C/c++本地代码)。这是完全可能的,但并不总是那么容易。你需要处理c++ API和c#之间的转换,指针,你需要非常小心地在c#应用程序中固定任何c++代码写入的引用。
c#代码是托管代码(在CLR中运行),并且只能直接*引用托管程序集。因此,在当然中,当您针对托管程序集构建时,您会得到一个错误,然后潜入并用(不兼容的)非托管DLL替换该托管DLL。你基本上是在试图对编译器撒谎,而这通常不会有好结果。
如果你想让你的c++ DLL可以从c#中访问,最简单的方法是将它构建为托管程序集(即CLR支持)。而你已经在做了。只需将工作的托管DLL替换为非工作的非托管DLL。
也:
带有一些附加函数(非托管代码)的c++ dll,以便从c#编辑器
访问我的引擎所需的功能。
这对你没有帮助,因为c#不能直接*调用非托管代码。实现此功能的最简单方法是在c++ DLL中创建额外的托管类和方法。然后你的c#程序集将能够直接使用这些托管类。
*正如Spence所指出的,您可以使用-indirect- means (p/Invoke和COM)来访问c#中的非托管代码。但这将使您的生活比现在复杂得多,更不用说它会使您的构建和部署变得复杂。你已经非常接近应该工作的东西了——不要再增加额外的复杂性了
当使用p/Invoke调用函数时,您不会将DLL添加到c#项目资源(或者您可能指的是引用)。
当然,您将把它添加到MSI项目的文件列表中。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 欧拉项目#8答案是大以获得有效答案
- 从链接列表c++中删除一个项目
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 既然存在危险,为什么项目要使用-I include开关
- cmake在我的项目中所需的所有静态库都不成功
- QT通过C++添加映射QML项目
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在linux上调试巨大的C++项目
- 在其他文件中创建类时在 c++ 项目中不起作用
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 如何维护资源管理器项目视图中当前可见的项目列表
- 错误-我无法在VS2019中打开新的Qt项目
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗