【问题标题】:Using DirectX DLL (C++) from C#从 C# 使用 DirectX DLL (C++)
【发布时间】:2011-01-16 04:19:52
【问题描述】:

我有一个使用 DirectX 的本机 C++ DLL,我希望能够通过 C# 使用它来创建内容创建工具。

添加 COM 似乎需要相当大的努力。 是否可以使用 P/Invoke 来维护使用多态性的类,还是需要我封装大部分代码以方便使用 P/Invoke?

有更好的解决方案吗?或者我是否应该考虑使用 Qt 用 C++ 编写工具?

【问题讨论】:

    标签: c# c++ com directx pinvoke


    【解决方案1】:

    在进行 C# 到 C++ 互操作时,我一直认为 C++/CLI 始终是最佳选择。您可以轻松地为非托管库创建瘦包装器,该包装器在 C# 代码中看起来与托管库完全一样。它还使您可以更好地控制封送和固定的执行方式。

    我相信有一些方法可以自动生成 C++/CLI,但我从未使用过。

    更多关于 C++/CLI 的信息在这里: http://msdn.microsoft.com/en-us/magazine/cc163681.aspx

    【讨论】:

    • 两个答案似乎都是有效的选项,但我采用了这种方法,所以我将这个标记为答案..
    【解决方案2】:

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

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

    【讨论】:

    • 不,C# 中的 D3D 不适合我。那么 SWIG 创建 C++ 包装器和 C# 代码以使用包装的函数/类?
    • SWIG 可用于创建和维护公开 C++ 对象所需的 C# 包装器。您只需编写一个单独的接口定义文件(其中可以包含您的原始 C++ 头文件)来描述对象/函数如何暴露给 C#。 SWIG 处理大部分棘手的细节(P/Invoke、参数编组等)。查看他们的教程页面,您将很快“了解”它的功能。它确实增加了最终系统的复杂性(而且它是一种学习工具!),但如果你别无选择,它肯定比手工编码包装要好......
    【解决方案3】:

    你不需要在 QT 上写 wrap。

    我建议你用 C# 和 C++ 编写 Observer 类,并隐藏对它的 Native 函数调用。 架构是这样的

    您在 C# 中的代码 -> Observer(C#) -> 对 Observer(C++) 的本机调用 -> 对您的 dll 的调用。

    【讨论】:

    • 从来没有说过我需要包装 QT.. 而 Observer 类比仅使用:C# -> C++/CLI -> Native DLL 有什么优势?
    • @Daniel 也许我不明白你对 QT 的建议。观察者不是更好,他是你的替代品。您可以选择编写调用层的语言。
    • QT 与我的问题无关,如果没有实现 C#/C++ 互操作性的重要方法,这只是我意图的一个旁注。关于 Observer,如果您认为它不是更好的解决方案,为什么还要建议它作为替代方案?
    • 这样更好,因为你不需要学习 C++/CLI 语言,即使只是为了这个小案例。在我看来,C# 用于调用层,C++ 用于实现。第三个不需要。 C++/CLI 只是另一种 .NET 语言,但语法是 C++,所以,为什么不使用 C# 来调用呢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多