32位Windows 10(.NET Framework 4.8环境)下.NET 5.0 COM DLL构建后注册失败的问题排查求助
32位Windows 10(.NET Framework 4.8环境)下.NET 5.0 COM DLL构建后注册失败的问题排查求助
我最近跟着MSDN上的COM Server示例,尝试将.NET Core组件暴露给COM调用,过程中遇到了注册失败的问题,想请社区的大佬们帮忙分析下问题所在:
已完成的操作
- 调整项目配置:把Server和Client项目的
.csproj文件中,原有的目标框架配置从<TargetFramework>net3.0</TargetFramework>修改为<TargetFramework>net5.0</TargetFramework> - 执行构建命令:在
C:\COMServerDemo目录下用管理员权限运行
构建过程无报错,应该是成功生成了相关文件。dotnet build build.proj
注册时遇到的错误
按照示例提供的COM注册说明(要求用管理员命令行执行),我尝试了多种注册命令:
- 指向输出目录的命令:
regsvr32.exe "C:\COMServerDemo\COMServer\bin\Debug\netcoreapp5.0\" regsvr32.exe /u "C:\COMServerDemo\COMServer\bin\Debug\netcoreapp5.0\" - 直接指定DLL文件的命令:
regsvr32.exe "C:\COMServerDemo\COMServer\bin\Debug\netcoreapp5.0\COMServer.dll" regsvr32.exe "C:\COMServerDemo\COMServer\bin\Debug\netcoreapp5.0\ref\COMServer.dll"
但无论用哪种命令,都会弹出错误提示:
module COMServer.dll is loaded, but Entry Point of DllRegisterServer cannot be found.
我对.NET 5+ COM相关变化的理解(可能有误)
根据我查的资料,.NET Core/.NET 5+在COM交互上有不少变化,但不确定这些是否和当前问题相关:
- 从Windows 8开始,类型信息不再存储于Type Library(.tlb),而是以元数据文件(.winmd)形式存在,所以传统的
regasm.exe可能不再适用? - 不再需要用
sn.exe给程序集做强命名签名 - 编译程序集时无需再指定
/clr选项 - .NET 2.0时代的
System.Reflection.Assembly加载、System.AppDomain相关API可能不再需要 Tlbexp.exe仅存在于.NET Framework,.NET Core中没有;Tlbimp.exe仍可用于将COM类型库转换为互操作程序集- 从C# 9和.NET 5开始,代码可以做简化,比如无需显式写
using System;、class Program、static void Main等 <EnableComHosting>True</EnableComHosting>这个项目属性是从.NET 8开始才需要配置在COM Server程序集里的?
我的运行环境
- 32位Windows 10 版本1607
- 已安装.NET Framework 4.8.03761
- 未使用Visual Studio,全程通过
dotnet/msbuild命令行工具构建项目
现在我完全摸不着头绪,不知道是目标框架选择错误、环境配置有问题,还是需要给代码或项目文件添加额外的属性?希望大家能给点思路,帮我理清.NET 5下构建并注册COM Server的正确流程,区分开旧.NET Framework和新.NET平台在COM交互上的差异,非常感谢!
内容来源于stack exchange




