Visual studio 2013 COM引用和TFS生成定义

Visual studio 2013 COM引用和TFS生成定义,visual-studio-2013,com,msbuild,tfsbuild,Visual Studio 2013,Com,Msbuild,Tfsbuild,我有一个C#项目,其中有一个COM参考。它在VS 2013中打开时编译良好。但是,它作为TFS构建定义的一部分失败 TFS版本:2013 TFS生成控制器和代理:2013 VS版本:2013 失败消息表示找不到互操作dll。我无法手动创建互操作dll并签入TFS,因为它会不断变化,我希望我的C#project始终采用udpated COM引用 我试过这个建议,但没有解决我的问题。我甚至使用regsvr32手动注册了COM dll,但我仍然面临这个问题 非常感谢您的帮助 问候,, kvk1985测

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

TFS版本:2013 TFS生成控制器和代理:2013 VS版本:2013

失败消息表示找不到互操作dll。我无法手动创建互操作dll并签入TFS,因为它会不断变化,我希望我的C#project始终采用udpated COM引用

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

非常感谢您的帮助

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

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

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

当然,这是另一种方式,如果开发人员更新其机器上的组件,那么将与互操作程序集不匹配。这可能是一个非常丑陋的错误,如果COM供应商做得对,则是一个E_NOINTERFACE运行时错误,如果他没有做,则是一个非常糟糕的错误,如调用错误的方法、堆栈不平衡或AVE。否则,如果用户的机器没有安装正确版本的组件,可能会发生完全相同的故障。标准DLL地狱


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

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

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

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

当然,这是另一种方式,如果开发人员更新其机器上的组件,那么将与互操作程序集不匹配。这可能是一个非常丑陋的错误,如果COM供应商做得对,则是一个E_NOINTERFACE运行时错误,如果他没有做,则是一个非常糟糕的错误,如调用错误的方法、堆栈不平衡或AVE。否则,如果用户的机器没有安装正确版本的组件,可能会发生完全相同的故障。标准DLL地狱


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

作为一名构建工程师,我支持您的第二个解决方案(针对COM组件运行tlbimp)。但你是对的,这取决于具体情况。谢谢汉斯的回复。我在想一个办法。如果我错了,请纠正我。如何添加预构建事件,即使用tlbimp.exe将COM组件转换为互操作程序集的步骤。从技术上讲,这是可能的,但在开发机器和构建机器之间执行设置过程不是一个好主意。开发人员不会对此感到高兴,会毫无益处地让他们停滞不前,并且组件仍然需要存在于服务器上。作为构建工程师,我支持您的第二个解决方案(针对COM组件运行tlbimp)。但你是对的,这取决于具体情况。谢谢汉斯的回复。我在想一个办法。如果我错了,请纠正我。如何添加预构建事件,即使用tlbimp.exe将COM组件转换为互操作程序集的步骤。从技术上讲,这是可能的,但在开发机器和构建机器之间执行设置过程不是一个好主意。开发人员不会对此感到高兴,因为没有任何好处而使他们陷入困境,并且组件仍然需要存在于服务器上。