在.NET 1.1和.NET 3.5中实现的动态链接库版本控制是否有所不同?似乎我可以在使用.NET 1.1的已部署应用程序中混合和匹配旧版本和新版本的依赖动态链接库,但当在已部署的.NET 3.5应用程序中与运行的动态链接库进行相同的混合匹配时,会导致问题。
发布于 2010-07-28 23:44:48
这在很大程度上是基于可以在引用上设置的"useSpecificVersion“属性。一般的经验法则是,您可以使用较新版本的引用DLL,但不能使用较旧版本。
如果您将"UseSpecificVersion“设置为true,它将强制应用程序使用该版本,并且仅使用所引用的DLL的该版本。这是.NET中一直存在的一个特性。
使用特定版本示例
如果使用引用程序集Y版本01.01.00.00生成dll X,则使用程序集Y的版本01.01.00.00以外的任何其他版本都将导致失败。
标准示例
如果使用引用的程序集Y的版本01.01.00.00生成dll X,则可以使用版本01.01.00.00或更高版本而不会出现问题。
由于是以前的版本,
发布于 2010-07-28 23:50:10
我不认为它真的改变了,但你可以read about it in MSDN。
您不能混合和匹配新旧版本,因为旧版本将是一个问题。
假设你有:
abc.exe 1.0,它也引用了XYZ.DLL和ZZZ.DLL 1.0。
如果您重新编译DLL并将其设置为1.1,abc.exe应该会继续工作,并将加载该ZZZ.DLL (如果它存在于其加载路径中)。
但是,如果复制ZZZ.DLL v0.9,abc.exe将使无法加载该dll,因为它版本较旧。
请记住,如果XYZ.DLL也有对ZZZ.DLL的引用,那么同样的规则也适用。
另一方面,您可以随时在GAC中安装DLLS,并提供不同的版本。这样,当您加载程序集时,如果它在GAC中,.NET将尝试找到“正确的程序集”,但如果它是更高的版本,则会回退到它可以使用的任何东西。
发布于 2011-06-20 08:14:15
也许我误解了Mitchel Seller的回答,但它似乎对'useSpecificVersion‘的全部内容做出了错误的假设。我通过一些简单的测试刷新了我的记忆,但他们的目标是.net 3.5,因为我不能在VS2010中瞄准1.1。
似乎人们相信,通过在Visual Studio的属性网格中设置'useSpecificVersion‘,.net运行时将允许用更新的程序集版本替换DLL……这是不正确的。
任何东西(自定义程序集绑定除外)都不会改变以下事实:如果您的“依赖项”是强命名的,则_that_exact_version_必须在运行时出现在应用程序中,否则您将收到与程序集未找到/类型加载异常相关的异常。
"useSpecificVersion“纯粹是一个编译时选项。它允许Visual Studio替换给定的DLL,以确保它可以解析引用以获得成功的编译。实际上,它被大量用于Visual Studio的多目标功能。
给你举个简单的例子。
请注意,如果您将项目引用添加到某个DLL,则在属性网格中不会获得'useSpecificVersion‘选项--这是因为您指定了一个显式项目。但是,如果您从"Add References“对话框中添加一个引用,那么您所说的就是”添加由某些已安装的产品提供的引用“。然后,您可以选择将"useSpecificVersion“设置为false。
让我们假设你已经通过MSI安装了NLog 1.0,并且已经将NLog.dll放到了你的添加引用对话框中(这是通过一个注册表项来完成的)。如果你将'useSpecificVersion‘设置为False,那么你卸载了NLog.msi (1.0版),它会从你的硬盘驱动器中删除DLL,Visual Studio会通过在引用上放置一个感叹号来抱怨一段时间(你必须清理你的项目,否则VS会从你的build文件夹中抓取DLL )。但是,由于引用已使用"useSpecificVersion false“保存到项目文件中,因此如果您随后安装NLog.msi (2.0版)...并重新构建(您可能需要重新启动VS),Visual Studio将找到版本2的NLog动态链接库,并且对使用它非常满意--小的黄色感叹号将消失。这是双向的,从较高的版本号到较低的版本号,再从较低的版本号到较高的版本号。将"useSpecificVersion“保留为"True”将阻止Visual Studio执行此替换。
正如您所看到的,此行为与运行时实际发生的事情无关…….NET仍然需要它编译时所依据的确切版本(除非您已经在app.config中配置了某些程序集版本重定向)。
保持"useSpecificVersion“为"True”将确保开发人员需要在其系统上安装正确版本的依赖库才能获得成功的构建。
我们使用DevExpress库,其中的更新版本经常发布,我们永远不会希望在它们的引用上出现"useSpecificVersion False“,因为我们需要确保每个开发人员在开发产品时都安装了正确的DevExpress版本。否则,他们可能会无意中开始使用DevExpress功能,这些功能要么已被弃用(通过安装较旧版本),要么尚未在我们实际打算部署的版本中引入(通过使用较新版本)。
https://stackoverflow.com/questions/3354634
复制相似问题