.Net Assembly / dll共享和部署

时间:2009-12-14 12:40:56

标签: .net deployment installation gac compatibility

我们有3个软件产品使用相同的.net dll(代码+传统) 所有这些都使用3/4 dll上的常用功能。

我想知道如何以及在何处部署这些dll 这是最标准的做法。

S1]与其安装目录中的每个产品一起 - 可能是最简单的方法。 (但如果在共享dll中发生任何更新,则必须对所有3个dll进行更新。)

S2]把它放在公共文件夹中?

S3]系统GAC是否对此有所帮助?
(将所有3个放在GAC中并且代码是共享的。但我担心版本控制?)

此外,如何为此类项目构建可部署的设置:

D1]将所有dll打包在一个setup.each设置中有自己的副本 但是假设有人安装软件A,那么对于软件B,共享文件已经存在于系统中。

D2]在单独的设置中部署公共文件,并使用each.try打包以检测文件是否已存在,如果是,则不进行部署。(这仍然无法帮助设置大小)
常用文件夹 - 它应该是GAC还是系统上的某个文件夹? 涉及复杂的设置,因为它需要检查不同共享文件的版本。

还假设是否要发布更新版本的软件并且必须与旧版本共存。
如何在多个版本中保持兼容性?

5 个答案:

答案 0 :(得分:2)

S1 + D1 肯定。关于“如果有任何更新......”:这是一个好处而不是问题。如果更改装配,则必须重建使用项目。 S1场景允许您逐个项目地执行,没有不必要的依赖关系。

不要将GAC用于小型库,这很麻烦。

答案 1 :(得分:1)

如果您的版本计划周密,那么将dll放入GAC是一个不错的选择。与此相反,如果您要添加任何小功能然后发布您的产品,那么GAC根本不具备可扩展性,因为您必须对所有产品进行并行发布,我认为这是不可能的。此外,GAC用于存储具有使用这些dll的所有产品的共同功能的dll。因此,您必须确保为所有产品提供的功能。对于每个产品添加不同的功能以及在GAC中存储dll,这都是不可取的。为此,您必须非常准确地了解您的版本系统和版本。

答案 2 :(得分:0)

将所有内容放入应用程序文件夹中。只有在您真正拥有大量要共享的代码时才会加入GAC,并且不会一直更新。

答案 3 :(得分:0)

我会去“S1”+“D1”,或“S1”+ ClickOnce;它实现了简单的部署和版本控制,并与ClickOnce部署,xcopy部署,MSI部署,Web等兼容.GAC不适合IMO。重新更新;好吧,你会想要单独测试/发布它们,不是吗?我在我的构建服务器上配置了级联构建,所以如果我更新库dll,它会涓涓细流并重建使用该dll的所有内容,然后向上(在任何人说:是的,它会检测并消除周期)。

“公共文件夹”方法存在dll解析问题,因此它本身就是一个真正的PITA。

GAC方法可行,但需要付出很多不必要的努力,而且保存一些重复的dll非常痛苦。如果您需要部署到非管理员,那也很痛苦。

答案 4 :(得分:0)

GAC是您希望代码确保每个版本只有一个副本的位置。不要担心使用GAC进行版本控制,因为它会为您处理存储多个版本的库。

但是一般情况下,除非要使用很多库,否则我会倾向于同意Ngu的答案并将它们放在你的应用程序文件夹中。这将使部署更容易。