使用C#调用DirectX DLL(C++)

6
我有一个使用DirectX的本地C++ DLL,我想通过C#使用它来创建内容创作工具。
添加COM似乎需要相当大的努力。能否使用P/Invoke来维护使用多态的类,或者是否需要包装大部分代码以便使用P/Invoke?
是否有更好的解决方案可用?或者我应该考虑使用Qt在C++中编写工具?
3个回答

2
我始终认为在进行C#到C++互操作时,C++/CLI总是最佳选择。您可以轻松创建未管理库的薄封装器,这将完全像托管库一样对待您的C#代码。它还可以让您更好地控制如何执行封送和固定操作。
我相信有自动生成C++/CLI的方法,但我从未使用过。
有关C++/CLI的更多信息,请参见此处: http://msdn.microsoft.com/en-us/magazine/cc163681.aspx

这两个答案都看起来是有效的选项,但我选择了这种方法,所以我将其标记为答案。 - Daniel Dimovski

1

我猜直接从C#使用D3D进行渲染不是一个选项吗?(因为那肯定会更容易!)

很久以前,我使用SWIG自动维护我的C++渲染DLL代码的C#“绑定”。它使用P/Invoke在C#端暴露C++对象,您将不再需要维护该代码。


不,C#中的D3D对我不是一个选项。那么SWIG会同时创建C++包装器和C#代码来使用封装后的函数/类吗? - Daniel Dimovski
SWIG可以用于创建和维护C#包装器,以便公开您的C++对象。您只需要编写一个单独的接口定义文件(其中可以包括您的原始C++头文件),以描述如何将对象/函数公开给C#。SWIG处理大部分棘手的细节(P/Invoke、参数封送等)。查看他们的教程页面,您很快就会理解它的作用。它确实增加了结果系统的复杂性(并且是要学习的另一个工具!),但如果您没有选择,它肯定比手动编写包装器要好得多... - Benoit Miller

0

你不需要在QT上编写包装。

我建议你在C#和C ++中编写Observer类,并将Native函数的调用隐藏到其中。架构如下:

你的C#代码 -> Observer(C#) -> 调用Observer(C++) -> 调用你的dll。


从来没有说过我需要包装QT..Observer类相对于仅使用C# -> C++/CLI ->本机DLL的优势是什么? - Daniel Dimovski
@Daniel,也许我没有理解你关于QT的建议。 观察者模式并不是更好的选择,而是为你提供了一种替代方案。 你可以自行选择使用哪种语言编写调用层。 - zabulus
QT对我的问题并不相关,只是在没有非平凡的方法实现C#/C ++互操作性时,我打算使用它。关于观察者模式,如果您认为它不是更好的解决方案,为什么会建议它作为替代方案呢? - Daniel Dimovski
它之所以更好,是因为你不需要学习C++/CLI语言,即使只是为了这个小案例。 在我看来,使用C#进行调用层,使用C++进行实现。第三种语言是不必要的。 C++/CLI只是另一种.NET语言,但具有C++的语法,所以,为什么不使用C#进行调用呢? - zabulus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接