为什么 C# PInvoke 不能与非托管 DirectX 一起工作

Why C# PInvoke can't work with unmanaged DirectX

我使用 C# 已经一年了,我知道您可以通过 interop/PInvoke 从 C# 访问本机代码。 我刚开始学习 DirectX 并了解到将 DirectX 与 c# 结合使用的几种方法之一是使用像 SharpDX 这样的东西,它是用 c++ 而不是 C# 编写的包装器。 我的问题是;因为 C# 支持互操作性并允许程序员访问本机 dlls/com 对象。为什么这种支持在涉及 DirectX dlls/coms 时无效。我很困惑

PInvoke 相当有限,适用于 C 风格的 APIs,如 Windows API。 类型集非常少,可以编组。
COM 互操作存在类似的限制。

DirectX API主要是 C++ 的。您不能在边界之间传递 C++ class - 这很让人头疼。但 C++/CLI 是一种可行的方法 - 它可以帮助您在托管世界和本地世界之间建立某种桥梁。

这是不正确的。 SharpDX 是一个纯 C# 包装器,它通过 IL 字节码 post-processing 在 .NET 程序集上使用一些 C++/CLI 技术。见原文post for more details. (In the section "How to avoid the usage of C++/CLI in C#"). For implementing a C++ interface callbacks in C#, you can have also a look at this post.

即使没有 calli IL 字节码指令,也完全有可能使用非托管委托(通过 Marshal.GetFunctionPointerForDelegate)开发 COM 对象的完整包装器。您也可以在 C# 中使用常规 COM interop 来完成。

另一方面,如果 C++ 对象不提供 COM 接口(即只有纯虚拟方法),您将需要一个简化的 C++ 包装器访问它或处理 C++ 对象的导出重整名称(这是,afaik,未标准化)