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

.NET 5+ DLL注册为COM后在Delphi中调用报错的解决方法

解决.NET 8 COM组件被Delphi调用时"No such interface supported"错误

问题核心原因

.NET 8的COM托管机制(ComHost)与.NET Framework的Regasm存在关键差异:

  • 原.NET Framework中,InterfaceIsIUnknown类型的接口可通过Regasm自动适配OleVariant的IDispatch调用,但.NET 8的ComHost默认不会为IUnknown接口生成IDispatch包装层。
  • .NET 8不会自动生成「命名空间+类名」格式的ProgId,需显式指定才能与原Delphi调用代码兼容。

分步解决方案

1. 修改C#接口与类代码

调整接口的COM类型为InterfaceIsIDispatch(适配Delphi的OleVariant调用逻辑),并显式指定ProgId:

接口代码

[ComVisible(true)]
[Guid("1A3C6B1D-9420-45A4-BCD4-E7E31762D035")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IClassA
{
    string GetStr();
}

类代码

[ComVisible(true)]
[Guid("21487353-6AE0-403B-AA8D-57AE9725C9DB")]
[ProgId("ClassLib.ClassA")] // 与原.NET Framework项目的ProgId完全一致
[ClassInterface(ClassInterfaceType.None)]
public class ClassA : IClassA
{
    public string GetStr()
    {
        return "Message text";
    }
}

2. 完善.csproj配置

确保项目编译为x86架构,并启用COM托管相关配置:

<PropertyGroup>
  <TargetFramework>net8.0</TargetFramework>
  <EnableComHosting>true</EnableComHosting>
  <ComVisible>true</ComVisible>
  <PlatformTarget>x86</PlatformTarget>
</PropertyGroup>

3. 重新编译与注册

  • 以管理员权限打开命令提示符,切换到项目x86架构的编译输出目录(如bin\x86\Debug)。
  • 执行静默注册命令:
    regsvr32 /s ClassLib.comhost.dll
    
  • 验证注册表:打开regedit,确认HKEY_CLASSES_ROOT\ClassLib.ClassA存在,且对应的CLSID项中InprocServer32的默认值指向正确的ClassLib.comhost.dll完整路径。

4. 确认运行环境依赖

目标机器必须安装**.NET 8桌面运行时(x86版本)**,否则ComHost无法加载.NET 8组件。

验证调用

保持原Delphi代码不变,重新编译运行即可正常获取返回值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:43:18