我真的需要更深入地了解如何正确设置我的C++和C#代码库之间的优雅交互.我想要实现的是用我的游戏引擎(C++/DX)用C#编写的游戏内编辑器.为此,我让VS将我的引擎构建为带有一些附加功能(非托管代码)的C++ DLL,以便从C#编辑器代码库中访问我引擎所需的功能.到现在为止还挺好.
第一件让我烦恼的事情就是我要用CLR支持构建dll.否则C#由于某种原因不接受dll.它甚至不允许我将它添加到资源("无法添加对'C:\ Users ...\frame_work\Test\frame_workd.dll'的引用.请确保该文件可访问,并且它是一个有效的程序集或COM组件.").
当我建立与CLR支持该DLL并将其添加到在C#中,重新编译引用不CLR的支持,开始我的编辑,并从DLL中的函数调用,然后我得到一个异常HRESULT:0x8007007E.我搜索了它,但我发现的唯一的东西与依赖关系有关,但不适合我在将资源添加到资源时得到的警报.
另一点是我总是要在应用程序(.exe)和dll之间切换配置类型.在VS C++中,取决于我是想直接运行我的引擎还是从编辑器运行,每次完整的项目都是全新的.
那么,有人可以向我解释如何以正确的方式组织这个吗?那么C#希望用CLR支持编译dll的可能原因是什么?
谢谢你们/女孩们.
有两种方法可以解决这个问题。
要么让你的 C++ 代码提供一个具有完全兼容的 COM 对象的 API。如果对象是 COM,则 C# 可以直接与其进行互操作。(这就是为什么你不能直接添加它作为参考)
不过,我认为您真正想做的将涉及 P/Invoke(从 C# 调用 C/C++ 本机代码)。这是完全可能的,但并不总是那么容易。您需要处理 C++ API 和 C# 指针之间的转换,并且需要非常小心地将 C++ 代码写入 C# 应用程序中的任何引用固定下来。