什么'额外配置'在.NET 4.0项目中引用.NET 2.0混合模式程序集是必要的吗?

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

当我只是试图运行我的4.0项目,同时引用2。我得到:

混合模式程序集是根据运行时版本'v2.0.50727'构建的 并且不能在4.0运行时加载 配置信息。< / em > < / p >

需要什么“额外配置”?

183666 次浏览

为了使用CLR 2.0 混合模式装配,你需要修改你的App.Config文件,包括:

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

The key is the useLegacyV2RuntimeActivationPolicy flag. This causes the CLR to use the latest version (4.0) to load your mixed mode assembly. Without this, it will not work.

Note that this only matters for mixed mode (C++/CLI) assemblies. You can load all managed CLR 2 assemblies without specifying this in app.config.

这个论坛帖子在. net框架开发中心。这可能会提供一些见解。

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

<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>

我使用这样的配置:

<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v2.0"/>
<supportedRuntime version="v4.0"/>
</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。配置文件。

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

能够通过添加“启动”元素和“useLegacyV2RuntimeActivationPolicy”属性集来解决这个问题。

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

# EYZ0。

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

上面的方法对我没用(我正在开发一个web应用程序)——但是这个方法有用……

编辑文件夹中的sgen.exe.config文件(我必须先创建一个); C:\Program Files (x86)\Microsoft sdk \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>

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

经过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引用,然后它就会工作

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

<startup useLegacyV2RuntimeActivationPolicy="true">

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

当我们更改为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 sdk \Windows\v10.0A\bin\NETFX 4.6 Tools

我也遇到过同样的错误,花了很长时间将建议的启动语句添加到我的解决方案中的各种配置文件中,试图隔离框架不匹配。毫无效果。我还添加了XML模式的启动信息。这也无济于事。查看导致问题的实际文件(只会说它被“移动或删除”),发现它实际上是许可编译器(LC)。

删除有问题的license。Licx文件似乎已经解决了这个问题。

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

我在将一些代码从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 文件名: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>标签之前,否则启动标签不能正常工作