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

如何将C++创建的DirectX12 COM对象转换为Silk.NET可用的C#类型

C++侧实现

首先你需要在C++项目中编写导出函数,将创建好的IDXGIFactory5原生指针对外暴露,注意手动增加COM引用计数避免指针提前释放:

#include <dxgi1_5.h>
#include <wrl.h>
using namespace Microsoft::WRL;

// 导出C风格函数避免C++名字修饰
extern "C" __declspec(dllexport) IDXGIFactory5* CreateDxgiFactory5()
{
    ComPtr<IDXGIFactory5> factory;
    if (FAILED(CreateDXGIFactory2(0, IID_PPV_ARGS(&factory))))
    {
        return nullptr;
    }
    // 手动增加引用计数,传递给C#侧后由C#侧负责释放
    factory->AddRef();
    return factory.Get();
}

将上述代码编译为DLL后供C#项目调用。


C#侧转换实现

首先导入C++ DLL的导出函数,再通过Silk.NET提供的COM编组方法将原生指针转换为对应接口类型:

using Silk.NET.Core.Native;
using Silk.NET.DXGI;
using System.Runtime.InteropServices;

// 导入C++导出函数,替换为实际的DLL文件名
[DllImport("你的C++DLL文件名.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr CreateDxgiFactory5();

// 转换逻辑
public static IDXGIFactory5* GetDxgiFactoryFromCpp()
{
    IntPtr nativePtr = CreateDxgiFactory5();
    if (nativePtr == IntPtr.Zero)
    {
        throw new System.InvalidOperationException("IDXGIFactory5创建失败");
    }
    // 转换为Silk.NET对应的COM接口类型,ownsHandle设为true表示由Silk负责释放引用
    return (IDXGIFactory5*)SilkMarshal.CreateWrapperFor<IDXGIFactory5>(nativePtr, ownsHandle: true);
}

注意事项

  • 转换逻辑可复用在所有Silk.NET封装的COM接口上,不仅限于IDXGIFactory5
  • 使用完接口后需要调用Dispose方法释放,或使用using语法自动释放,避免内存泄漏
  • 如果需要在C++侧保留接口所有权,可将ownsHandle设为false,自行管理COM引用计数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:36:01