如何在不破坏应用程序引用的情况下从部署项目重新定位程序集?

时间:2011-01-02 03:41:52

标签: c# deployment installer assemblies

我最近重构了很多我的应用程序现有代码,现在我正在考虑整理部署方面的事情。

现有的安装程序应用程序会安装应用程序文件夹中的所有内容(不包括位于子文件夹中的几个配置文件)。但是,我有多个应用程序都使用一些常见程序集,我的目标是将这些特定程序集重定位到程序文件目录中的“Common Files”文件夹。

注意:我已经阅读了很多关于GAC的内容,但我对此没有任何经验并且还阅读了一些恐怖故事,所以试图暂时找到一个简单的解决方案。

我设法将程序集安装到Common Files文件夹中,但结果是(典型的I.T。)我破坏了我的应用程序!如果我将程序集复制回应用程序文件夹,它可以正常工作,所以问题显然与我的应用程序引用程序集的方式有关。

要让安装程序将程序集安装到Common Files文件夹中,我刚刚更新了Folder列表中每个程序集的Detected Dependencies属性。我的想法是,当我这样做时,安装程​​序会以某种方式更新我的应用程序以告诉它在那个文件夹中查找它们但是看起来并非如此。

我到底错在了什么?

2 个答案:

答案 0 :(得分:1)

除非应用程序/库的开发人员如此设计,否则对GAC中的程序集不应有任何要求。您可以选择为您编写应用程序,以便从指定的(公共文件)位置加载大多数(如果不是全部)引用的程序集。

这是一个示例架构,它实现了此响应底部引用的MSDN文章中描述的技术。

示例:在SOA应用程序中,您可能有几种不同的(Windows)服务。可以跨多个服务器对服务进行负载平衡。在每个服务器中,服务可以安装在“服务”目录下。生活在“服务”目录中的服务可以共享来自(公共文件)“lib”目录的程序集:

\CompanyName
      \Services
           \Service1
           \Service2
           \Service3
      \lib

每个实际服务都将来自将使用Assembly Utility的Base Service类。您的Assembly Utility可以配置为以系统方式搜索程序集,允许您使用共享/公共程序集。巧妙的是,您的应用程序可以使用本地程序集运行(在本地开发中),但在部署时使用共享程序集。

在我的真实世界示例中,我有使用自定义构建和部署脚本的奢侈。考虑一下您可以部署N个服务中的一个的不同方案。你总是更新(公共文件)'lib'目录吗?服务是否可以使用不同于“lib”程序集的本地程序集运行?等

我希望这很有帮助。如果您的问题是让第三方安装程序正确部署您的应用程序,请忽略并命名安装程序。否则,给定的示例/解决方案应该有所帮助:o)

在MSDN上阅读主题:


PS:我遇到了为Microsoft Unity框架解决程序集的挑战。

答案 1 :(得分:0)

如果您希望从公共文件夹“引用”某些程序集,则可以在开发时进行。但是,部署每个应用程序时必须安装这些单独的程序集。

如果在运行时,您的多个应用程序共享某些程序集,那么“该公共文件夹”就是GAC。

相关问题