关于c#:程序集名称和版本

关于c#:程序集名称和版本

Assembly names and versions

关于程序集和发行版,什么是最佳实践?

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

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

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


考虑到版本不同,即使程序集具有相同的名称,它们也可以共存于GAC(全局程序集缓存)中。 .NET Framework附带的程序集就是这样工作的。签名才能满足装配必须能够进行GAC注册的要求。

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


这就是我一直生活的

这取决于您打算使用DLL文件的目的。我将它们分为两个主要组:

  • 死胡同。这些是您实际上并不打算从任何地方进行引用的EXE文件和DLL文件。只是对它们进行微弱的命名,并确保在源代码管理中标记了您发布的版本号,以便您可以随时回滚。

  • 引用的程序集。这些都是强名称,因此您可以拥有其他程序集引用的多个版本。使用全名来引用它们(Assembly.Load)。将其最新和最新版本的副本保存在其他代码可以引用它的地方。

  • 接下来,您可以选择是否复制本地引用。基本上,权衡归结为-您是否要从参考中获取补丁/升级?获得新功能可以带来积极的价值,但是另一方面,可能会有重大的变化。我认为,这里的决定应视具体情况而定。

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

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

    如果您正在计划大型发布管理系统,则可能必须对此进行更多的思考和关注。对于我(小商店-两个人)来说,这很好。我们知道正在发生的事情,并且不必以不必要的方式去做事情。

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


    为不同的程序集版本赋予不同的名称是最简单的方法,并且肯定可以正常工作。

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

    在VS项目中,您引用了正确的库版本,但是没有将其部署在应用程序文件夹中。您可以将其安装在GAC中(在应用程序安装过程中)。


    推荐阅读