.NET 项目中引用的DLL 版本不一致的问题
2015-05-05 17:07
316 查看
在实际工作中,版本策略被使用得比较多,本节将借助分析这个面试题来简要介绍程序集的版本策略和配置方法。
所涉及到的知识点
• 版本策略的基本原理
• 程序集版本策略的配置
分析问题
当一个程序集通过名字、版本、文化和公钥进行加载时,CLR允许程序员指定该程序集的哪些版本可以代替目前版本进行加载。这些都是通过版本策略来实现的。所谓的版本策略,就是一个程序集版本的重定向,把加载当前这个版本定向到加载可替代的版本。版本策略可以在以下三个级别上进行配置:
• 应用程序策略
• 发行者策略
• 计算机策略
这三个级别的版本策略都可以通过XML文件来进行配置。现在笔者来分别介绍。
1.应用程序策略
应用程序策略可以在应用程序配置文件中进行配置,应用程序配置文件位于应用程序目录下。对于.EXE应用程序,其配置文件由exe文件名加上.config后缀名构成,例如一个test.exe的应用程序,其配置文件就是test.exe.config。而对于任何一个Web应用程序来说,其配置文件的文件名都是web.config。
版本策略都记录在配置文件的assemblyBinding节点下。代码2-7是一个应用程序的配置文件例子,这里只选取了本节所关心的版本策略部分内容。
代码2-7 VersionStrategy:Web.Config
<?xml version="1.0"?>
<configuration>
<runtime>
<assemblyBinding>
<!--对这个程序集进行版本重定向-->
<dependentAssembly>
<assemblyIdentity
name="NET.MST.Second.Compile"
publicKeyToken="60c29e5f0af3e9bb">
</assemblyIdentity>
</dependentAssembly>
<!--重定向的策略-->
<bindingRedirect oldversion="0.0.0.0-12.2.2.2"
newversion="12.3.0.0">
</bindingRedirect>
</assemblyBinding>
</runtime>
</configuration>
在代码2-7这个配置文件中,指定了NET.MST.Second.Compile,60c29e5f0af3e9bb这个组件的版本策略,这个策略将0.0.0.0到12.2.2.2之间的所有版本重定向到12.3.0.0版本上。
2.发行者策略
发行者策略是针对那些被放入全局程序集缓存(GAC)中的程序集,发行者策略以一个和代码2-6同样格式的配置文件形式绑定到程序集上,被一同放入GAC中。发行者策略配置文件的文件名非常古怪,它是这样的一个字符串:主版本号.次版本号.程序集名.dll。正因为如此,一个程序集的每个主版本/次版本号只能有一个发行者策略。
3.计算机策略
同样地,计算机策略同样由一个配置文件表示,它的格式也和代码2-7基本类似。计算机级版本策略配置文件的文件名为:machine.config,它被存储在%SystemRoot%\ Microsoft.NET\ Framework\v****\CONFIG\目录下。
读到这里,读者可能会有这样的疑问:版本策略可以在3个级别进行配置,那这些策略是如何协作的呢?按照.NET的机制,3个级别的版本策略将会按照顺序依次执行,而上一级别的执行结果将会被作为下一级别的执行输入。
3个级别版本策略被依照:应用程序、发行者、计算机的顺序依次执行。而其中,发行者策略是可选的,在以下两种情况下发行者策略将不会被执行。
• 程序集没有被加入到GAC中
• 应用程序策略制定忽略发行者策略
在第一种情况下,根本就不存在发行者策略配置文件,当然CLR也就不会执行发行者策略。而第二种情况,是程序员在应用程序策略中指定忽略发行者策略,具体做法是在应用程序配置文件中加入publisherPolicy节点,并且把apply属性值设置为no。代码2-8就是在代码2-7的基础上,指定了忽略发行者策略。
代码2-8 VersionStrategy-NoPolisherPolicy:Web.Config
<?xml version="1.0"?>
<configuration>
<runtime>
<assemblyBinding>
<!--对这个程序集进行版本重定向-->
<dependentAssembly>
<assemblyIdentity
name="NET.MST.Second.Compile"
publicKeyToken="60c29e5f0af3e9bb">
</assemblyIdentity>
</dependentAssembly>
<!--重定向的策略-->
<bindingRedirect oldversion="0.0.0.0-12.2.2.2"
newversion="12.3.0.0">
</bindingRedirect>
<!--指定忽略发行者策略-->
<publisherPolicy apply="no">
</publisherPolicy>
</assemblyBinding>
</runtime>
</configuration>
答案
CLR支持在3个级别上设定版本策略,依次是:应用程序策略、发行者策略和计算机策略。所有策略的设置都是通过修改配置文件来实现。3个级别的策略依次会被CLR执行,而上一个策略的执行结果将被作为下一个策略的输入。发行者策略仅仅针对那些放入GAC的程序集,并且可以在应用程序策略中被指定忽略。
原文链接:http://blog.csdn.net/tmeteor/article/details/9468407
所涉及到的知识点
• 版本策略的基本原理
• 程序集版本策略的配置
分析问题
当一个程序集通过名字、版本、文化和公钥进行加载时,CLR允许程序员指定该程序集的哪些版本可以代替目前版本进行加载。这些都是通过版本策略来实现的。所谓的版本策略,就是一个程序集版本的重定向,把加载当前这个版本定向到加载可替代的版本。版本策略可以在以下三个级别上进行配置:
• 应用程序策略
• 发行者策略
• 计算机策略
这三个级别的版本策略都可以通过XML文件来进行配置。现在笔者来分别介绍。
1.应用程序策略
应用程序策略可以在应用程序配置文件中进行配置,应用程序配置文件位于应用程序目录下。对于.EXE应用程序,其配置文件由exe文件名加上.config后缀名构成,例如一个test.exe的应用程序,其配置文件就是test.exe.config。而对于任何一个Web应用程序来说,其配置文件的文件名都是web.config。
版本策略都记录在配置文件的assemblyBinding节点下。代码2-7是一个应用程序的配置文件例子,这里只选取了本节所关心的版本策略部分内容。
代码2-7 VersionStrategy:Web.Config
<?xml version="1.0"?>
<configuration>
<runtime>
<assemblyBinding>
<!--对这个程序集进行版本重定向-->
<dependentAssembly>
<assemblyIdentity
name="NET.MST.Second.Compile"
publicKeyToken="60c29e5f0af3e9bb">
</assemblyIdentity>
</dependentAssembly>
<!--重定向的策略-->
<bindingRedirect oldversion="0.0.0.0-12.2.2.2"
newversion="12.3.0.0">
</bindingRedirect>
</assemblyBinding>
</runtime>
</configuration>
在代码2-7这个配置文件中,指定了NET.MST.Second.Compile,60c29e5f0af3e9bb这个组件的版本策略,这个策略将0.0.0.0到12.2.2.2之间的所有版本重定向到12.3.0.0版本上。
2.发行者策略
发行者策略是针对那些被放入全局程序集缓存(GAC)中的程序集,发行者策略以一个和代码2-6同样格式的配置文件形式绑定到程序集上,被一同放入GAC中。发行者策略配置文件的文件名非常古怪,它是这样的一个字符串:主版本号.次版本号.程序集名.dll。正因为如此,一个程序集的每个主版本/次版本号只能有一个发行者策略。
3.计算机策略
同样地,计算机策略同样由一个配置文件表示,它的格式也和代码2-7基本类似。计算机级版本策略配置文件的文件名为:machine.config,它被存储在%SystemRoot%\ Microsoft.NET\ Framework\v****\CONFIG\目录下。
读到这里,读者可能会有这样的疑问:版本策略可以在3个级别进行配置,那这些策略是如何协作的呢?按照.NET的机制,3个级别的版本策略将会按照顺序依次执行,而上一级别的执行结果将会被作为下一级别的执行输入。
3个级别版本策略被依照:应用程序、发行者、计算机的顺序依次执行。而其中,发行者策略是可选的,在以下两种情况下发行者策略将不会被执行。
• 程序集没有被加入到GAC中
• 应用程序策略制定忽略发行者策略
在第一种情况下,根本就不存在发行者策略配置文件,当然CLR也就不会执行发行者策略。而第二种情况,是程序员在应用程序策略中指定忽略发行者策略,具体做法是在应用程序配置文件中加入publisherPolicy节点,并且把apply属性值设置为no。代码2-8就是在代码2-7的基础上,指定了忽略发行者策略。
代码2-8 VersionStrategy-NoPolisherPolicy:Web.Config
<?xml version="1.0"?>
<configuration>
<runtime>
<assemblyBinding>
<!--对这个程序集进行版本重定向-->
<dependentAssembly>
<assemblyIdentity
name="NET.MST.Second.Compile"
publicKeyToken="60c29e5f0af3e9bb">
</assemblyIdentity>
</dependentAssembly>
<!--重定向的策略-->
<bindingRedirect oldversion="0.0.0.0-12.2.2.2"
newversion="12.3.0.0">
</bindingRedirect>
<!--指定忽略发行者策略-->
<publisherPolicy apply="no">
</publisherPolicy>
</assemblyBinding>
</runtime>
</configuration>
答案
CLR支持在3个级别上设定版本策略,依次是:应用程序策略、发行者策略和计算机策略。所有策略的设置都是通过修改配置文件来实现。3个级别的策略依次会被CLR执行,而上一个策略的执行结果将被作为下一个策略的输入。发行者策略仅仅针对那些放入GAC的程序集,并且可以在应用程序策略中被指定忽略。
原文链接:http://blog.csdn.net/tmeteor/article/details/9468407
相关文章推荐
- .NET 项目中引用的DLL 版本不一致的问题
- .net在同一个项目中要引用两种不同版本的dll(dll hell)的解决办法
- .net在同一个项目中要引用两种不同版本的dll(dll hell)的解决办法
- 关于VS.NET中多个项目的工程相互引用和多个dll引用的问题!
- 一个项目引用不同版本DLL
- .net项目引用C++ 动态链接库.dll
- .NET 项目在源码控制中程序集的引用问题
- vs引用Microsoft.Office.Interop.Excel.dll版本问题
- C#调用MFC程序DLL库——MFC项目DLL生成问题、DLL引用链问题、DLL读取配置文件路径问题
- .Net利用反射调用DLL时,被调用DLL引用其它库问题
- 关于vs2012解决方案中项目DLL文件引用问题
- 如何处理源dump文件的mscordacwks.dll文件与调试机上的版本不一致问题而无法使用extension cmd的问题
- 项目里不同版本之间调用DLL,引发的问题
- .Net利用反射调用DLL时,被调用DLL引用其它库问题
- .net 网站项目dll引用,项目引用的管理问题
- windows7下php5.4成功安装imageMagick,及解决php imagick常见错误问题。(phpinfo中显示不出来是因为:1.imagick软件本身、php本身、php扩展三方版本要一致,2.需要把CORE_RL_*.dll多个文件放到/php/目录下面)
- java.lang.UnsupportedClassVersionError(java项目版本一致问题)
- 关于VS.NET中多个项目的工程相互引用和多个dll引用的问题!
- kafka项目中踩到的一个坑(客户端和服务器端版本不一致问题)
- 替换DLL时经常出现版本不一致的问题,怎么解决?