VB6实例化COM组件Person类时报错70权限被拒绝的问题咨询
错误根因分析
你定义的Person类继承了System.EnterpriseServices.ServicedComponent,该类属于COM+(企业服务)组件范畴,和普通.NET COM互操作类的实例化逻辑完全不同:
- 普通COM类实例化仅校验COM注册状态、程序架构匹配度
- COM+ ServicedComponent实例化会额外触发COM+服务的安全校验,未完成COM+注册和权限配置时,就会在
New实例化阶段抛出错误70权限被拒绝,你之前尝试的文件权限修改、管理员运行、关闭UAC等操作均不涉及COM+的安全校验逻辑,因此无效。
解决方案
方案1:不需要COM+相关功能(推荐,改造成本最低)
直接移除ServicedComponent继承关系,改为普通COM可见类即可,修改后的代码如下:
using System.Xml.Serialization; using System.IO; using System.Runtime.InteropServices; namespace COM { // 显式标记类COM可见 [ComVisible(true)] [ClassInterface(ClassInterfaceType.None)] public class Person : IPerson { public string FirstName { get; set; } public string LastName { get; set; } public bool IsMale { get; set; } public void Persist(string FilePath) { // 新增using语法自动释放文件资源,避免文件占用 using (StreamWriter oFile = new StreamWriter(FilePath)) { XmlSerializer oXmlSerializer = new XmlSerializer(typeof(Person)); oXmlSerializer.Serialize(oFile, this); } } // 注意:静态方法不会暴露到COM接口,VB端无法直接调用 static public Person Retrieve(string FilePath) { using (StreamReader oFile = new StreamReader(FilePath)) { XmlSerializer oXmlSerilizer = new XmlSerializer(typeof(Person)); return oXmlSerilizer.Deserialize(oFile) as Person; } } } // 必须同时标记IPerson接口COM可见 [ComVisible(true)] [Guid("替换为你原有IPerson接口的GUID,避免兼容性问题")] public interface IPerson { string FirstName { get; set; } string LastName { get; set; } bool IsMale { get; set; } void Persist(string FilePath); } }
修改完成后重新编译程序集,根据你的VB程序架构选择对应版本的regasm重新注册COM:
- 32位VB程序:使用32位regasm执行命令
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe 你的COM程序集路径.dll /tlb:生成的tlb路径.tlb /codebase - 64位VB程序:使用64位regasm执行命令
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe 你的COM程序集路径.dll /tlb:生成的tlb路径.tlb /codebase
方案2:必须保留ServicedComponent COM+功能
按照以下步骤完成COM+注册和权限配置:
- 给你的.NET程序集添加强名称签名(ServicedComponent要求必须强命名)
- 编译后使用.NET自带的regsvcs工具注册到COM+服务:
regsvcs.exe /appname:"自定义COM+应用名" 你的COM程序集路径.dll - 打开Windows组件服务(运行输入
dcomcnfg回车),依次展开「组件服务 > 计算机 > 我的电脑 > COM+应用程序」,找到你刚注册的自定义COM+应用,右键打开属性面板:- 切换到「安全」标签,勾选「强制访问检查级别」,下拉选择「应用程序进程级」
- 勾选「启用组件级别访问检查」
- 「激活权限」选择「自定义」,点击编辑按钮,添加你当前登录的Windows用户,授予完全控制权限
- 「访问权限」同样添加当前Windows用户,授予完全控制权限
- 保存配置后右键重启该COM+应用,再运行VB程序即可。
内容的提问来源于stack exchange,提问作者Donax
相关产品推荐
相关产品推荐

