关于C#:在.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功能,但核心要求是我可以使用System.Data.sqlite框架,它是根据2.x编译的。我看到这里提到这是可能的,例如这里接受的答案,但我不知道如何实际实现这一点。

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

Mixed mode assembly is built against version 'v2.0.50727' of the runtime
and cannot be loaded in the 4.0 runtime without additional
configuration information.

需要什么"附加配置"?


要使用clr 2.0混合模式程序集,需要修改app.config文件以包括:

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

密钥是useLegacyV2RuntimeActivationPolicy标志。这将导致CLR使用最新版本(4.0)加载混合模式程序集。没有这个,它就不起作用。

注意,这只是混合模式(C++/CLI)程序集的问题。您可以加载所有托管的clr 2程序集,而不必在app.config中指定它。


此论坛发布在.NET Framework开发中心。它可能提供一些见解。

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

1
2
3
4
5
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>


根据目标框架的版本,您可能希望在此处查找正确的字符串:

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

我浪费了很多时间试图弄明白为什么我的面向.NET 4.0客户机的版本需要完整的版本。最后我用了这个:

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

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


将2.0和4.0组件一起使用并不是很直接。

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

因此,如果在Windows窗体应用程序中出现错误,请尝试此操作,主要是Windows窗体应用程序。

1
2
3
4
  <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文件。

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

通过添加"uselegacyv2runtimeactivationpolicy"属性集的"startup"元素可以解决此问题。

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

但必须将其作为configuration标记的第一个子元素放到app.config中才能生效。

1
2
3
4
5
6
7
8
<?xml version="1.0"?>
  <configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
      <supportedRuntime version="v2.0.50727"/>
    </startup>
  ......
....


如果您在Web服务中工作,并且v2.0程序集是由wcfsvchost.exe加载的依赖项,则必须包括

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

在..Microsoft Visual Studio 10.0Common7IDEwcfsvchost.exe.config文件中

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


上面的内容对我不起作用(我正在开发一个网络应用程序),但这确实…

编辑文件夹中的sgen.exe.config文件(我必须先创建一个);C:Program Files(x86)Microsoft SDKWindowsV8.0Ainetfx 4.0工具(V7.0文件夹中也有一个,但我不需要更改它,我使用的是VS2012)

XML的组成部分应该如下所示(在前面的答案中相同)

1
2
3
4
5
6
<?xml version ="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <requiredRuntime safemode="true" imageVersion="v4.0.30319" version="v4.0.30319"/>
    </startup>
</configuration>

当我们改为Visual Studio 2015时,我遇到了这个问题。以上的答案对我们都不起作用。最后,我们将以下配置文件添加到计算机上的所有sgen.exe可执行文件中,使其正常工作。

1
2
3
4
5
6
<?xml version ="1.0"?>
    <configuration>
        <startup useLegacyV2RuntimeActivationPolicy="true">
            <supportedRuntime version="v4.0" />
        </startup>    
</configuration>

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

C:程序文件(x86)Microsoft SDKWindowsv10.0ainetfx 4.6工具


我使用这个配置:

1
2
3
4
<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v2.0"/>
    <supportedRuntime version="v4.0"/>
</startup>

为我工作


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

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

收件人:C:Program Files(x86)Microsoft Visual Studio 14.0Common7IDECommonExtensionsMicrosoft estwindow e.processhost.managed.exe.config

然后重新启动了Visual Studio。


在此位置添加以下内容C:Program Files(x86)Microsoft SDKWindowsv7.0ainetfx 4.0 toolsx64文件名:sgen.exe.config(如果找不到该文件,请创建并添加一个)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 <?xml version ="1.0"?>

<configuration>
 <runtime>        
        <generatePublisherEvidence enabled="false"/>    
    </runtime>

    <startup useLegacyV2RuntimeActivationPolicy="true">

                <supportedRuntime version="v4.0" />

    </startup>    

</configuration>

这样做解决了问题


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

1
2
3
<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引用的引用,这样它就可以工作了。


我也遇到了同样的错误,我花了很多时间将建议的启动语句添加到我的解决方案中的各种配置文件中,试图隔离框架不匹配。什么都没用。我还向我的XML模式添加了启动信息。这也没用。查看导致问题的实际文件(只会说它是"移动或删除的"),发现它实际上是许可证编译器(LC)。

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


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

1
2
3
4
5
6
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0.30319"
         sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>
</configuration>

另外,如果有人对添加到您的主应用程序中的类库有问题,那么我对类库也有这个问题。只要添加

1
<startup useLegacyV2RuntimeActivationPolicy="true">

主应用程序将由类库选择。