程序集名称和版本

在组装和发布时,什么被认为是最佳实践?

我希望能够引用同一个库的多个版本 – 解决方案包含多个依赖于我们自己构建的commonutils.dll库的不同版本的项目。

由于所有依赖项都被复制到bin / debug或bin / release,尽管每个DLL文件具有不同的程序集版本号,但只存在commonutils.dll的单个副本。

我应该在程序集名称中包含版本号,以便能够引用库的多个版本,还是有另一种方式?

这是我一直生活的 –

这取决于您计划使用DLL文件的内容。 我将它们分为两大类:

  1. 死胡同大会。 这些是您实际上不打算从任何地方引用的EXE文件和DLL文件。 只是虚弱地命名这些并确保您在源代码控制中标记了您发布的版本号,这样您就可以随时回滚。

  2. 参考assembly。 这些名称很强,因此您可以使用其他程序集引用的多个版本。 使用全名引用它们(Assembly.Load)。 在其他代码可以引用它的地方保留最新版本的副本。

接下来,您可以选择是否复制本地参考。 基本上,权衡归结为 – 您是否希望从您的参考文献中获取补丁/升级? 从获得新function可以获得积极的价值,但另一方面,可能会有突破性的变化。 我认为,这里的决定应该根据具体情况进行。

在Visual Studio中进行开发时,默认情况下您将使用最新版本进行编译 ,但一旦编译,引用程序集将需要使用它编译的特定版本。

您最后的决定是复制本地还是不复制。 基本上,如果您已经有一个机制来部署引用的程序集,请将其设置为false。

如果您正在计划一个大型的发布管理系统,那么您可能需要对此进行更多的思考和关注。 对我来说(小店 – 两个人),这很好。 我们知道发生了什么,并且不会因为无法以无意义的方式做事而受到限制。

一旦到达运行时,就可以将Assembly.Load添加到应用程序域中 。 然后,您可以使用Assembly.GetType来达到所需的类型。 如果您的类型存在于多个已加载的程序集中(例如,在同一项目的多个版本中),则可能会出现AmbiguousMatchExceptionexception。 为了解决这个问题,您需要从程序集变量的实例中获取类型,而不是静态的Assembly.GetType方法。

程序集可以在GAC(全局程序集缓存)中共存,即使它们具有相同的名称,因为版本不同。 这就是.NET Framework发布的程序集的工作原理。 必须满足的要求才能使assembly能够进行GAC注册。

将版本号添加到程序集的名称只会破坏程序集生态系统的整个目的,并且是笨重的恕我直言。 要知道给定程序集的哪个版本,我只需打开“属性”窗口并检查版本。

给不同的汇编版本赋予不同的名称是最简单的方法,并且肯定有效。

如果您的程序集(commonutils.dll)具有强名称(即已签名),您可以考虑将其安装在GAC中(全局程序集缓存 – 您可以在GAC中并排安装相同程序集的不同版本),因此,调用应用程序自动从那里获取正确的版本,因为.NET类型包含程序集版本信息。

在VS项目中,您引用了库的正确版本,但未将其部署在应用程序文件夹中; 您将其安装在GAC中(在应用程序设置期间)。