为什么C#PInvoke可以';无法使用非托管DirectX

为什么C#PInvoke可以';无法使用非托管DirectX,c#,c++,interop,directx,com-interop,C#,C++,Interop,Directx,Com Interop,我已经使用C#一年了,我知道您可以通过interop/PInvoke从C#访问本机代码。 我刚刚开始学习DirectX,并了解到使用DirectX和C语言的一些方法之一是使用SharpDX之类的东西,它是用C++编写的包装器,而不是C语言。 我的问题是,;因为C#支持互操作性并允许程序员访问本机DLL/com对象。为什么当涉及DirectX DLL/COM时,此支持无效。我很困惑PInvoke相当有限,并且适用于C风格的API,比如Windows API。 可以封送的类型集非常小。 COM互操作

我已经使用C#一年了,我知道您可以通过interop/PInvoke从C#访问本机代码。 我刚刚开始学习DirectX,并了解到使用DirectX和C语言的一些方法之一是使用SharpDX之类的东西,它是用C++编写的包装器,而不是C语言。
我的问题是,;因为C#支持互操作性并允许程序员访问本机DLL/com对象。为什么当涉及DirectX DLL/COM时,此支持无效。我很困惑

PInvoke相当有限,并且适用于C风格的API,比如Windows API。 可以封送的类型集非常小。
COM互操作也存在类似的限制


DirectX API主要是C++的API。你不能在边界之间传递C++类,这是一个头痛的问题。但是C++/CLI是一种方法,它可以帮助您在托管世界和本地世界之间建立某种桥梁。

这是不正确的。SharpDX是一个纯C#包装器,通过.NET程序集上的IL字节码后处理使用一些C++/CLI技术。有关更多详细信息,请参阅原件。(在“如何避免在C#中使用C++/CLI”一节中)。为了在C++中实现C++接口回调,您也可以查看一下。 即使没有
calli
IL字节码指令,也完全可以使用非托管委托(通过
Marshal.GetFunctionPointerForDelegate
)开发COM对象的完整包装器。你也可以用C#中的正则表达式


P>另一方面,如果C++对象不提供COM接口(即仅纯的虚拟方法),则需要对其进行简化的C++包装访问,或者处理C++对象的导出修饰名称(即,AFIK,不标准化)

谢谢,这非常有启发性。我想学习C#而不学习CLR/IL,类似于学习ASP.Net然后假设他/她知道web是如何工作的。我只是惊讶于有这么多的C#程序员(主要是在游戏开发论坛上)声称除了通过slimDX或SharpDX之外,没有办法将DirectX与C#一起使用