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


525

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

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

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

需要什么“附加配置”?




重要信息:如果错误发生在错误列“ File”为SGEN,则修复需要在sgen.exe.config旁边的文件中sgen.exe。例如,对于VS 2015,请创建C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\sgen.exe.config。来源: SGEN混合模式组件 最小文件内容:<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>
ToolmakerSteve

Answers:


685

为了使用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)程序集有效。您可以加载所有托管CLR 2程序集,而无需在中指定app.config


@Reed我已经尝试了您的建议,但是仍然弹出异常。我已经仔细检查了复制到我的EXE文件夹中的app.config,它仍然不起作用。使用log4net时出现。除了以下错误,我找不到任何有关此错误的信息:log4net ,但此处:stackoverflow.com/questions/1866735/log4net-and-net-4-0,但并没有说明太多。关于如何获取有关特定问题的更多信息的任何想法?
戴夫

@Dave:这表明您可以只使用log4net的.NET 4本机版本-这似乎是最好的选择。如果有.NET 4版本,请使用它...
Reed Copsey 2010年

@Reed没有,我实际上将这个答案解释为意味着您必须自己编译log4net。我想我可以做到,但是我宁愿只使用他们的预编译二进制文件并从我的项目中引用它。我会再研究一下。但是您能想到为什么更改app.config不能使其起作用吗?我以为也许我不得不使用programname.exe.config,但是我也尝试过,但是它没有用。以我有限的经验,这两个文件名都做同样的事情。
戴夫

19
帮助我将这一行添加到NUnit的配置文件中的原因:<startup useLegacyV2RuntimeActivationPolicy =“ true”> <supportedRuntime version =“ v4.0” /> <requiredRuntime version =“ v4.0.20506” /> </ startup>
Filip Zawada

76
Microsoft应该在异常对话框中创建一个按钮:“在stackoverflow上搜索此异常消息”
Davi Fiamenghi 2013年

35

.NET Framework开发人员中心上的此论坛帖子。它可能提供一些见识。

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

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

2
此应用程序配置应如何用于NANT构建?
sagar

14

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

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>

11

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


另一种方法是删除app.config,然后从Project-> Add-> New项目中添加一个新文件,然后选择General-> Application Configuration File(这与仅创建一个名为app.config的文本文件不同)
smirkingman

8

一起使用2.0和4.0程序集并不是很简单。

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

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

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

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

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

7

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

1
一个人怎么了version="v2.0"
SamB 2015年

1
内部版本号对于2.0是必需的,但对于4.0不是必需的,因此顶级版本不正确。底部是正确的。
ickydime '16

5

上面的代码对我没有用(我正在使用网络应用程序)-但这确实...

编辑文件夹中的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>

5

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


4

当我们更改为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
Adam Spicer

1
@AdamSpicer我们将此添加到所有sgen.exe的所有.config文件中。如果不存在,我们创建一个。
运行CMD

3

我使用了这个配置:

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

为我工作


3
应该是v2.0.50727,对于v2.0内部版本号是必需的,但对于v4.0内部版本号则不是必需的
linquize 2012年

1

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


0

经过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从Project引用中,然后download the latest version of DLL's从相应的网站添加最新版本DLL引用的引用,然后它将起作用。


1
这将解决此问题,因为您假设最新版本的DLL是针对较新版本的.NET编译的?
卢卡斯

0

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

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


0

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

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

0

在此位置添加以下文件: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>

这样做解决了问题


0

我用

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

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


-1

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

<startup useLegacyV2RuntimeActivationPolicy="true">

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


这是一个不完整的解决方案。在配置名称是区分大小写的,你忘了U.
查迪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.