为什么 C# 代码不能与非托管 DirectX 一起使用

Why C# PInvoke can't work with unmanaged DirectX

本文关键字:DirectX 一起 代码 不能 为什么      更新时间:2023-10-16

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

这是不正确的。SharpDX是一个纯C#包装器,它通过在.NET程序集上进行IL字节码后处理来使用一些C++/CLI技术。有关更多详细信息,请参阅原始帖子。(在"如何避免在C#中使用C++/CLI"一节中)。为了在C#中实现C++接口回调,您还可以看看这篇文章。

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

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

PInvoke相当有限,适用于C样式API,如Windows API。有一组非常小的类型,可以进行封送处理
COM互操作也存在类似的限制。

DirectX API主要是C++。你不能在边界之间传递C++类——这很头疼。但是C++/CLI是一条路要走——它可以帮助您在托管世界和本机世界之间建立某种桥梁。