You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET7迁移后调用D3D12CreateDevice触发Poco::NotFoundException求助

D3D12CreateDevice在.NET7 WPF互操作中的异常问题

背景

基于WPF(.NET7)的应用,通过C++代码创建D3D12资源并注入XAML对象实现互操作。从.NET48升级到.NET7后出现异常,仅修改了项目文件未改动代码。已重装RTX4090显卡驱动,问题未解决。该D3D12代码在其他WPF环境可正常运行,异常似乎未涉及互操作代码。

问题

  1. 如何解决该异常?
  2. 是否应认为.NET5+不适合此类互操作,考虑回退到.NET48?

详细信息

异常信息

Exception thrown at 0x00007FF8A6EECD29 in ShutterModeler.exe: Microsoft C++ exception: Poco::NotFoundException at memory location 0x0000006DE436E670.

相关代码(获取支持D3D12的硬件适配器)

// Helper function for acquiring the first available hardware adapter that supports Direct3D 12.
// If no such adapter can be found, *ppAdapter will be set to nullptr.
_Use_decl_annotations_
void DX12CudaSample::GetHardwareAdapter(IDXGIFactory2* pFactory, IDXGIAdapter1** ppAdapter)
{
    ComPtr<IDXGIAdapter1> adapter;
    *ppAdapter = nullptr;

    for (UINT adapterIndex = 0; DXGI_ERROR_NOT_FOUND != pFactory->EnumAdapters1(adapterIndex, &adapter); ++adapterIndex)
    {
        DXGI_ADAPTER_DESC1 desc;
        adapter->GetDesc1(&desc);
        bool isSoftwareGPU = desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE;
        if (isSoftwareGPU)
            continue;

        auto uuidDev = _uuidof(ID3D12Device);
        auto currentAdapter = adapter.Get();
        auto status = D3D12CreateDevice(currentAdapter, D3D_FEATURE_LEVEL_11_0, uuidDev, nullptr); //this line throws
        //if (SUCCEEDED(D3D12CreateDevice(adapter.Get(), D3D_FEATURE_LEVEL_11_0, _uuidof(ID3D12Device), nullptr)))
        if(SUCCEEDED(status))
            break;
    }

    *ppAdapter = adapter.Detach();
}

已识别到的适配器信息

正确识别到NVIDIA RTX 4090适配器:

desc    {Description=0x0000006de437c3b0 L"NVIDIA GeForce RTX 4090" VendorId=4318 DeviceId=9860 ...} DXGI_ADAPTER_DESC1

详细参数:

Description 0x0000006de437c3b0 L"NVIDIA GeForce RTX 4090"   wchar_t[128]
VendorId 4318   unsigned int
DeviceId    9860    unsigned int        
SubSysId    375066846   unsigned int
Revision    161 unsigned int
DedicatedVideoMemory    25329401856 unsigned __int64
DedicatedSystemMemory   0   unsigned __int64
SharedSystemMemory  68674734080 unsigned __int64
AdapterLuid {LowPart=14177306 HighPart=0 }  _LUID       
Flags   0   unsigned int

currentAdapter = 0x000002a4dcfd3f50

调用栈

KernelBase.dll!RaiseException() Unknown
MessageBus.dll!00007fffa447cb4d()   Unknown
MessageBus.dll!00007fffa427af4e()   Unknown
MessageBus.dll!00007fffa41fe097()   Unknown
MessageBus.dll!00007fffa4210919()   Unknown
MessageBus.dll!00007fffa420ac95()   Unknown
MessageBus.dll!00007fffa42085d0()   Unknown
MessageBus.dll!00007fffa420fe91()   Unknown
nvwgf2umx.dll!00007fff876e8da7()    Unknown
nvwgf2umx.dll!00007fff876ea202()    Unknown
nvwgf2umx.dll!00007fff876d9e64()    Unknown
nvwgf2umx.dll!00007fff878dc16b()    Unknown
nvwgf2umx.dll!00007fff87bb8a70()    Unknown
nvwgf2umx.dll!00007fff88c9725b()    Unknown
D3D12Core.dll!NDXGI::CUMDAdapter::OpenAdapter<0>(void)  Unknown
D3D12Core.dll!NDXGI::CUMDAdapter::CUMDAdapter(struct IDXCoreAdapterFactory *,struct IDXCoreAdapter *,struct _LUID)  Unknown
D3D12Core.dll!CCreateDeviceCache::LoadUMD(void) Unknown
D3D12Core.dll!CCreateDeviceCache::ResolveUMDAndVersion(class std::vector<struct SupportedVersion,class std::allocator<struct SupportedVersion> > &,class std::shared_ptr<class NDXGI::CUMDAdapter> &,unsigned __int64 *)    Unknown
D3D12Core.dll!D3D12CoreCreateDevice()   Unknown
D3D12Core.dll!D3D12ValidateAndCreateDevice()    Unknown
D3D12.dll!D3D12CreateDeviceImpl(struct IUnknown *,enum D3D_FEATURE_LEVEL,struct _GUID const &,void * *) Unknown
D3D12.dll!D3D12CreateDevice()   Unknown
D3D12CudaUpdate.dll!DX12CudaSample::GetHardwareAdapter(IDXGIFactory2 * pFactory, IDXGIAdapter1 * * ppAdapter) Line 56   C++

备注

使用的D3D12代码获取适配器逻辑与微软官方示例一致。

解决方案建议

针对异常的解决步骤

  1. 检查MessageBus.dll的依赖与加载问题
    从调用栈看,异常先从MessageBus.dll抛出,再进入NVIDIA驱动和D3D12核心库。Poco::NotFoundException通常表示找不到某个依赖资源或配置项,建议:
    • 对比.NET48环境,确认MessageBus.dll在.NET7环境下的依赖文件是否完整
    • 检查应用运行目录下是否存在MessageBus所需的配置文件、动态库等资源,排查是否因.NET升级导致路径或权限变化无法访问
  2. 调整D3D12设备创建逻辑
    • 尝试显式指定更高的D3D_FEATURE_LEVEL(比如D3D_FEATURE_LEVEL_12_0或D3D_FEATURE_LEVEL_12_1),RTX4090原生支持这些等级,可能绕过兼容性问题
    • 改用IDXGIFactory6枚举适配器,.NET7对应的Windows SDK版本可能支持更新的DXGI接口,避免旧接口与新运行时的冲突
    • 若为多线程环境,在调用D3D12CreateDevice前显式调用CoInitializeEx(NULL, COINIT_MULTITHREADED),确保线程COM环境初始化正确
  3. 排查.NET运行时的兼容性配置
    • 在项目文件中添加以下配置,强制应用使用特定Windows兼容性模式:
      <PropertyGroup>
        <WindowsTargetPlatformVersion>10.0.22621.0</WindowsTargetPlatformVersion>
        <UseWindowsForms>true</UseWindowsForms>
        <UseWPF>true</UseWPF>
      </PropertyGroup>
      
    • 临时禁用.NET的分层编译或其他优化选项,测试是否为优化导致的兼容性问题
  4. 验证驱动与系统组件
    • 尝试安装NVIDIA Studio驱动而非Game Ready驱动,专业场景下Studio驱动兼容性更稳定
    • 检查并安装最新Windows系统补丁和DirectX组件

是否回退到.NET48?

不需要直接回退,.NET5+对WPF互操作的支持是完善的,大量生产级应用已验证可行性。当前问题更可能是特定环境下的依赖、配置或接口兼容性问题,按上述步骤排查后大概率能解决。若需紧急恢复业务,可临时回退,但建议优先排查根本原因。


内容的提问来源于stack exchange,提问作者Soleil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:54:59