我收到以下异常:
混合模式程序集是针对运行时版本“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
SGEN
,则修复需要位于 sgen.exe
旁边的文件 sgen.exe.config
中。例如,对于 VS 2015,创建 C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\sgen.exe.config
。来源:SGEN Mixed mode assembly 最小文件内容:<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>
尝试在配置节点下的 app.config 中使用这个确切的启动标记
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
<requiredRuntime version="v4.0.20506" />
</startup>
该异常清楚地表明某些 .NET 2.0.50727 组件包含在 .NET 4.0 中。在 App.config 文件中使用:
<startup useLegacyV2RuntimeActivationPolicy="true" />
它解决了我的问题
<startup useLegacyV2RuntimeActivationPolicy="true" />
请在您的应用程序 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>
它会解决你的问题。
实际上,我在逆解决方案中遇到了同样的问题。我已将 .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 支持的版本。
如果错误发生在作为 SGEN 的错误列“文件”中,则修复需要位于 sgen.exe
旁边的文件 sgen.exe.config
中。例如,对于 VS 2015,创建 C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\sgen.exe.config
。最小文件内容:<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>
从 app.config 启用旧版对我不起作用。由于未知原因,我的应用程序没有激活 V2 运行时策略。我在 here 附近找到了一份工作。
从 app.config 启用旧版是一种推荐的方法,但在某些情况下它不能按预期工作。在您的主应用程序中使用以下代码来强制 Legacy 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();
}
}
对我来说,这是在 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
Mixed-Mode Assembly MSTest Failing in VS2015
尝试使用另一个配置文件(不是您项目中的配置文件)并重新启动 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
并不是一个好的解决方案。