我正在根据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项目中的配置属性:
目的是“通过从win32停止代码来停止”,并使它与XAML Assets 接口(interface)。
您是否建议使用智能指针来替换
ComPtr
,还是建议以其他方式进行操作,例如,通过使用带有clr dll的interop构建纯c++ dll,在这种情况下,如何做? 最佳答案
WRL通常假定您将使用Windows Runtime,该Windows Runtime专门设计用于与C#和C++互操作,因此排除了Managed C++(/clr
))方案。
通过包含CComPtr
,您应该能够使用ATL的<atlbase.h>
,但是需要一些代码更改才能起作用。
operator&
中的CComPtr
断言在执行GetAddressOf
等效之前,指针始终为null。在ComPtr
中,使用operator&
显式调用等效于ReleaseAndGetAddressOf
的代码以释放任何现有的指针,以避免潜在的内存泄漏。 Get
,GetAddressOf
或ReleaseAndGetAddressOf
方法,因为CComPtr
使用老式的自动转换为原始指针problematic Reset
的CComPtr
方法,因此您必须将其设置为NULL
。 As
方法,因此您必须使用更加冗长的QueryInterface
解决方案。 您可能可以通过派生添加了缺少的方法的帮助程序版本来解决大多数这些问题,但这将需要一些工作...
struct MyComPtr : public ATL::CComPtr
关于c# - 将Directx12 Assets 移植到XAML元素中:有关WRL::ComPtr替换的建议?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49940563/