You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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+注册和权限配置:

  1. 给你的.NET程序集添加强名称签名(ServicedComponent要求必须强命名)
  2. 编译后使用.NET自带的regsvcs工具注册到COM+服务:regsvcs.exe /appname:"自定义COM+应用名" 你的COM程序集路径.dll
  3. 打开Windows组件服务(运行输入dcomcnfg回车),依次展开「组件服务 > 计算机 > 我的电脑 > COM+应用程序」,找到你刚注册的自定义COM+应用,右键打开属性面板:
    • 切换到「安全」标签,勾选「强制访问检查级别」,下拉选择「应用程序进程级」
    • 勾选「启用组件级别访问检查」
    • 「激活权限」选择「自定义」,点击编辑按钮,添加你当前登录的Windows用户,授予完全控制权限
    • 「访问权限」同样添加当前Windows用户,授予完全控制权限
  4. 保存配置后右键重启该COM+应用,再运行VB程序即可。

内容的提问来源于stack exchange,提问作者Donax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:36:04