3

我有一个使用 COM 组件的 C# .net 2.0 windows 应用程序。当我添加对此 COM 库的引用时,Visual Studio 2005 会自动添加一个互操作程序集 DLL。

如果 COM 组件频繁升级,我需要做些什么来保持我的应用程序也升级?我是否需要升级互操作 DLL?为了跟上 COM 升级,我是否需要每次都重新构建和重新部署?

我不能 100% 理解这个互操作性问题,我只需要尽量减少每次 COM 升级的工作量。我需要避免每次都重建和重新部署。有什么最佳方法可以实现这一目标吗?

我一直在阅读 MSDN 中的 Advanced COM Interoperability ( http://msdn.microsoft.com/en-us/library/bd9cdfyx.aspx ),但仍然没有明确的答案。

提前致谢

4

3 回答 3

2

您不需要更新互操作 DLL,只要组件的 COM 接口不变。因此,这取决于对组件进行了何种更改。

发行说明将是明显的信息来源。如果做不到这一点,比较.tlb文件(如果它们与组件一起交付)可能是一种选择。

潜在地,该组件也可能支持多个接口版本,这样就无需立即更新您的应用程序。

于 2013-04-03T20:22:40.327 回答
2

并且找不到有问题的 COM 的任何 tlb 文件。

它通常嵌入在 COM 服务器 DLL 中。您可以使用 Visual Studio 看到的东西,文件 + 打开 + 文件并选择 DLL。您将看到一个 TYPELIB 节点,资源 1 是类型库。

您可以通过从 Visual Studio 命令提示符运行 Oleview.exe 来反编译类型库。文件 + 查看 Typelib 并选择 DLL。将右窗格的内容复制/粘贴到文本编辑器中并保存。如果此 IDL有任何更改,那么您必须重新构建导入库和您的程序。不这样做会导致很难诊断运行时问题,包括访问冲突异常和调用完全错误的方法。

这很难自动化,显然您会更喜欢供应商让您了解重大更改的更好方式。在这台服务器上工作的程序员应该很清楚这样做的必要性。

于 2013-04-03T22:02:35.073 回答
0

当我与一个可能会进行大量构建的组件进行 COM 互操作时,但 COM 组件并没有经常更改,那么我将使用 TLBIMP 来创建一个互操作,我只是引用我的互操作,我可以进行版本控制(尽管互操作版本可能需要 .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,您还可以将互操作嵌入到您的项目中。

于 2013-04-03T22:46:37.540 回答