部署EXE在多个应用程序之间共享的最佳方式

时间:2012-02-29 17:17:06

标签: .net deployment

我有应用程序A和B都使用共享组件S.如果S是DLL程序集,我只是将它的副本作为私有程序集放到每个应用程序中。但是S是EXE,A和B通过协议与它通信。当A和B运行时,它们必须与S的相同实例通信。可能的情况:

  1. 用户安装A和S与它一起安装,因为A依赖于S.后来用户安装B,但是S没有安装,因为它已经存在。
  2. 用户安装A和S一起安装。稍后,用户安装B,其中附带较新版本的S. S将替换为新版本。
  3. 安装A和B(和S)。用户卸载B,但保留S是因为A仍在那里。之后用户卸载A和S也被卸载,因为没有应用程序依赖它了。
  4. 新版本的S将与旧版本的A和B.兼容。如果协议发生变化,S将支持旧协议和新协议等。

    在这种情况下,最佳部署策略是什么?我正在使用Windows Installer(MSI)。将S作为具有单独MSI的单独应用程序并从其他MSI调用MSI似乎是好的,但也许有更好的方法。也许MSM?..我想保持简单安装。提前感谢您的回答。

1 个答案:

答案 0 :(得分:0)

MSI使用引用计数来处理您的确切方案。应为唯一项(位置和二进制)分配组件GUID,然后在MSI之间共享该组件GUID。如果您通过编译到两个MSI(A& B)中的公共片段使用WiX,则可以轻松完成此操作。然后当你安装A& B,无论顺序如何,S的引用计数都会增加,因此卸载一个不会删除exe,如果另一个也安装了它。

关键是确保两个MSI使用相同的组件GUID并将S安装到同一位置。

编辑 - 在从MSDN计算的组件引用中添加URL

http://msdn.microsoft.com/en-us/library/windows/desktop/aa368007(v=vs.85).aspx

请注意,该属性称为msidbComponentAttributesSharedDllRefCount,但它应该适用于我认为的场景。