我有一个使用COM组件的C#.net 2.0 Windows应用程序。当我添加对此COM库的引用时,Visual Studio 2005会自动添加互操作程序集DLL。
如果经常升级COM组件,我还需要做些什么来保持我的应用程序升级呢?我是否需要升级互操作DLL?我是否每次都需要重建和重新部署才能跟上COM升级的步伐?
我不明白100%这个互操作性问题,我只需要最小化每次COM升级的工作。我每次都需要避免重建和重新部署。有没有最佳方法来实现这一目标?
我一直在MSDN中阅读高级COM互操作性(http://msdn.microsoft.com/en-us/library/bd9cdfyx.aspx),但仍然没有明确的答案。
提前致谢
答案 0 :(得分:2)
只要组件的COM接口没有更改,就不需要更新互操作DLL。因此,它取决于对组件进行了哪些更改。
发行说明将是明显的信息来源。如果不这样做,比较.tlb
个文件(如果它们与组件一起提供)可能是一个选项。
该组件可能也支持多个接口版本,这样就不必立即更新您的应用程序。
答案 1 :(得分:2)
并且无法找到有问题的COM的任何tlb文件。
它通常嵌入在COM服务器DLL中。您可以使用Visual Studio,File + Open + File查看并选择DLL。您将看到TYPELIB节点,资源1是类型库。
您可以通过从Visual Studio命令提示符运行Oleview.exe来反编译类型库。文件+查看Typelib并选择DLL。将右窗格的内容复制/粘贴到文本编辑器中并保存。如果此IDL中有任何更改,那么必须重建导入库和您的程序。不这样做会导致很难诊断包含访问冲突异常和调用完全错误方法的运行时问题。
这很难实现自动化,显然您更愿意让供应商更好地了解有关更改的信息。在这个服务器上工作的程序员应该很清楚这个需要。
答案 2 :(得分:0)
当我使用可能正在构建大量构建的组件进行COM互操作时,但COM组件并未经常更改,那么我将使用TLBIMP创建一个Interop,我只是引用我的互操作我可以进行版本控制(虽然版本的Interop可能需要.NET4)。
将以下所有内容作为批处理文件(单行)并使用相应的tlbimp。
"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools\tlbimp"
"C:\pathtocomdll\comcomponent.dll"
/out:"Interop.mycomponent.dll"
/asmversion:"1.1.0.0" /keyfile:"\\server\keyfiles\library.snk"
/company:"my company" /productversion:"1.1.0.0"
/copyright:"2013"
/product:"company product" /namespace:"company.namespace"
如果您使用的COM组件只是升级其版本但未更改其界面,则您不需要重建Interop。如果您使用的是.net4,您还可以在项目中嵌入互操作。