程序集名称和版本
关于程序集和发行版,什么被认为是最佳实践?
我希望能够引用同一库解决方案的多个版本,其中包含多个项目,这些项目依赖于我们自己构建的commonutils.dll库的不同版本。
由于所有依赖项都复制到bin / debug或者bin / release,因此,尽管每个DLL文件具有不同的程序集版本号,但commonutils.dll只能存在一个副本。
我应该在程序集名称中包含版本号,以便能够引用库的多个版本,还是有另一种方法?
解决方案
考虑到版本不同,即使程序集具有相同的名称,它们也可以共存于GAC(全局程序集缓存)中。 .NET Framework附带的程序集就是这样工作的。签名才能满足装配必须能够进行GAC注册的要求。
在程序集名称中添加版本号只会破坏程序集生态系统的整个目的,并且麻烦恕我直言。要知道给定部件的哪个版本,我只需打开"属性"窗口并检查版本。
为不同的程序集版本赋予不同的名称是最简单的方法,并且肯定可以正常工作。
如果程序集(commonutils.dll)是强名称(即已签名),则可以考虑将其安装在GAC中(全局程序集缓存,我们可以在GAC中并排安装同一程序集的不同版本),因此调用应用程序会自动从那里获取正确的版本,因为.NET类型包括程序集版本信息。
在VS项目中,我们引用了正确的库版本,但是没有将其部署在应用程序文件夹中;我们可以将其安装在GAC中(在应用程序安装过程中)。
这就是我一直生活的-
这取决于我们打算使用DLL文件的目的。我将它们分为两个主要组:
- 死胡同。这些是我们实际上并不打算从任何地方进行引用的EXE文件和DLL文件。只是对它们进行微弱的命名,并确保在源代码管理中标记了我们发布的版本号,以便可以随时回滚。
- 引用的程序集。这些都是强名称,因此我们可以拥有其他程序集引用的多个版本。使用全名来引用它们(Assembly.Load)。将其最新和最新版本的副本保存在其他代码可以引用它的地方。
接下来,我们可以选择是否复制本地引用。基本上,权衡归结为-我们要从参考中获取补丁/升级吗?获得新功能可以带来积极的价值,但是另一方面,可能会有重大的变化。我认为,这里的决定应视具体情况而定。
在Visual Studio中进行开发时,默认情况下将采用最新版本进行编译,但是一旦编译,引用程序集将要求使用其编译时使用的特定版本。
我们最后的决定是是否复制本地。基本上,如果我们已经具有部署引用程序集的机制,请将其设置为false。
如果我们正在计划大型发布管理系统,则可能必须对此进行更多的思考和关注。对于我(小商店-两个人)来说,这很好。我们知道正在发生的事情,并且不必为以不必要的方式做事而感到束缚。
一旦到达运行时,就可以Assembly.Load所需的任何内容到应用程序域中。然后,我们可以使用Assembly.GetType达到所需的类型。如果类型存在于多个已加载程序集中(例如,同一项目的多个版本中),则可能会收到AmbiguousMatchException异常。为了解决这个问题,我们将需要从程序集变量的实例中获取类型,而不是静态Assembly.GetType方法。