【问题标题】:How can I unit-test weakly named COM visible classes如何对弱命名的 COM 可见类进行单元测试
【发布时间】:2017-12-05 20:53:02
【问题描述】:

我在 C# 中有一个 COM 可见 类(标记为 [ComVisible(true)] 并在 RegAsm 中注册),我想对其进行单元测试。
我的程序集是一个未签名/弱命名的 dll(它必须保持这个)。我要测试的类有一个 COM 不可见的 私有成员。 我的问题是,当我想在测试中实例化此类时,它会失败并显示以下消息:

测试方法 %MyTestMethod% 抛出异常 System.EnterpriesServices.RegistreationException:程序集 %MyAssembly% 没有强名称。

那么如何在未签名/弱命名的 dll 上使用单元测试框架?

using System.EnterpriseServices;
using System.Runtime.InteropServices;

[ComVisible( true )]
public class MyComClass: ServicedComponent, IMyClass
{
    //SomeAttribute

    private MyNonComClass nonCom;

    public MyComClass( MyNonComClass _nonCom )
    {
        this.nonCom = _nonCom;
    }
}

【问题讨论】:

  • 单元测试不应该尝试注册 [ComVisible] 程序集,您没有留下任何痕迹来解释这是如何发生的。考虑 Project > Properties > Build 选项卡,“Register for COM interop”复选框。它不会反对未签名的程序集。但请注意,VS 必须提升运行。不将程序集部署到用户机器上的 GAC(需要强名称)是一个非常糟糕的主意。 COM 存在非常严重的 DLL Hell 问题,因为注册是机器范围的。
  • 很抱歉造成混淆。我修改了我原来的描述,希望它有一些提示。
  • ServicedComponent 的 MSDN 文档非常明确:“要将此类部署为已配置的 COM 组件,您必须生成强密钥”

标签: c# unit-testing com


【解决方案1】:

正如 Hans Passant 在我从继承中删除 ServicedComponent 类时所建议的那样,单元测试按预期运行。

【讨论】:

  • 不是任意的。进程内 COM 服务器和进程外服务器之间的区别是巨大的。如果您打算让它按设计运行在进程外,那么您实际上并没有按照它的使用方式对其进行测试。始终支持进程内设计。
猜你喜欢
  • 1970-01-01
  • 2011-10-16
  • 2011-09-17
  • 1970-01-01
  • 2016-11-07
  • 2011-08-22
  • 1970-01-01
  • 2011-12-19
  • 2014-10-08
相关资源
最近更新 更多