今天在把以前写的代码生成工具从原来的.NET3.5升级到.NET4.0,同时准备进一步完善,将程序集都更新后,一运行程序在一处方法调用时报出了一个异常:
混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集
其调用的方法是从sqlite数据库中获取原来已经使用过的数据库连接,当时也没注意,就是准备设断点然后单步调试,结果竟然是断点无法进入方法体内,后来仔细看了一下方法体的时候发现了一个问题,就是现有的System.Data.Sqlite这个数据访问provider是针对.NET2.0环境开发(最新的版本是1.0.66.0,2010年4月18日发布的),而目前官方也没有给出最新的.NET4的数据访问支持。
既然出现这个问题,那肯定是上GOOGLE搜索解决方案,毕竟微软不可能因为升级到了.NET4.0的程序无法访问.NET2.0的程序集吧。后来在著名的stackoverflow.com上果然找到了解决方案,就是在app.config中添加一个配置节:startup
<
startup
useLegacyV2RuntimeActivationPolicy
=
"true"
>
<
supportedRuntime
version
=
"v4.0"
/>
</
startup
>
这段配置节的意思是(参考自MSDN,具体地址:http://msdn.microsoft.com/zh-cn/library/bbx34a2h.aspx):
启用 .NET Framework 2.0 版 运行时激活策略,这是通过使用最新支持的运行时加载所有程序集。
注意:由于config配置文件的特性,如果在config配置文件中存在configSections节点,则必须将configSections放在一个,否则会引发异常:配置系统未能初始化
在原来.NET2.0,.NET3.5的时候,由于程序运行环境本质还是.NET2.0,而到了.NET4.0由于整个程序集的版本更新,以前使用.NET2.0所编写的程序集与.NET4.0的程序集继续拧互操作的时候就会出现上面所说的兼容性问题。
通过MSDN,我们可以知道,startup配置节中的useLegacyV2RuntimeActivationPolicy属性是在.NET4.0中新增的,默认是false,表示:
使用默认的 .NET Framework 4 激活策略,该激活策略将加载 .NET Framework 4 通过使用公共语言运行时 (CLR) 版本 4 所创建的程序集,以及 CLR 早期版本通过使用受支持的低于版本 4 的最高 CLR 版本所创建的程序集。
现在如果当程序在.NET4.0环境下要使用.NET2.0及.NET3.5的程序时就必须将useLegacyV2RuntimeActivationPolicy设置为true,同时还要注意,需要在startup配置节的字节中添加supportedRuntime配置节,并指定为“v4.0”,表示使用.NET4.0运行时来运行程序。
有关更多startup及其子级可以查看MSDN:
startup:http://msdn.microsoft.com/zh-cn/library/bbx34a2h.aspx
supportedRuntime:http://msdn.microsoft.com/zh-cn/library/w4atty68.aspx
原文:http://hi.baidu.com/mubingyun/blog/item/aa4c833d832d7ae03c6d97e4.html
另外一篇:
今天在使用WebService时,编译项目出现了“混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。”错误提示,在项目中添加WebService的引用方式使用了两种,一种是添加“服务引用”,一种是添加“Web引用”。两种方式不一样,Web引用是基于.net framework 2.0的,而我的项目基于.net framework 4.0开发的。所以造成一个项目使用了2个版本的.net framework 。一编译就报“在使用.Net2.0和.Net4.0混合开发,启动应用程序时遇到了“混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。”这个错误提示。”。
解决方案如下:
在app.config中的configuration节内添加子节startup,详细如下:
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku = ".NETFramework,Version=v4.0"/>
<supportedRuntime version="v2.0.50727"/>
</startup>
,之后完整的app.config看起来就像这样:
<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku = ".NETFramework,Version=v4.0"/>
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>
下面内容来自微软官方文档。
useLegacyV2RuntimeActivationPolicy属性,表示指定是否启用 .NET Framework 2.0 运行时激活策略,或者是否使用 .NET Framework 4 激活策略。
true,为所选运行时启用 .NET Framework 2.0 运行时激活策略,该策略要将运行时激活技术(如 CorBindToRuntimeEx 功能)绑定到从配置文件选择的运行时,而不是将它们盖在 CLR 版本 2.0 上。因此,如果从配置文件选择 CLR 版本 4 或更高版本,则使用 .NET Framework 的早期版本创建的混合模式程序集将与所选 CLR 版本一同加载。设置此值可防止 CLR 版本 1.1 或 2.0 加载到同一进程,有效地禁用进程中的并行功能。
false,使用 .NET Framework 4 及更高版本的默认激活策略,即允许旧式运行时激活技术将 CLR 版本 1.1 或 2.0 加载到进程。设置此值可防止混合模式程序集加载到 .NET Framework 4 或更高版本,除非他们内置有 .NET Framework 4 或更高版本。此值为默认值。
子元素:
<requiredRuntime>指定应用程序仅支持公共语言运行时 1.0 版。 用运行时 1.1 版本或更高版本生成的应用程序应使用 <supportedRuntime> 元素。
<supportedRuntime>指定此应用程序支持的公共语言运行时版本。
备注:
<supportedRuntime> 元素应由使用运行时 1.1 版或更高版本生成的所有应用程序使用。 仅为支持运行时 1.0 版而生成的应用程序必须使用 <requiredRuntime> 元素。
Microsoft Internet Explorer 中承载的应用程序的启动代码忽略 <startup> 元素及其子元素。
useLegacyV2RuntimeActivationPolicy 特性
如果您的应用程序使用旧式激活路径,如 CorBindToRuntimeEx function(CorBindToRuntimeEx 功能),并且您希望这些路径激活 CLR 的版本 4(而不是较早的版本),或者如果您的应用程序是用 .NET Framework 4 生成的,但在使用较早版本的 .NET Framework 生成的混合模式程序集上有依赖项,则此特性将派上用场。 在这些方案中,将特性设置为 true。
说明:
将该属性设置为 true 可以防止把 CLR 版本 1.1 或 CLR 版本 2.0 加载到同一进程,有效地禁用进程中的并行功能
示例
<!-- When used with version 1.0 of the .NET Framework runtime -->
<configuration>
<startup>
<requiredRuntime version="v1.0.3705" safemode="true"/>
</startup>
</configuration>
<!-- When used with version 1.1 (or later) of the runtime -->
<configuration>
<startup>
<supportedRuntime version="v1.1.4322"/>
<supportedRuntime version="v1.0.3705"/>
</startup>
</configuration>
转自:http://hi.baidu.com/jack1865/item/14814f8a355375fdd1f8cdca