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

.NET 6 DLL注册COM对象后调用方法抛出类型库未注册异常求助

解决COM对象调用时“类型库未注册”的问题

问题根源

你遇到的0x80131165错误,本质是:虽然COM对象已注册到ROT且能被获取,但.NET生成的类型库(.tlb文件)未在系统中完成注册,导致调用方法时COM无法找到对应的类型元数据。

解决步骤

1. 导出并注册类型库

  • 先确保项目编译时生成类型库:
    若用Visual Studio,右键项目→属性→生成,勾选“为COM互操作注册”;或直接修改csproj文件添加配置:
    <PropertyGroup>
      <RegisterForComInterop>true</RegisterForComInterop>
    </PropertyGroup>
    
    重新编译后,会生成MyLibrary.tlb文件。
  • 以管理员权限打开命令提示符,执行注册命令:
    regtlibv12.exe .\MyLibrary.tlb
    

2. 确保COM对象的接口配置正确

在.NET类上明确标记COM可见的接口,避免类型信息映射错误:

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IMyClassName
{
    void MyMethod();
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("MyLibrary.MyClassName")]
public class MyClassName : IMyClassName
{
    public void MyMethod()
    {
        // 方法实现
    }
}

3. 验证注册状态

  • 打开注册表编辑器,定位到HKEY_CLASSES_ROOT\TypeLib\{你的类型库GUID},检查是否存在对应条目(类型库GUID可通过oleview.exe查看tlb文件获取)。
  • 用oleview.exe加载你的tlb文件,确认接口和类的信息能正常解析。

4. 绕过类型库的替代方案

若不想注册类型库,可改用强类型接口调用,避免后期绑定依赖类型库:

var comObj = Marshal.GetActiveObject("MyLibrary.MyClassName") as IMyClassName;
comObj.MyMethod();

前提是调用项目能引用到定义IMyClassName的程序集,或已将接口标记为COM可见并正确导入。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:42:11