.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
相关产品推荐
相关产品推荐

