混合模式程序集是针对运行时的版本“ v2.0.50727”构建的


163

我收到以下异常:

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

当我试图从WPF程序中导出水晶报表时...

我已经在app.config中添加了以下内容...

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<runtime>
  <NetFx40_LegacySecurityPolicy enabled="true"/>
</runtime>

有专家可以帮助吗???

我找到的参考资料:http : //www.davidmoore.info/2010/12/17/running-net-2-runtime-applications-under-the-net-4-runtime


1
重要信息:如果错误发生时错误列“ 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

1
请注意,您可能不仅具有“ C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6 Tools \”,而且在该目录下还具有一个sgen的“ x64”目录。 exe,以及sgen的其他几个副本/版本,它们都位于不同的路径中,具体取决于您安装了VS的数量和版本。
MickeyfAgain_BeforeExitOfSO

@ToolmakerSteve请发表您的评论作为答案,以便我投票;其他答案都没有帮助我。
Malcolm

Answers:


237

尝试在配置节点下的app.config中使用此确切的启动标记

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

2
实际上,您应该将棘手的行添加到YourApp。** exe **。config。
AntonK 2012年

24
那就是app.config。编译器将在构建时将其重命名。
杰夫

65
唯一需要的部分是useLegacyV2RuntimeActivationPolicy =“ true”。您可以保留当前的框架版本。
本·格里普卡

3
当Ben说时,我可以加倍,我省去了额外的requiredRuntime,而我的问题就消失了。
Mike Malter 2013年

1
此链接还应该帮助您了解问题所在,以及该解决方案正在为您做什么:msdn.microsoft.com/en-us/magazine/ee819091.aspx
Mouhammed Soueidane 2014年

85

该异常清楚地表明.NET 4.0中包含了某些.NET 2.0.50727组件。在App.config文件中使用以下命令:

<startup useLegacyV2RuntimeActivationPolicy="true" /> 

它解决了我的问题


这需要一个斜杠<startup useLegacyV2RuntimeActivationPolicy="true" />
Jonn

8

请在应用程序app.config文件中添加属性useLegacyV2RuntimeActivationPolicy =“ true”。

旧值

  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1"/>
  </startup>

新价值

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

它将解决您的问题。


很高兴知道它对您有用。谢谢你的评论 !
Brijesh Kumar Tripathi

4

实际上,我对解有同样的问题。我已经将.NET项目升级到.NET 4.0,然后又还原到.NET 3.5。我项目中的app.config继续存在以下导致上述问题的错误:

<startup>
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>

解决此错误的方法是将其还原为正确的2.0参考,如下所示:

<startup>
  <supportedRuntime version="v2.0.50727"/>
</startup>

因此,如果降级导致上述错误,则可能需要备份.NET Framework支持的版本。


1

对我来说,这是在MSTest(VS2015)下运行单元测试时抛出的。必须添加

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

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

VS2015中的混合模式汇编MSTest失败


1

从app.config启用旧版本对我不起作用。由于未知原因,我的应用程序未激活V2运行时策略。我发现周围的工作在这里

建议从app.config启用旧版,但是在某些情况下,它不能按预期工作。在主应用程序中使用以下代码来强制执行旧版V2策略:

public static class RuntimePolicyHelper
{
public static bool LegacyV2RuntimeEnabledSuccessfully { get; private set; }

static RuntimePolicyHelper()
{
    ICLRRuntimeInfo clrRuntimeInfo =
        (ICLRRuntimeInfo)RuntimeEnvironment.GetRuntimeInterfaceAsObject(
            Guid.Empty, 
            typeof(ICLRRuntimeInfo).GUID);
    try
    {
        clrRuntimeInfo.BindAsLegacyV2Runtime();
        LegacyV2RuntimeEnabledSuccessfully = true;
    }
    catch (COMException)
    {
        // This occurs with an HRESULT meaning 
        // "A different runtime was already bound to the legacy CLR version 2 activation policy."
        LegacyV2RuntimeEnabledSuccessfully = false;
    }
}

[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("BD39D1D2-BA2F-486A-89B0-B4B0CB466891")]
private interface ICLRRuntimeInfo
{
    void xGetVersionString();
    void xGetRuntimeDirectory();
    void xIsLoaded();
    void xIsLoadable();
    void xLoadErrorString();
    void xLoadLibrary();
    void xGetProcAddress();
    void xGetInterface();
    void xSetDefaultStartupFlags();
    void xGetDefaultStartupFlags();

    [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
    void BindAsLegacyV2Runtime();
}
}

1

尝试使用另一个配置文件(而不是项目中的一个),然后重新启动Visual Studio:

C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.executionengine.x86.exe.config
(32-bit)

要么

C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.executionengine.exe.config
(64-bit)

我将对此进行扩展,因为绕过.config驻留在应用程序中的本机并且通常需要其他应用程序配置不是一个好的解决方案。
atconway 2014年

3
对于单元测试,必须在vstest.executionengine.x86.exe.config文件中进行配置更改,因为该可执行文件是您正在测试的代码的父进程。该问题据说已在Visual Studio 2012 SP4中修复,但仍在我的计算机上存在。
布兰登S

(请注意,您不必重新启动Visual Studio即可使更改生效。您只需要结束vstest。*进程上的任务,因为即使在单元测试完成后,这些任务仍会挂起。)
Brandon S

鼓励这样做,因为它使我到达了必须更改此位置的实际位置。
Janis S.

1

如果错误发生时错误列“ 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。最小文件内容:<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>

资料来源:SGEN混合模式组装

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.