繁体   English   中英

在 .NET 4.0 项目中引用 .NET 2.0 混合模式程序集需要什么“附加配置”?

[英]What 'additional configuration' is necessary to reference a .NET 2.0 mixed mode assembly in a .NET 4.0 project?

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

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

混合模式程序集是针对运行时的“v2.0.50727”版本构建的,如果没有附加配置信息,则无法在 4.0 运行时中加载。

需要什么“额外配置”?

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

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

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

请注意,这仅适用于混合模式 (C++/CLI) 程序集。 无需在app.config指定即可加载所有托管 CLR 2 程序集。

论坛帖子位于 .NET Framework 开发人员中心。 它可能会提供一些见解。

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

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

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

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>

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

一起使用 2.0 和 4.0 程序集并不是很直接。

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

因此,如果您在 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>

能够通过添加具有“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>
  ......
....

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

编辑文件夹中的 sgen.exe.config 文件(我必须先创建一个); C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v8.0A\\bin\\NETFX 4.0 Tools(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>

如果您在 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 将能够在运行时通过加载程序发送正确的信息。

当我们更改为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 工具

我使用了这个配置:

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

为我工作

我在升级到 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。

在谷歌搜索 3-4 小时后,我找到了解决方法。 我添加了以下内容

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

如果这不能解决您的问题,则--> 在项目引用中Right Click on DLL出现错误的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 引用的引用,然后它就可以工作了。

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

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

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

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

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

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

这样做解决了问题

我用

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

它可以工作,但就在 de </configuration>标签之前,否则启动标签无法正常工作

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

<startup useLegacyV2RuntimeActivationPolicy="true">

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM