如何以正确的方式处理c# - c++项目交互

本文关键字:c++ 项目 交互 处理 方式 | 更新日期: 2023-09-27 18:14:23

我真的需要更深入地了解如何正确地设置东西,以便在我的c++和c#代码库之间获得优雅的交互。我想要实现的是为我的游戏引擎(c++/DX)编写一个用c#编写的游戏内置编辑器。为此,我让VS将我的引擎构建为带有一些附加函数(非托管代码)的c++ dll,以便从c#编辑器代码库访问我的引擎所需的功能。到目前为止一切顺利。

让我烦恼的第一件事是我必须用CLR支持来构建dll。否则c#会因为某些原因而不接受dll。它甚至不允许我将其添加到资源中("无法添加对'C:'Users…'frame_work'Test'frame_work .dll'的引用")。请确保该文件是可访问的,并且它是有效的程序集或COM组件。")。

当我用CLR支持构建dll并将其添加到c#中的引用时,在没有CLR支持的情况下重新构建,启动我的编辑器并从dll中进行函数调用,然后我得到一个异常HRESULT: 0x8007007E。我搜索了它,但我发现的唯一一件事与依赖关系有关,但这并不适合我在将dll添加到资源时得到的警报。

另一点是,我总是必须在应用程序(.exe)和dll之间切换配置类型。这取决于我是想直接运行我的引擎还是从编辑器中运行,每次完整的项目都是全新的。

那么,有人能告诉我如何正确地组织这个吗?c#希望用CLR支持编译dll的可能原因是什么?

谢谢大家

如何以正确的方式处理c# - c++项目交互

有两种方法可以处理这个问题。

你可以让你的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项目的文件列表中。