Сборка в смешанном режиме строится против версии v2.0.50727 среды выполнения

163

Я получаю следующее исключение:

Сборка в смешанном режиме выполняется на основе версии v2.0.50727 среды выполнения и не может быть загружена в среде выполнения 4.0 без дополнительной информации о конфигурации.

как я пытался экспортировать отчет Crystal из моей программы 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
ВАЖНО: Если ошибка возникает с ошибкой столбца «Файл» как 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 \», но также и каталог «x64», в котором также есть sgen. exe и, возможно, несколько других копий / версий sgen по разным путям, в зависимости от того, сколько и какие версии VS вы установили.
MickeyfAgain_BeforeExitOfSO
@ ToolmakerSteve Пожалуйста, оставьте свой комментарий в качестве ответа, чтобы я мог проголосовать за него; ни один из других ответов не помог мне.
Малкольм
@Malcolm - ОК, отправил в ответ
ToolmakerSteve

Ответы:

238

Попробуйте использовать этот точный тег запуска в вашем app.config под узлом конфигурации

<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    <requiredRuntime version="v4.0.20506" />
  </startup>
Talha
источник
2
На самом деле вы должны добавить сложные строки в YourApp. ** exe **. Config.
AntonK
24
Это app.config. Компилятор переименует его при сборке.
Джефф
65
Единственная необходимая часть - это useLegacyV2RuntimeActivationPolicy = "true". Вы можете оставить текущую версию фреймворка.
Бен Грипка
3
Я могу удвоить, когда Бен говорит, я пропустил дополнительное необходимое время, и моя проблема ушла.
Майк Малтер
1
Эта ссылка также должна помочь вам понять, в чем заключается проблема, и что решение для вас делает: msdn.microsoft.com/en-us/magazine/ee819091.aspx
Мухаммед Соуэйдан
85

Исключение четко указывает на то, что некоторые компоненты .NET 2.0.50727 были включены в .NET 4.0. В файле App.config используйте это:

<startup useLegacyV2RuntimeActivationPolicy="true" /> 

Это решило мою проблему

Bibaswann Bandyopadhyay
источник
Для этого нужен закрывающий слеш<startup useLegacyV2RuntimeActivationPolicy="true" />
Джон
8

Пожалуйста, добавьте атрибут useLegacyV2RuntimeActivationPolicy = "true" в файл приложения app.config.

Старая ценность

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

Это решит вашу проблему.

Бриеш Кумар Трипати
источник
Приятно знать, что это сработало для вас. Спасибо за ваш комментарий !
Бриеш Кумар Трипати
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.

atconway
источник
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

Сборка смешанного режима MSTest Failing в VS2015

Янис С.
источник
1

Включение наследства из app.config не сработало для меня. По неизвестным причинам мое приложение не активировало политику времени выполнения V2. Я нашел работу вокруг здесь .

Рекомендуется использовать наследие из 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();
}
}
Талха Имам
источник
1

Попробуйте использовать другой файл конфигурации (не тот, что в вашем проекте) и RESTART 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
3
Для модульных тестов изменение конфигурации должно происходить в файле vstest.executionengine.x86.exe.config, поскольку этот исполняемый файл является родительским процессом тестируемого кода. Эта проблема предположительно была исправлена ​​в Visual Studio 2012 SP4, но она все еще присутствует на моей машине.
Брэндон С
(Обратите внимание, что вам не нужно перезапускать Visual Studio, чтобы изменения вступили в силу. Вам просто нужно завершить задачу в процессах vstest. *, Потому что они зависают даже после завершения ваших модульных тестов.)
Brandon S
Повышение этого, поскольку это привело меня к фактическому месту, где я должен был изменить это.
Янис С.
1

Если ошибка возникает в столбце ошибок «Файл» в качестве 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 Сборка смешанного режима

ToolmakerSteve
источник