我最近重构了很多应用程序的现有代码,现在我正在考虑整理部署方面的事情。
现有的安装程序应用程序安装应用程序文件夹中的所有内容(不包括位于子文件夹中的几个配置文件)。但是,我有多个应用程序都使用一些通用程序集,我的目标是将这些特定程序集重新定位到程序文件目录中的“Common Files” 文件夹。
注意:我已经阅读了很多关于 GAC 的内容但我没有这方面的经验,也看过一些恐怖故事,所以暂时尝试获得一个简单的解决方案。
我设法将程序集安装到 Common Files 文件夹中,但是,结果(典型的 I.T.)我破坏了我的应用程序!如果我将程序集复制回应用程序文件夹,它工作正常,所以问题显然与我的应用程序如何引用程序集有关。
为了让安装程序将程序集安装到 Common Files 文件夹中,我刚刚更新了 Detected Dependencies
列表中每个程序集的 Folder
属性。我的想法是,当我这样做时,安装程序会以某种方式更新我的应用程序以告诉它在该文件夹中查找它们,但情况似乎并非如此。
我到底做错了什么?
最佳答案
GAC 中不应该有程序集的要求,除非应用程序/库的开发人员如此设计。您可以选择编写您的应用程序,以便大多数(如果不是全部)引用的程序集从指定的(公共(public)文件)位置加载。
这是一个示例架构,它实现了本回复底部引用的 MSDN 文章中描述的技术。
示例:在 SOA 应用程序中,您可能有几个不同的 (Windows) 服务。服务可以在多个服务器之间进行负载平衡。在每个服务器中,服务可以安装在“服务”目录下。位于“服务”目录中的服务可以共享来自(公共(public)文件)“lib”目录的程序集:
\CompanyName \Services \Service1 \Service2 \Service3 \lib
每个实际服务都将派生自一个使用程序集实用程序的基础服务类。您的程序集实用程序可以配置为以系统的方式搜索程序集,从而允许您使用共享/公共(public)程序集。巧妙的是,您的应用程序可以使用本地程序集(在本地开发中)运行,但在部署时使用共享程序集。
在我的真实示例中,我有幸拥有自定义构建和部署脚本。想一想您可以部署 N 项服务中的一项的不同场景。你总是更新(公共(public)文件)'lib'目录吗?服务能否使用不同于“lib”程序集的本地程序集运行?等等
希望对您有所帮助。如果您的问题是让第三方安装程序正确部署您的应用程序,请忽略并命名安装程序。否则,给定的示例/解决方案应该有所帮助 :o)
阅读 MSDN 上的主题:
- Programming With Application Domains and Assemblies
- Resolving Assembly Loads
- ResolveEventHandler Delegate
PS:我在为 Microsoft 的 Unity 框架解决程序集时遇到了挑战。
关于c# - 如何在不破坏应用程序引用的情况下从部署项目中重新定位程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4577004/