解决.net framework 4.0环境下遇到版本不同编译不通过的方法详解_实用技巧

本文内容:
1.问题引出
2.问题解决
3.原因分析 

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

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

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

复制代码 代码如下:

<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>

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

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

复制代码 代码如下:

<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
<requiredRuntime version="v4.0.30319" />
</startup>

再次运行,问题解决。这下需要了解是什么原因造成的?
supportedRuntime标签用来 具体说明应用程序支持的是哪个.framework运行时的版本;
requiredRuntime标签用来 具体说明应用程序只支持1.0版本的公用语言运行时间。如果使用1.1版本或者后面的版本来编译,应用程序必须使用<supportedRuntime>元素;
注意:
<supportedRuntime>必须通过1.1版本或后面的版本而编译的应用程序来使用。只支持1.0版本的运行时间的应用程序必须使用<requiredRuntime>。

再次查阅CLR Runtime版本的相关资料,引用以下CLR运行规则和各版本间关系汇总表格,如下:
规则:
1. CLR4.0及以上版本编译的应用程序总是运行在应用程序所被编译的CLR版本上;
2. CLR4.0以下版本编译的应用程序优先运行在被编译的CLR版本上,如果此版本不存在,则运行最新的小于CLR4.0的版本;
汇总如下:


EXE被编译的CLR版本号


机器上安装有CLR 1.1


机器上安装有CLR 2.0?


机器上安装有CLR 4.0?


结果


1.1



无所谓


无所谓


加载CLR 1.1


2.0


无所谓



无所谓


加载CLR 2.0


1.1




无所谓


加载CLR 2.0


1.1





失败


2.0


无所谓




失败

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

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

时间: 2024-08-30 23:15:42

解决.net framework 4.0环境下遇到版本不同编译不通过的方法详解_实用技巧的相关文章

解决在Web.config或App.config中添加自定义配置的方法详解_实用技巧

.Net中的System.Configuration命名空间为我们在web.config或者app.config中自定义配置提供了完美的支持.最近看到一些项目中还在自定义xml文件做程序的配置,所以忍不住写一篇用系统自定义配置的随笔了.如果你已经对自定义配置了如指掌,请忽略这篇文章.言归正传,我们先来看一个最简单的自定义配置 复制代码 代码如下: <?xml version="1.0" encoding="utf-8" ?> <configura

基于.NET BitmapImage 内存释放问题的解决方法详解_实用技巧

网上查到的代码,多数的写法使用MemoryStream来实现: 复制代码 代码如下: new Thread(new ThreadStart(() => {    var bitmap = new BitmapImage();    bitmap.BeginInit();     using (var stream = new MemoryStream(File.ReadAllBytes(...))) {        bitmap.StreamSource = stream;        bi

在IIS上重新注册.NET Framework 2.0的命令和参数详解_实用技巧

我们有时可能需要将 .Net 重新注册到 IIS 上面,可以用下面的命令行来操作. 如果您电脑已经安装了 IIS 然后再装.net 在安装过程中 .net 是会自动帮您注册的,反之则需要注册. 打开程序-运行-cmd:输入一下命令重新注册IIS 复制代码 代码如下: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i 注册成功就可以在IIS里看到: 以下是aspnet_regiis.exe参数的说明信息: -i –

ASP.NET环境下为网站增加IP过滤功能第1/2页_实用技巧

1. 需求分析 通过深入的交流和沟通,确认了该发电厂在企业网站用户访问控制方面的改进要求,大致情况如下: a) 网站基于Asp.Net2.0实现,不允许修改源程序 b) 厂内用户可直接访问整个站点的所有页面,员工不需要身份验证 c) 厂外用户只能访问指定的页面 显而易见,他们就是针对企业网站增加一项IP过滤功能,在厂外用户访问某些敏感页面时将其拒之门外.首先我们需要设置一个IP列表和一个Url列表,前者包含所有厂内IP,后者包含厂外用户可访问的全部Url,并且这两个列表都是可维护的:另外一个核心

ASP.NET2.0 SQL Server数据库连接详解_实用技巧

Connection类有四种:SqlConnection,OleDbConnection,OdbcConnection和OracleConnection. SqlConnection类的对象连接SQL Server数据库:OracleConnection 类的对象连接Oracle数据库: OleDbConnection类的对象连接支持OLE DB的数据库,如Access:而OdbcConnection类的对象连接任何支持ODBC的数据库.与数据库的所有通讯最终都是通过Connection对象来完

解析.Net 4.0 中委托delegate的使用详解_实用技巧

.Net中的委托从功能上讲和c语言或者c++中的方法指针类似,可以像调用方法一样调用委托完成某个功能,或返回某类结果.但是.Net毕竟是更高级的语言,委托Delegate也更高级了,委托是一种数据接口,它包含调用目标和调用方法的指针:而在.Net中定义的委托都继承自MulticastDelegate即多播委托,所谓的多播委托是指可以包含多个调用方法的委托.一. 先来看下委托的定义:如下C#代码定义委托public delegate void DoSomething(int times);委托的定

在Linux下搭建Git服务器的方法详解_相关技巧

前言 GitHub就是一个免费托管开源代码的远程仓库.但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用. 我打算自己搭建git服务器.虽然目前已经有很不错的git工具,如github,coding.net等,但是为了安全,减少限制和开销,还是放在自己的服务器为好.下面给出安装配置的过程,有问题欢迎讨论和交流,我会及时回复的. 第一步 安装git:可以通过命令的方式快速安装,不同的linux的安装方法可能不

HTTP 错误 500.19 - Internal Server Error解决办法详解_实用技巧

HTTP 错误 500.19 - Internal Server Error 最近做项目出现了这个错误,经过同事之间的讨论未能解决,之后百度一下找到了解决方法,这里就说下希望大家遇到这种错误可以顺利解决. 无法访问请求的页面,因为该页的相关配置数据无效.如下图:  解决方法,到站点目录的属性,安全标签,添加用户(Everyone),并给修改权限: 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Asp.net &amp;quot;对路径的访问被拒绝&amp;quot; 解决方法的分析_实用技巧

给下面这个目录加上ASP.NET帐号的权限.C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files ASP.NET帐号的权限为: 读取和运行,列出文件夹目录,读取,写入. 前几天把自己写的东西移植到另一台机器上的时候,出了这个问题.很直觉地想到了是权限问题.可是我把WEB目录下的权限都几乎改成了完全控制,还是不能解决问题.查了很多资料,讲得也不清楚.有说改这个,也有说改那个的.后来,终于注意到,出错时显示的是对