注册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注册该程序集,但存在诸多限制:
- 找到对应版本的
Microsoft.VisualStudio.TestPlatform.ObjectModel.dll路径(通常位于VS安装目录,比如C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TestWindow) - 以管理员身份打开命令提示符,运行对应.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

