为什么 C# 代码不能与非托管 DirectX 一起使用
Why C# PInvoke can't work with unmanaged DirectX
我已经使用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是一条路要走——它可以帮助您在托管世界和本机世界之间建立某种桥梁。
相关文章:
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 如何在directx/c++中进行平移/缩放操作
- 将 std::allocate_shared 与多态资源分配器一起使用
- DrawIndexedInstanced 具有不同的 Index Count per Instance (Directx
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 将 exprtk 与自定义类的对象一起使用
- 将 std::set 与基于键的比较器一起使用
- 为什么 C# 代码不能与非托管 DirectX 一起使用
- DirectX 汽车与世界一起移动
- 将指定的字体与directx-11一起使用