`
az7772010
  • 浏览: 201751 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

.NET 4.0运行.NET 2.0兼容方法 (1)

 
阅读更多

让.NET 4.0 直接运行 .NET 2.0 程序的兼容方法

http://blog.csdn.net/zyp_tfy/article/details/6036572

<wbr></wbr>

需要在相同目录下放一个.config文件,例如xxx.exe,就需要一个xxx.exe.config文件,内容如下:

<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActiva<wbr>tionPolicy</wbr>="true">
<wbr><wbr><wbr></wbr></wbr></wbr>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>

http://msdn.microsoft.com/zh-cn/library/w4atty68.aspx


<wbr></wbr>

最近在使用vs2010开发基于SQLite的应用程序时,发现会报出兼容性异常如下:

System.IO.FileLoadException: Mixed mode assembly is built against version ‘v2.0.50727′ of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information.

困扰了很久,原来我们只需要添加应用程序配置文件,在configuration节点加入

<startup useLegacyV2RuntimeActiva<wbr>tionPolicy="true"&gt;<br> &lt;supportedRuntime version="v4.0"/&gt;<br> &lt;requiredRuntime version="v4.0.20506" /&gt;<br> &lt;/startup&gt;</wbr>

即可解决问题。这样做可以允许旧的应用程序绑定到新的版本之上。

SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月. 至今已经有10个年头,SQLite也迎来了一个版本 SQLite 3已经发布。

<wbr></wbr>

<wbr></wbr>

------------------------------------------------------

http://www.diybl.com/course/4_webprogram/asp.net/netjs/20100729/504392.html

微软发布的dotnetfx2.0是相当成功的开发框架,由此产生了大量基于.NET2.0的应用,微软后来发布的dotnetfx3.0及dotnetfx3.5都是对2.0的扩展,并添加了很多新的特性(如:linq、wpf、wcf、wwf、Lambda、类型推断及简化的语法等),但碍于庞大的dotnetfx3.5安装部署都十分困难,dotnetfx2.0应用依然十分普遍。几个月以前微软发布了dotnetfx4.0,其强大的功能让dotnetfx2.0的优势消失殆尽,很多新的应用开发已经从.NET4.0开始了。由于.NET4.0使用全新的CLR,因此基于.NET2.0的程序集并不能直接在.NET4.0框架下运行,此时大量的基于dotnetfx2.0应用的升级就成了问题。

<wbr><wbr><wbr><wbr><wbr><wbr> 虽然不能直接向下兼容,但微软已经提供了比较好的兼容性解决方案:运行时目标版本激活策略。基于.NET2.0的应用程序和程序集只要在配置文件中声明运行时版本即可在新的框架下运行。对于此解决方案的官方说明在<a href="http://msdn.microsoft.com/zh-cn/library/bbx34a2h.aspx">http://msdn.microsoft.com/zh-cn/library/bbx34a2h.aspx</a>。</wbr></wbr></wbr></wbr></wbr></wbr>

设置方法:在缺省配置文件的根元素configuration下添加以下声明( 桌面应用程序为App.config、Web应用程序为Web.config):

   1:  <startup useLegacyV2RuntimeActiva<wbr>tionPolicy</wbr>="true">
   2:      <supportedRuntime version="v4.0"/>
   3:  startup>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr> 这里Web应用程序的环境配置要复杂一些。当然首先要安装dotnetfx4.0,如果是先安装了IIS,则需要手动注册IIS,注册命令:</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

%windows%\Microsoft.NET\Framework\<版本号>\aspnet_regiis.exe -i

如果是服务器版操作系统,则IIS中还有“Web服务扩展”选项,在选项中启用ASP.NET v4.0.30319服务扩展;然后在站点的属性中修改ASP .NET版本为v4.0.30319,至此,基于.NET2.0的应用程序就可以在.NET4.0下和WCF、linq等新功能一起运行了。

<wbr></wbr>

<?xml version = "1.0" ?>
<configuration>
<system.web>
<wbr>&lt;compilation targetFrameworkMoniker=".NETFramework,Version=v4.0" /&gt;<br> &lt;/system.web&gt;<br> &lt;/configuration&gt;</wbr>

<wbr></wbr>

<wbr></wbr>

-----------------------------------------------------------------------------

最近部门的开发环境都更新到了WIN7+.NET framework4+VS2010上,在体验新技术和新环境带给我们提高效率的方式方法的同时也带来了一些兼容性的问题;这几天项目闲暇时在研究SQLite,在做实验的时候碰到个问题,代码编译通过执行时反复异常中断,查到后面原来是SQLite.dll是在framework2.0环境下编译的而现在的运行环境是framework4.0,所以就出现了运行异常,如图:

    

    由于以后的开发过程中,可能会引用一些第三方的组件,有可能是老的framework版本下编译的,同样会出现此类的问题,所以在本文中提供一个解决办法和说明造成此问题的原因。

    查阅了相关资料,stackoverflow.com上建议在config文件中增加配置:

    

<wbr></wbr>

1 <startup useLegacyV2RuntimeActiva<wbr>tionPolicy="true"&gt;<br> 2<wbr><wbr> &lt;supportedRuntime version="v4.0"/&gt;<br> 3 &lt;/startup&gt;<br><wbr></wbr></wbr></wbr></wbr>

    MSDN上也对此方法进行了阐述,参见http://msdn.microsoft.com/en-us/library/bbx34a2h(VS.100).aspx

    

    但是使用此方法编译后问题仍然没有解决,但是问题可以明确锁定为.net runtime环境的问题了。

    

<wbr></wbr>

<wbr></wbr>

1<wbr><wbr><wbr><wbr> &lt;startup useLegacyV2RuntimeActiva<wbr>tionPolicy="true"&gt;<br> 2<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;supportedRuntime version="v4.0"/&gt;<br> 3<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> &lt;requiredRuntime version="v4.0.30319" /&gt;<br> 4<wbr><wbr><wbr><wbr> &lt;/startup&gt;<br><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr>    再次运行,问题解决。这下需要了解是什么原因造成的?</wbr>

    supportedRuntime标签用来 具体说明应用程序支持的是哪个.framework运行时的版本;

    requiredRuntime标签用来具体说明应用程序只支持1.0版本的公用语言运行时间。如果使用1.1版本或者后面的版本来编译,应用程序必须使用<supportedRuntime>元素;

    注意:

    <supportedRuntime>必须通过1.1版本或后面的版本而编译的应用程序来使用。只支持1.0版本的运行时间的应用程序必须使用<requiredRuntime>。

    

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 再次查阅CLR Runtime版本的相关资料,引用以下CLR运行规则和各版本间关系汇总表格,如下:</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

    规则:    

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 1. CLR4.0及以上版本编译的应用程序总是运行在应用程序所被编译的CLR版本上;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 2. CLR4.0以下版本编译的应用程序优先运行在被编译的CLR版本上,如果此版本不存在,则运行最新的小于CLR4.0的版本;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

    汇总如下:    

EXE被编译的CLR版本号
<wbr>机器上安装有CLR 1.1?<br><wbr>机器上安装有CLR 2.0?<br><wbr>机器上安装有CLR 4.0?<br><wbr>结果<br><wbr><br> 1.1<br><wbr>是<br><wbr>无所谓<br><wbr>无所谓<br><wbr>加载CLR 1.1<br><wbr><br> 2.0<br><wbr>无所谓<br><wbr>是<br><wbr>无所谓<br><wbr>加载CLR 2.0<br><wbr><br> 1.1<br><wbr>否<br><wbr>是<br><wbr>无所谓<br><wbr>加载CLR 2.0<br><wbr><br> 1.1<br><wbr>否<br><wbr>否<br><wbr>是<br><wbr>失败<br><wbr><br> 2.0<br><wbr>无所谓<br><wbr>否<br><wbr>是<br><wbr>失败<br><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 至此我们就能很清楚的搞清各个CLR版本之间的联系了。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr></wbr>

<wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 总结:</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 微软每次版本升级都会造成一些新的问题的出现,早年从CLRv1.0到CLRv2.0曾经也造成很多的困惑,可能也是由于过大的组织造成不能面面俱到吧,希望在今后的版本升级中能真正做到无缝的版本联接。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 鸣谢:</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 本文关于CLR版本的分析引用了微软NET 4.0团队张羿总结的各版本间的关系,在此感谢他给予我们的支持。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr></wbr>

<wbr>    </wbr>

    

    转载时,请注明本文来源:www.cnblogs.com/tmywu

<wbr>  </wbr>

    作者: 淘米部落

    联系邮箱:tommywu23@gmail.com  


文章出处:飞诺网(www.diybl.com):http://www.diybl.com/course/4_webprogram/asp.net/netjs/20100729/504392.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics