【问题标题】:What 'additional configuration' is necessary to reference a .NET 2.0 mixed mode assembly in a .NET 4.0 project?在 .NET 4.0 项目中引用 .NET 2.0 混合模式程序集需要哪些“附加配置”?
【发布时间】:2013-06-27 11:10:37
【问题描述】:

我有一个项目,我想在其中使用一些 .NET 4.0 功能,但核心要求是我可以使用针对 2.X 编译的 System.Data.SQLite 框架。我看到提到这是可能的,例如the accepted answer here,但我不知道如何实际实现这一点。

当我在引用 2.X 程序集时尝试运行我的 4.0 项目时,我得到:

混合模式程序集是针对运行时版本“v2.0.50727”构建的 并且不能在没有额外的 4.0 运行时加载 配置信息。

需要什么“额外配置”?

【问题讨论】:

标签: c# .net sqlite .net-4.0 system.data.sqlite


【解决方案1】:

为了使用 CLR 2.0 混合模式程序集,您需要修改您的 App.Config 文件以包含:

&lt;?xml version="1.0"?&gt;<br>&lt;configuration&gt;<br>  &lt;startup <b>useLegacyV2RuntimeActivationPolicy="true"</b>&gt;<br>    &lt;supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/&gt;<br>  &lt;/startup&gt;<br>&lt;/configuration&gt;

关键是useLegacyV2RuntimeActivationPolicy 标志。这会导致 CLR 使用最新版本 (4.0) 来加载您的混合模式程序集。没有这个,它将无法工作。

请注意,这只对混合模式 (C++/CLI) 程序集很重要。您可以加载所有托管 CLR 2 程序集,而无需在 app.config 中指定。

【讨论】:

  • @Reed 我已经尝试过您的建议,但仍然会弹出异常。我已经仔细检查了复制到我的 EXE 文件夹的 app.config,但它仍然无法正常工作。它在使用 log4net 时出现。除了这里:stackoverflow.com/questions/1866735/log4net-and-net-4-0,我找不到关于这个错误的任何信息:log4net,但它并没有说太多。关于如何获得有关我的特定问题的更多信息的任何想法?
  • @Dave:这表明您可以只使用 .NET 4 本机版本的 log4net - 这似乎是最好的选择。如果有 .NET 4 版本,请使用它...
  • @Reed 没有,我实际上将这个答案解释为意味着您必须自己编译 log4net。我想我可以做到,但我宁愿只使用他们的预编译二进制文件并从我的项目中引用它。我会再调查一下。但是你能想到为什么改变 app.config 不能让它工作吗?我想也许我必须使用 programname.exe.config,但我也试过了,但没有用。以我有限的经验,任何一个文件名都做同样的事情。
  • 帮助我的是把这一行放到 NUnit 的 配置文件中:
  • 微软应该在异常对话框中创建一个按钮:“在 stackoverflow 上搜索此异常消息”
【解决方案2】:

forum post 位于 .NET Framework 开发人员中心。它可能会提供一些见解。

(添加到应用的配置文件中。)

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

【讨论】:

  • 这个应用配置应该如何用于 NANT 构建?
【解决方案3】:

根据您所针对的框架版本,您可能需要查看此处以获取正确的字符串:

http://msdn.microsoft.com/en-us/library/ee517334.aspx

我浪费了好几个小时试图弄清楚为什么我的面向 .Net 4.0 客户端的版本需要完整版本。 我最后用了这个:

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0.30319" 
               sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>

【讨论】:

    【解决方案4】:

    设置 app.config 文件后,Visual Studio 将在名为 App.exe.config 的 bin 文件夹中生成一个副本。在部署期间将其复制到应用程序目录。听起来很明显,但令人惊讶的是,很多人都错过了这一步。 WinForms 开发者不习惯配置文件:)。

    【讨论】:

    • 另一种方法是删除app.config,然后从Project->Add->New项中添加一个新的,然后选择General->Application Configuration File(这和只是创建一个不一样)名为 app.config 的文本文件)
    【解决方案5】:

    同时使用 2.0 和 4.0 程序集并不简单。

    app.config 中支持的框架声明的顺序实际上对抛出混合模式的异常有影响。如果您翻转声明顺序,您将收到混合模式错误。这就是这个答案的目的。

    因此,如果您在 Windows 窗体应用程序中遇到错误,请试试这个,主要是 Windows 窗体应用程序。

      <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/>
        <supportedRuntime version="v2.0.50727"></supportedRuntime>
      </startup>
    

    或者如果项目不是 Windows 窗体。在 Web 项目中将其添加到 web.config 文件中。

      <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
        <supportedRuntime version="v2.0.50727"></supportedRuntime>
      </startup>
    

    【讨论】:

      【解决方案6】:

      能够通过添加具有 "useLegacyV2RuntimeActivationPolicy" 属性集的 "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>
        ......
      ....
      

      【讨论】:

      • version="v2.0" 的那个怎么了?
      • 2.0 需要内部版本号,但 4.0 不需要内部版本号,因此顶级版本不正确。底部是正确的。
      【解决方案7】:

      以上对我不起作用(我正在开发一个网络应用程序)-但这确实...

      编辑文件夹中的 sgen.exe.config 文件(我必须先创建一个); C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 工具 (v7.0文件夹里也有一个,这个不用改,我用的是VS2012)

      XML 的内容应该是这样的(和之前的答案一样)

      <?xml version ="1.0"?>
      <configuration>
          <startup useLegacyV2RuntimeActivationPolicy="true">
              <requiredRuntime safemode="true" imageVersion="v4.0.30319" version="v4.0.30319"/>
          </startup>
      </configuration>
      

      【讨论】:

        【解决方案8】:

        如果您正在使用 Web 服务并且 v2.0 程序集是由 WcfSvcHost.exe 加载的依赖项,那么您必须包含

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

        在 ..\Microsoft Visual Studio 10.0\Common7\IDE\ WcfSvcHost.exe.config 文件中

        这样,Visual Studio 将能够在运行时通过加载器发送正确的信息。

        【讨论】:

          【解决方案9】:

          当我们更改为 Visual Studio 2015 时,我遇到了这个问题。以上答案都不适合我们。最后,我们通过将以下配置文件添加到 机器上的所有 sgen.exe 可执行文件

          来让它工作
          <?xml version ="1.0"?>
              <configuration>
                  <startup useLegacyV2RuntimeActivationPolicy="true">
                      <supportedRuntime version="v4.0" />
                  </startup>    
          </configuration>
          

          尤其是在这个位置,即使我们的目标是 .NET 4.0:

          C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 工具

          【讨论】:

          • 你能说得更具体点吗?您的意思是您将这个配置选项添加到所有现有的 *.config 文件中,还是您为 sgen.exe 创建了一个 .config 文件?
          • 对于我来说,我在使用 Visual Studio 2015 测试项目时遇到了这个问题。这篇文章帮助了我。 devbraindump.wordpress.com/2015/07/29/hello-world
          • @AdamSpicer 我们将此添加到所有 sgen.exe 的所有 .config 文件中。如果不存在,我们创建一个。
          【解决方案10】:

          我使用了这个配置:

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

          为我工作

          【讨论】:

          • 应该是 v2.0.50727,对于 v2.0 版本号是必需的,但对于 v4.0 版本号是不需要的
          【解决方案11】:

          我在升级到 Visual Studio 2015 时遇到了这个问题,这里发布的解决方案都没有任何区别,尽管配置是正确的,但更改的位置不是。我通过添加此配置解决了这个问题:

          <startup useLegacyV2RuntimeActivationPolicy="true">
          </startup>
          

          收件人:C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\TE.ProcessHost.Managed.exe.config

          然后重新启动 Visual Studio。

          【讨论】:

            【解决方案12】:

            经过 3-4 小时的谷歌搜索后,我找到了解决此问题的方法。我添加了以下内容

            <startup selegacyv2runtimeactivationpolicy="true">
              <supportedruntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" />
            </startup>
            

            如果这不能解决您的问题,那么--> 在项目参考Right Click on DLL 中出现错误--> Select Properties--> Check the Run-time Version --> 如果是v2.0.50727,那么我们知道问题。 问题是:-你有2.0 Version of respective DLL. 解决方案是:- 你可以从项目引用delete the respective DLL,然后从相应的网站download the latest version of DLL's,添加最新版本的DLL引用的引用,然后它就可以工作了。

            【讨论】:

            • 这会解决这个问题,因为您假设最新版本的 DLL 是针对较新版本的 .NET 编译的?
            【解决方案13】:

            我遇到了同样的错误,并且一直在将建议的启动语句添加到我的解决方案中的各种配置文件中,试图隔离框架不匹配。没有任何效果。我还添加了startup information to my XML schemas。那也没有帮助。查看导致问题的实际文件(只会说它被“移动或删除”)发现它实际上是许可证编译器 (LC)。

            删除有问题的 licenses.licx 文件似乎解决了问题。

            【讨论】:

              【解决方案14】:

              在将一些代码从 VS 2008 迁移到 VS 2010 时,我遇到了类似的问题 对 App.config 文件进行更改为我解决了这个问题。

              <configuration>
              <startup useLegacyV2RuntimeActivationPolicy="true">
              <supportedRuntime version="v4.0.30319"
                       sku=".NETFramework,Version=v4.0,Profile=Client" />
              </startup>
              </configuration>
              

              【讨论】:

                【解决方案15】:

                在此位置添加以下内容 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64 文件名:sgen.exe.config(如果没有找到这个文件,创建并添加一个)

                 <?xml version ="1.0"?>
                
                <configuration>
                 <runtime>        
                        <generatePublisherEvidence enabled="false"/>    
                    </runtime>
                
                    <startup useLegacyV2RuntimeActivationPolicy="true">
                
                                <supportedRuntime version="v4.0" />
                
                    </startup>    
                
                </configuration>

                这样做解决了问题

                【讨论】:

                  【解决方案16】:

                  我用

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

                  它可以工作,但在 de &lt;/configuration&gt; 标签之前,否则启动标签不能正常工作

                  【讨论】:

                    【解决方案17】:

                    我的类库也有这个问题,如果有人对添加到主应用程序的类库有问题。只需添加

                    <startup useLegacyV2RuntimeActivationPolicy="true">
                    

                    给你的主应用程序,然后由类库选择。

                    【讨论】:

                    • 这是一个不完整的解决方案。配置中的名称区分大小写,而您忘记了 U。
                    猜你喜欢
                    • 2010-12-09
                    • 1970-01-01
                    • 2011-04-19
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-09-22
                    • 1970-01-01
                    相关资源
                    最近更新 更多