我正在根据DirectX12 Win32桌面示例D3D11Image创建WPF Assets (例如D3D12PipelineStateCache),因此可以将其作为 XAML元素嵌入到WPF应用程序中。

Microsoft Directx12示例正在广泛使用ComPtr(using Microsoft::WRL::ComPtr;#include <wrl.h>),智能指针,但是由于以下原因,构建失败:

// Don't allow to compile sources with /clr
#ifdef _MANAGED
#error WRL cannot be compiled with /clr option enabled
#endif

再现:我开始更改D3D12PipelineStateCache项目中的配置属性:
  • 配置类型:动态库
  • clr支持:/ clr
  • .net目标:v4.5

  • 目的是“通过从win32停止代码来停止”,并使它与XAML Assets 接口(interface)。

    您是否建议使用智能指针来替换ComPtr,还是建议以其他方式进行操作,例如,通过使用带有clr dll的interop构建纯c++ dll,在这种情况下,如何做?

    最佳答案

    WRL通常假定您将使用Windows Runtime,该Windows Runtime专门设计用于与C#和C++互操作,因此排除了Managed C++(/clr))方案。

    通过包含CComPtr,您应该能够使用ATL的<atlbase.h>,但是需要一些代码更改才能起作用。

  • 请记住,较旧的ATL operator&中的CComPtr断言在执行GetAddressOf等效之前,指针始终为null。在ComPtr中,使用operator&显式调用等效于ReleaseAndGetAddressOf的代码以释放任何现有的指针,以避免潜在的内存泄漏。
  • 没有GetGetAddressOfReleaseAndGetAddressOf方法,因为CComPtr使用老式的自动转换为原始指针problematic
  • 没有清除ResetCComPtr方法,因此您必须将其设置为NULL
  • 没有As方法,因此您必须使用更加冗长的QueryInterface解决方案。

  • 您可能可以通过派生添加了缺少的方法的帮助程序版本来解决大多数这些问题,但这将需要一些工作...
    struct MyComPtr : public ATL::CComPtr
    

    关于c# - 将Directx12 Assets 移植到XAML元素中:有关WRL::ComPtr替换的建议?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49940563/

    10-09 06:11