【问题标题】:COM References and TFS build definitionCOM 参考和 TFS 构建定义
【发布时间】:2015-09-28 12:29:43
【问题描述】:

我有一个 C# 项目,其中有一个 COM 参考。它在 VS 2013 中打开时编译良好。但是,它作为 TFS 构建定义的一部分失败。

TFS 版本:2013 TFS 构建控制器和代理:2013 VS 版本:2013

失败消息表明它找不到 Interop dll。我无法手动创建 Interop dll 并签入 TFS,因为它会不断变化,我希望我的 C# 项目始终采用更新后的 COM 引用。

我尝试了COMFileReference 的建议,但它并没有解决我的问题。我什至使用 regsvr32 手动注册了 COM dll,但我仍然面临这个问题。

非常感谢任何帮助。

问候, kvk1985

【问题讨论】:

    标签: visual-studio-2013 com msbuild tfsbuild


    【解决方案1】:

    COM 引用是在测试代码时确保程序与实际安装的组件匹配的最安全方法。编译器将读取组件的类型库,这是一种非常相似的机制,用于正常的 .NET 程序集引用。除了类型定义来自类型库而不是 .NET 元数据。

    但是在您的情况下有一个缺点,它只能在组件实际安装在机器上时才能工作。那个构建服务器上可能没有发生这种情况。这很正常,维护构建服务器的人并不特别喜欢任何人弄乱它。这是一个令人头疼的维护问题,当开发人员用最新版本更新他们的机器但忘记更新构建服务器时,构建会中断。而且旧版本很难复制。

    所以在构建服务器上安装组件是快速修复。如果这是一个无法克服的障碍,那么有人需要在他们的机器上运行 Tlbimp.exe。这会生成互操作程序集,需要将其签入源代码控制。并且必须修改项目,删除COM引用并将引用添加到生成的互操作库。现在它将在构建服务器和开发机器上以相同的方式构建。

    另一方面,这当然很脆弱,如果开发人员更新了他机器上的组件,那么互操作程序集就会不匹配。这可能是一个非常丑陋的问题,如果 COM 供应商做得对,则会出现 E_NOINTERFACE 运行时错误,或者调用错误的方法,堆栈不平衡或 AVE (如果他没有这样做)会非常讨厌。否则,如果用户的机器没有安装正确版本的组件,可能会发生完全相同的故障。标准 DLL 地狱。

    你必须自己打电话,没有一个正确的答案。

    【讨论】:

    • 作为构建工程师,我支持您的第二种解决方案(针对 COM 组件运行 tlbimp)。但你是对的,这取决于具体情况。
    • 感谢汉斯的回复。我在想一种方法。如果我错了,请纠正我。在预构建事件中添加如何使用 tlbimp.exe 将 COM 组件转换为 Interop 程序集的步骤。
    • 这在技术上是可行的,但是在开发机器和构建机器之间进行设置过程并不是一个好主意。开发人员不会对此感到高兴,让他们陷入困境并没有任何好处,并且该组件仍然需要存在于服务器上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 2020-12-20
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    相关资源
    最近更新 更多