3

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

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

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

我应该在程序集名称中包含版本号以便能够引用库的多个版本还是有其他方法?

4

3 回答 3

3

鉴于版本不同,即使它们具有相同的名称,程序集也可以在 GAC(全局程序集缓存)中共存。这就是 .NET Framework 提供的程序集的工作方式。为了使程序集能够被 GAC 注册,必须满足的要求将被签署。

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

于 2008-09-18T15:19:48.157 回答
1

这就是我一直以来的生活——

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

  1. 死胡同组件。这些是您真正不打算从任何地方引用的 EXE 文件和 DLL 文件。只需轻轻地命名这些,并确保您在源代码控制中标记了您发布的版本号,以便您可以随时回滚。

  2. 引用的程序集。强命名这些,以便您可以让其他程序集引用它的多个版本。使用全名来引用它们 (Assembly.Load)。在其他代码可以引用它的地方保留一份最新和最好版本的副本。

接下来,您可以选择是否复制本地引用。基本上,权衡归结为——你想从你的参考资料中获取补丁/升级吗?获得新功能可能会带来积极的价值,但另一方面,也可能会发生重大变化。我认为,这里的决定应该根据具体情况做出。

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

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

如果您正在计划一个大型的发布管理系统,您可能需要为此付出更多的思考和关注。对我(小店——两个人)来说,这很好用。我们知道发生了什么,并且不会因为不得不以没有意义的方式做事而感到拘束。

到达运行时后,您将 Assembly.Load 任何您想要的内容放入应用程序域。然后,您可以使用 Assembly.GetType 来达到您想要的类型。如果您的类型存在于多个加载的程序集中(例如在同一项目的多个版本中),您可能会收到AmbiguousMatchException异常。为了解决这个问题,您需要从程序集变量的实例中获取类型,而不是静态的 Assembly.GetType 方法。

于 2008-09-18T15:27:54.220 回答
0

为不同的程序集版本赋予不同的名称是最简单的方法,而且肯定有效。

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

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

于 2008-09-18T15:24:53.290 回答