You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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调用,过程中遇到了注册失败的问题,想请社区的大佬们帮忙分析下问题所在:

已完成的操作

  1. 调整项目配置:把Server和Client项目的.csproj文件中,原有的目标框架配置从<TargetFramework>net3.0</TargetFramework>修改为<TargetFramework>net5.0</TargetFramework>
  2. 执行构建命令:在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 Programstatic 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

火山引擎 最新活动