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