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

注册COM失败:引用的Microsoft.VisualStudio.TestPlatform.ObjectModel未注册

问题描述

我有一个包含需暴露给COM的类的程序集,代码如下:

using Microsoft.VisualStudio.TestPlatform.ObjectModel;    

namespace Interop
{
    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface ITestCase 
    {
        TestCase TestCase { get; }  // this is where ObjectModel from VS comes into play
    }

    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    [ComDefaultInterface(typeof(ITestCase))]
    public class TestCaseWrapper : ITestCase
    {
        public TestCase TestCase { get; }
    }
}

该程序集是对Microsoft.VisualStudio.TestPlatform.ObjectModel.TestCase的包装,用于使其支持COM可见。我的项目已启用“Register for COM-interop”选项,但编译时出现如下错误:

The assembly 'Microsoft.VisualStudio.TestPlatform.ObjectModel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not registered for COM Interop. Please register it with regasm.exe /tlb. Interop

我使用的是.NET Framework 4.7.1,请问该如何解决这个问题?

解决方案

核心原因

错误的本质是:你的COM可见接口ITestCase直接暴露了来自第三方程序集(Microsoft.VisualStudio.TestPlatform.ObjectModel)的TestCase类型,而这个第三方程序集本身并没有注册为COM可见。COM要求所有在公共接口中暴露的类型都必须是COM兼容的——要么是原生COM类型,要么是已注册COM可见的.NET类型。

具体解决方法

方法1:修改接口,封装第三方类型(推荐)

不要在COM可见接口中直接返回TestCase对象,而是将TestCase的必要属性拆出来,通过包装类对外暴露:

using Microsoft.VisualStudio.TestPlatform.ObjectModel;    

namespace Interop
{
    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface ITestCase 
    {
        // 仅暴露COM实际需要的属性,而非整个TestCase实例
        string DisplayName { get; }
        string TestId { get; }
        // 根据业务需求添加其他必要属性
    }

    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    [ComDefaultInterface(typeof(ITestCase))]
    public class TestCaseWrapper : ITestCase
    {
        private readonly TestCase _innerTestCase;

        // 构造函数注入内部TestCase实例
        public TestCaseWrapper(TestCase testCase)
        {
            _innerTestCase = testCase;
        }

        public string DisplayName => _innerTestCase.DisplayName;
        public string TestId => _innerTestCase.Id.ToString();
        // 实现其他需要暴露的属性
    }
}

这种方法完全由你控制对外暴露的内容,不需要依赖第三方程序集的COM注册,是最稳定可靠的方案。

方法2:尝试注册第三方程序集(不推荐)

如果必须直接暴露TestCase类型,可以尝试用regasm.exe注册该程序集,但存在诸多限制:

  1. 找到对应版本的Microsoft.VisualStudio.TestPlatform.ObjectModel.dll路径(通常位于VS安装目录,比如C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TestWindow)
  2. 以管理员身份打开命令提示符,运行对应.NET 4.x版本的regasm.exe(路径一般为C:\Windows\Microsoft.NET\Framework\v4.0.30319):
regasm.exe "C:\Path\To\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll" /tlb /codebase

注意:该方案的弊端很明显:

  • 第三方程序集可能未标记ComVisible(true),注册后仍无法被COM正常访问
  • 依赖VS的安装路径,部署时兼容性差,不同机器路径可能不同
  • 后续VS版本更新可能导致程序集版本变化,引发运行时错误

方法3:临时屏蔽编译警告(仅调试用)

如果只是想绕过编译错误(不保证运行时正常),可以在项目文件(.csproj)中添加配置,禁止该特定警告:

<PropertyGroup>
  <NoWarn>$(NoWarn);RCW1005</NoWarn>
</PropertyGroup>

注意:这种方法只是隐藏错误,运行时COM调用TestCase属性时仍然会失败,仅适用于临时调试场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 01:53:17