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

能否通过COM暴露引用类型?C# DLL供C++调用问题

关于COM中C#引用类型参数的调用问题

好问题!其实COM对引用类型的支持是分场景的,咱们把你遇到的情况拆解清楚:

1. 值类型的ref参数:正常映射,完全可用

你测试的void Test2(ref float num);在tlh里变成HRESULT Test2 ( float * num );是COM的正常行为。COM的类型系统里没有.NET那种ref语义,对于值类型的引用参数,会自动映射为C的指针类型。这种情况完全可以正常工作——C里传float变量的地址进去,C#方法修改后的值会同步回C++端,没有问题。

2. 自定义类引用参数:需要适配COM的接口规则

COM是基于接口的组件模型,不直接支持.NET的“自定义类引用”传递,但我们可以通过显式COM接口来实现类似效果,核心要点如下:

  • 你的自定义C#类必须标记[ComVisible(true)],并且实现一个同样标记为ComVisible的接口(推荐用显式接口,避免自动生成的类接口带来的兼容性问题)
  • 方法参数不能直接用自定义类类型,而是要用它实现的COM接口类型;如果是ref修饰的自定义类,在COM里会映射为接口指针的指针(IMyInterface**)

举个实际的代码例子:

C#端代码

// 定义COM可见的接口
[ComVisible(true)]
public interface IMyData
{
    int Number { get; set; }
}

// 实现接口的自定义类
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)] // 禁用自动生成类接口,强制用显式接口
public class MyData : IMyData
{
    public int Number { get; set; }
}

// 你的COM服务接口
[ComVisible(true)]
public interface IMyComService
{
    void UpdateData(ref IMyData data);
}

// COM服务实现类
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class MyComService : IMyComService
{
    public void UpdateData(ref IMyData data)
    {
        if (data == null)
        {
            // 可以在方法内创建实例返回给C++端
            data = new MyData();
        }
        data.Number += 50;
    }
}

生成的tlh中的方法签名

HRESULT UpdateData ( /*[in,out]*/ IMyData ** data );

C++端调用示例

IMyComService* pService = nullptr;
IMyData* pData = nullptr;

// 初始化COM环境
CoInitialize(nullptr);
// 创建COM实例(假设已经注册了C# DLL)
CoCreateInstance(CLSID_MyComService, nullptr, CLSCTX_ALL, IID_IMyComService, (void**)&pService);

// 调用方法,传入接口指针的地址
pService->UpdateData(&pData);
// 此时pData指向的对象已经被修改,可以访问属性
printf("Updated Number: %d\n", pData->Number);

// 记得释放COM对象
pData->Release();
pService->Release();
CoUninitialize();

总结一下

你之前的误解是把“值类型ref的指针映射”和“自定义类引用的处理”混在了一起:

  • 值类型的ref参数在COM里会转为指针,完全可以正常工作
  • 自定义类引用需要通过COM接口来传递,本质是接口指针的指针,只要遵循COM的接口规则,就能实现类似.NET引用传递的效果,并不是COM不支持引用类型,而是需要适配它的组件模型规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:51:26