C# 如何在不中断应用程序引用的情况下重新定位部署项目中的程序集?

C# 如何在不中断应用程序引用的情况下重新定位部署项目中的程序集?,c#,deployment,installation,assemblies,C#,Deployment,Installation,Assemblies,我最近重构了很多应用程序的现有代码,现在我正在考虑整理部署方面的工作 现有安装程序应用程序安装应用程序文件夹中的所有内容(不包括位于子文件夹中的两个配置文件)。但是,我有多个应用程序,它们都使用一些公共程序集,我的目标是将这些特定程序集重新定位到program Files目录中的“common Files”文件夹中 NB:我已经读了很多关于这个问题的书,但是我没有这方面的经验,也读了一些恐怖故事,所以我试图暂时得到一个简单的解决方案 我设法将程序集安装到Common Files文件夹中,但结果(

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

现有安装程序应用程序安装应用程序文件夹中的所有内容(不包括位于子文件夹中的两个配置文件)。但是,我有多个应用程序,它们都使用一些公共程序集,我的目标是将这些特定程序集重新定位到program Files目录中的“common Files”文件夹中

NB:我已经读了很多关于这个问题的书,但是我没有这方面的经验,也读了一些恐怖故事,所以我试图暂时得到一个简单的解决方案

我设法将程序集安装到Common Files文件夹中,但结果(典型的I.T.)我破坏了我的应用程序!如果我将程序集复制回应用程序文件夹中,效果会很好,因此问题显然与我的应用程序引用程序集的方式有关

为了让安装程序将程序集安装到Common Files文件夹中,我刚刚更新了
检测到的依赖项
列表中每个程序集的
文件夹
属性。我当时的想法是,安装程序会以某种方式更新我的应用程序,让它在该文件夹中查找它们,但事实并非如此

我到底做错了什么?

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


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

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

下面是一个示例体系结构,它实现了本响应底部引用的MSDN文章中描述的技术

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

\CompanyName \Services \Service1 \Service2 \Service3 \lib \公司名称 \服务 \服务1 \服务2 \服务3 \解放党 每个实际的服务都将派生自一个基本服务类,该类将使用汇编实用程序。您的程序集实用程序可以配置为以系统方式搜索程序集,从而允许您使用共享/公共程序集。最妙的是,应用程序可以使用本地程序集(在本地开发中)运行,但在部署时使用共享程序集

在我的真实示例中,我有幸拥有定制的构建和部署脚本。考虑一下部署N个服务中的1个可以有哪些不同的场景。您是否总是更新(公共文件)“lib”目录?服务能否使用不同于“lib”程序集的本地程序集运行?等等

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

阅读MSDN上的主题:



PS:我在为Microsoft的Unity framework解析程序集时遇到了一些难题。

是的,他们将在运行时共享程序集,这是否意味着必须由GAC来完成?GAC就是这样做的地方。但是我遇到了这篇文章。看看它是否对你有帮助。有趣的文章。它与ASP.NET特别相关,但是,我会看看它如何运行,然后再给您回复。感谢NTFS连接点确实也是一个巧妙的技巧!与asp.net无关。+1谢谢Omar。这肯定会帮到我。那么你暗示要引入一个自定义域并覆盖AppDomain.Load/Assemby.Load方法吗?我不确定你使用“custom”的程度有多松散,但你的托管代码应该在同一个域下运行。我这样做的方式是拥有一个组装解析实用程序,我认为它可能是一个工厂。应用程序域(MSDN)--