GAC和程序集版本控制

5
我需要部署几个程序集到GAC。我对GAC的理解有一些疑问,希望您能帮忙解答。
我想知道更改程序集和文件版本的哪些组合可以替换GAC dll,并了解GAC文件的基本管理。
以下是一个例子来更好地理解GAC:
假设我有产品A和B。
A和B都引用安装在GAC中的myfile.dll。 (i)程序集版本:[1.0.0.0] (ii)程序集文件版本:[2.0.0.0](故意不同以避免更多混淆)
  1. 假设我有一个修复了的bug应用在myfile.dll中。那么我应该改变哪个版本?

  2. 假设我有A的新版本,称为“ANEW”。那么哪个版本应该被更改,以便A、B和ANEW可以并存。

  3. 假设我已经安装了带有GAC文件的myfile.dll的'A',现在我尝试安装'B',它具有具有错误修复的gac dll。那么应该更改哪些版本,以便更改反映在'A'中。

  4. 与问题3相同,但不应该在'A'中反映出B的更改。

  5. 假设'A'已安装myfile(1.0.0.0)。现在假设'B'正在安装myfile(1.x.y.z).. GAC文件会被替换吗?

  6. 假设'A'已安装myfile(1.0.0.0)。现在假设'B'正在安装myfile(2.x.y.z).. GAC文件会被替换吗?

  7. 假设'A'已安装myfile(1.0.0.0)。现在假设'B'正在安装myfile(1.0.0.0),假设版本没有更改.. GAC文件会被替换吗?

  8. 此外,GAC dlls如何被删除。是否有任何删除标准?

我猜这些问题可能有点令人困惑,但希望你们知道我在问什么。
注:与此主题相关 net-assembly-dll-sharing-and-deploying
1个回答

4

1) 取决于您为修复错误所做的更改类型。如果您更改任何公共接口或对行为进行重大更改,我会提高程序集版本号。如果没有,您可以像Microsoft一样只对文件进行版本控制。

2) 程序集版本是GAC关心的全部内容。因此,如果您想让两个名称相同的程序集并排存在,它们必须通过程序集版本进行区分。

3) 我可能会更改程序集版本号,并包括发布者策略以将旧版本的客户端重定向到新版本。

4) 同3,但不包括发布者策略,或配置A来绕过它。

5)和6) 不,它是并排安装的。

7) 我认为不会,但这可能取决于它们在文件版本上是否有差异。我相信您可以尝试验证。

8) 有一些引用可能用于防止意外删除。MSI使用它,因此如果您使用MSI进行安装,则会跟踪对程序集的引用,并在卸载所有应用程序之前不会删除它。如果您手动执行(例如使用Gacutil /uf),则可能会搞砸事情。


1
谢谢您的回答。我还找到了这个链接:http://blogs.msdn.com/junfeng/archive/2004/02/14/72666.aspx“当我们看到程序集已经存在于全局程序集缓存中时,我们会尝试比较GAC中程序集的文件版本(称为“旧”程序集)和即将安装的程序集的文件版本(称为“新”程序集)。如果“新”程序集的文件版本低于“旧”程序集的文件版本,我们将拒绝安装“新”程序集,除非您要求Fusion强制安装(“gacutil -if”)。”。 - Amitd
1
经过这个答案和一些研究..我得到了答案,谢谢 :) [a]在GAC中进行并排安装时,始终更改程序集版本。 [b]进行错误修复时,始终更改程序集文件版本。 [c]如果程序集版本相同,则始终用较新的文件版本替换旧的文件版本。 [d]若要强制将新的文件版本与旧的文件版本(给定相同的程序集版本)进行替换,请在gacutil中使用force标志。 - Amitd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接