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

32位C++原生COM客户端能否无注册表调用.NET 6跨进程COM服务?

问题概述

我们有一个使用Borland C++ Builder 5开发的老旧大型32位C++应用,已达内存上限,需要调用运行在另一进程中的C#模块。.NET 6支持.NET COM服务及客户端无注册表访问,但官方示例仅展示.NET客户端的进程内访问场景。微软文档《COM activation for .NET Core on Windows》提到“本文档中的COM激活目前仅限于进程内场景,跨进程COM激活场景已推迟”,未明确该跨进程无注册表的场景是否可行。

现有官方示例

  • 无注册表,但仅支持.NET客户端、进程内
  • 原生客户端/.NET服务、跨进程,但依赖注册表

核心需求

跨进程是硬性要求,无注册表对部署至关重要,希望通过客户端清单文件实现该功能。


跨进程实现说明

将AnyCPU目标的.NET DLL通过regsvr32注册后,32位原生应用可正常调用它。在64位Windows上,AnyCPU的.NET COM组件会以64位模式运行,系统会自动启动内置代理进程dllhost.exe,跨进程调用可自动实现。

无注册表配置问题

我们已有用于第三方OCX控件的无注册表COM清单,但添加.NET 7服务与客户端的无注册表示例条目后无法正常工作:

  1. 在原生客户端现有清单中添加依赖项:
<dependency>
  <dependentAssembly>
    <assemblyIdentity type="win32" name="DllServer.X" version="1.0.0.0" />
  </dependentAssembly>
</dependency>
  1. 将COM服务构建输出及DllServer.X.manifest复制到客户端输出目录,该清单内容为:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<assembly manifestVersion="1.0"
    xmlns="urn:schemas-microsoft-com:asm.v1">
    <assemblyIdentity type="win32" name="DllServer.X" version="1.0.0.0" />
    <file name="DllServer.comhost.dll">
        <comClass clsid="{af080472-f173-4d9d-8be7-435776617347}" threadingModel="Apartment" />
    </file>
</assembly>
  1. 运行时CoCreateInstance失败,HRESULT为0x80070057(E_INVALIDARG),但注册COM服务时客户端代码可正常运行。
  2. 若将依赖项替换为直接引用文件的标签:
<file name="DllServer.comhost.dll">
    <comClass clsid="{af080472-f173-4d9d-8be7-435776617347}" threadingModel="Apartment" />
</file>

则CoCreateInstance失败,错误为0x80040154(REGDB_E_CLASSNOTREG)。


基于微软跨进程示例修改后的失败情况

  1. 为DllServer项目添加<EnableRegFreeCom>True</EnableRegFreeCom>以启用无注册表COM;
  2. 编译后将输出复制到NativeClient输出目录;
  3. 创建NativeClient.manifest,内容为:
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <!-- <assemblyIdentity
    type="win32" 
    name="NativeClient"
    version="1.0.0.0" /> -->

  <dependency>
    <dependentAssembly>
      <assemblyIdentity
          type="win32"
          name="DllServer.X"
          version="1.0.0.0"/>
    </dependentAssembly>
  </dependency>
</assembly>
  1. 将NativeClient改为x86编译;
  2. 使用mt.exe将清单嵌入客户端EXE:
mt.exe -manifest NativeClient.manifest -outputresource:..\Debug\NativeClient.exe;1
  1. 运行客户端提示CoCreateInstance failure: 0x80040154,执行sxstrace trace -logfile:sxstrace.etl生成的日志中未出现NativeClient相关记录。

注:托管客户端通过项目引用清单文件可正常工作,但我们需要原生客户端实现该功能。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 02:53:13