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

.NET Core与C++ COM互操作报错:非有效Win32应用程序

.NET Core 与 C++ COM 互操作问题解决指南

问题概述

在将.NET Core库暴露给C++代码实现COM互操作时,遇到以下问题:

  • 用64位regsvr32注册comhost.dll,注册记录可见但提示「不是有效的Win32应用程序」
  • 创建COM对象实例时,同样弹出「不是有效的Win32应用程序」错误
  • 执行PowerShell命令$object = New-Object -ComObject GrpcLibrary.KioskProcessor时,报错无法创建COM对象,错误代码80131513(HRESULT 0x80131513),提示方法不存在

操作流程

  1. 自定义IDL文件声明所需接口
  2. 通过midl.exe生成对应的.tlb文件
  3. 尝试用64位regsvr32注册comhost.dll触发报错

环境信息

Mac M3 上运行的 Windows 11 ARM64 虚拟机

已尝试方案

在csproj文件的PropertyGroup中添加Arm64X配置,问题未解决

关联C#代码

[ComVisible(true)]
[Guid("9526a66b-200b-4157-aedc-56f084962031")]
[ProgId("GrpcLibrary.KioskProcessor")]
public class KioskProcessor : IKioskProcessor
{
    private readonly GrpcChannel channel;

    public KioskProcessor(string ipAddress = "http://localhost:50051")
    {
        channel = GrpcChannel.ForAddress(ipAddress);
        // 省略其他初始化代码
    }

    // 省略其他方法实现
}

针对性解决方案

1. 修复架构不匹配问题

Windows 11 ARM64环境下,必须保证所有组件架构统一:

  • 使用ARM64版本的regsvr32:路径为C:\Windows\System32\regsvr32.exe,避免使用SysWOW64目录下的32位版本
  • 修改.NET Core项目配置,明确指定ARM64架构:
    在csproj的PropertyGroup中添加:
    <PlatformTarget>ARM64</PlatformTarget>
    
    放弃Arm64X配置,因为混合架构可能导致COM注册时的兼容性冲突

2. 补充COM兼容的无参构造函数

COM规范要求对象必须提供无参构造函数,当前代码的构造函数带可选参数,本质仍属于带参构造,导致COM无法识别(错误80131513对应COR_E_MEMBERNOTFOUND)。添加无参构造函数:

public KioskProcessor() : this("http://localhost:50051")
{
    // 复用带参构造的逻辑
}

3. 校验IDL与.NET接口的一致性

确保IDL文件中声明的接口与C#的IKioskProcessor接口完全匹配,包括:

  • 方法名称、签名
  • 参数类型、顺序
  • 返回值类型
    不匹配的定义会导致.tlb文件与.NET实现脱节,引发实例创建失败

4. 使用.NET Core原生COM注册命令

替代regsvr32,使用dotnet命令完成注册,该命令会自动适配系统架构:

dotnet comhost register ./comhost.dll

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 05:12:43