程序集名称和版本

3
什么是组件和版本发布的最佳实践?
我想引用同一库的多个版本 - 解决方案包含依赖于我们自己构建的commonutils.dll库的多个项目。
由于所有依赖项都被复制到bin/debug或bin/release中,尽管每个DLL文件具有不同的程序集版本号,但只能存在一个commonutils.dll副本。
我应该在程序集名称中包括版本号以引用库的多个版本,还是还有其他方法?
3个回答

3

只要版本不同,程序集就可以在全局程序集缓存(GAC)中共存,即使它们具有相同的名称。这是.NET Framework发行的程序集的工作方式。程序集必须满足的要求是签名才能被GAC注册。

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


有时候,你对汇编生态系统并没有选择。我同意你的想法,只使用每个汇编的最新版本会很好,但这可能不是一个立即可行的选项。 - AlanR

2
这是我一直坚持的原则:
这取决于您计划如何使用 DLL 文件。我将它们分为两个主要组别:
1. 死胡同程序集。这些是您真的不打算从任何地方引用的 EXE 文件和 DLL 文件。只需弱命名它们,并确保您在源代码控制中标记了发布的版本号,以便您可以随时回滚。
2. 引用程序集。强名称它们,以便其他程序集可以引用多个版本。使用完整名称引用它们(Assembly.Load)。在其他代码可以引用的地方保留最新版本的副本。
接下来,您可以选择是否复制本地引用。基本上,权衡取舍归结为 - 您是否希望从引用中获取修补程序/升级?这可能会带来新功能的积极价值,但另一方面,可能会有破坏性的变化。我认为这里的决定应该根据具体情况做出。
在 Visual Studio 中开发时,默认情况下,您将使用最新版本进行编译,但一旦编译完成,引用程序集将需要与其编译的特定版本对应。
您的最后决定是是否复制本地。基本上,如果您已经有一种机制来部署引用的程序集,则将其设置为false。
如果您正在计划一个大型发布管理系统,您可能需要更多的思考和关注。对于我(小型公司 - 两个人),这很好用。我们知道发生了什么,并且不会感到受限于必须以不合理的方式进行操作。
一旦运行时到达,您可以Assembly.Load任何您想要的内容到应用程序域中。然后,您可以使用Assembly.GetType来获取所需类型。如果您有一个在多个加载的程序集中存在的类型(例如同一项目的多个版本),则可能会出现AmbiguousMatchException异常。为了解决这个问题,您需要从程序集变量的实例中获取类型,而不是静态的Assembly.GetType方法。

0

给不同的程序集版本取不同的名称是最简单且可靠的方法。

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

在您的 VS 项目中,您引用了库的正确版本,但您不会将其部署在应用程序文件夹中;而是在应用程序安装期间将其安装在 GAC 中。


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