Збірка змішаного режиму побудована на основі версії '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
ВАЖЛИВО: Якщо помилка трапиться із стовпцем помилки як "Файл" як 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 Інструменти \", але під цим каталогом "x64", який також містить sgen. EXE і, можливо, кілька інших копій / версій sgen, всі в різних контурах, залежно від того, скільки та які версії VS ви встановили.
MickeyfAgain_BeforeExitOfSO

@ToolmakerSteve Будь ласка, опублікуйте свій коментар як відповідь, щоб я міг його схвалити; жодна з інших відповідей мені не допомогла.
Малькольм

Відповіді:


238

Спробуйте використовувати цей точний тег запуску у вашому app.config під вузлом конфігурації

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

2
Насправді вам слід додати складні рядки до конфігурації YourApp. ** exe **.
AntonK

24
Це app.config. Компілятор буде перейменовувати його при складанні.
Джефф

65
Єдина частина, яка необхідна - це useLegacyV2RuntimeActivationPolicy = "вірно". Ви можете залишити поточну версію рамки.
Бен Грипка

3
Я можу подвоїтися, коли каже Бен, я залишив додатковий необхідний час виконання, і моя проблема пішла.
Майк Малтер

1
Це посилання також повинно допомогти вам зрозуміти, в чому проблема, і що вирішує
Мухаммед Судейдан

85

Виняток чітко визначає, який компонент .NET 2.0.50727 був включений до .NET 4.0. У файлі App.config використовуйте це:

<startup useLegacyV2RuntimeActivationPolicy="true" /> 

Це вирішило мою проблему


Для цього потрібна коса риса<startup useLegacyV2RuntimeActivationPolicy="true" />
Jonn

8

Додайте атрибут useLegacyV2RuntimeActivationPolicy = "true" у файл програми.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



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, але вона все ще присутня на моїй машині.
Брендон S

(Зверніть увагу, що вам не доведеться перезавантажувати 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.