使用Regasm注册COM库失败,始终提示access denied求助
问题描述
我正在测试一个需注册到COM的小型.NET DLL,供Delphi程序调用,采用COM交互方式。
源码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace MCMTSimulator { public class Simulator { public int RS232(sbyte[] data) { return 6; } } }
程序集设置
[assembly: ComVisible(true)] [assembly: ClassInterface(ClassInterfaceType.AutoDual)] // Le GUID suivant est pour l'ID de la typelib si ce projet est exposé à COM [assembly: Guid("b3f59863-c1a6-448b-aaa2-2bfdf292cc27")]
已通过管理员身份启动Visual Studio编译DLL,随后以管理员模式运行控制台执行注册命令:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe MCMTSimulator.dll /register /codebase /tlb
但始终提示 access denied,求解决办法。
解决方案
针对注册时的"access denied"问题,按以下步骤排查:
检查程序集强名称
.NET 4.0及以后版本中,/codebase参数要求程序集必须拥有强名称签名。如果你的DLL未签名,要么移除/codebase参数,要么给程序集添加强名称:- 在Visual Studio中右键项目 → 属性 → 签名 → 勾选"为程序集签名" → 选择"新建"密钥文件(无需密码)。
- 重新编译DLL后再执行注册命令。
选择匹配的regasm版本
如果是64位系统:- 若Delphi程序是32位,使用
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe(32位版本) - 若Delphi程序是64位,使用
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe(64位版本)
确保命令中regasm的路径和DLL的平台目标一致(项目属性 → 生成 → 平台目标)。
- 若Delphi程序是32位,使用
调整DLL存放路径
避免将DLL放在受系统严格权限控制的目录(如Program Files、Windows),将DLL移到普通目录(如C:\Temp)后再执行注册命令,减少权限拦截概率。使用Visual Studio开发者命令提示符(管理员)
启动"Visual Studio 开发者命令提示符(管理员)",直接进入DLL所在目录,执行简化命令:regasm MCMTSimulator.dll /register /codebase /tlb该提示符已自动配置.NET环境变量,无需手动输入regasm完整路径,同时确保权限上下文正确。
临时关闭安全软件
部分杀毒或防火墙软件会拦截注册表写入操作,临时关闭后重试注册,排除软件拦截因素。
内容的提问来源于stack exchange,提问作者michastro
相关产品推荐
相关产品推荐

