zoukankan      html  css  js  c++  java
  • 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该

    今天在把以前写的代码生成工具从原来的.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

  • 相关阅读:
    计算机网络中协议相关的问题(转)
    Vs2013打开项目时,一直处理等待状态,并显示“Microsoft Visual Studio正忙”的提示窗,处理方法(转)
    ASP.NET Core 2.2 十九. Action参数的映射与模型绑定(转)
    ASP.NET Core 2.2 十八.各种Filter的内部处理机制及执行顺序(转)
    ASP.NET Core 2.2 : 十七.Action的执行(Endpoint.RequestDelegate后面的故事)(转)
    ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案(转)
    【Leetcode】771. Jewels and Stones
    【Leetcode】50. Pow(x, n)
    【Leetcode】 328. Odd Even Linked List
    【leetcode】59.Spiral Matrix II
  • 原文地址:https://www.cnblogs.com/zjoch/p/3554321.html
Copyright © 2011-2022 走看看