Що робить "useLegacyV2RuntimeActivationPolicy" у конфігурації .NET 4?


214

Під час перетворення проекту, який використовував SlimDX і, отже, некерований код, у .NET 4.0 я зіткнувся з такою помилкою:

Збірка змішаного режиму побудована на основі версії 'v2.0.50727' під час виконання і не може бути завантажена в режимі виконання 4.0 без додаткової інформації про конфігурацію.

Гугл навколо дав мені рішення, яке полягає в тому, щоб додати це до конфігурації програм:

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

Моє запитання: що useLegacyV2RuntimeActivationPolicyробити? Я не можу знайти жодної документації про це.

Відповіді:


165

Через трохи часу (і більше пошуку) я знайшов цю запис у блозі Джомо Фішера.

Однією з останніх проблем, які ми зустрічали, є те, що через підтримку одночасного виконання, .NET 4.0 змінив спосіб, який він прив'язує до старих збірок змішаного режиму. Ці збірки є, наприклад, тими, які складені з C ++ \ CLI. Наразі доступні збірки DirectX є змішаним режимом. Якщо ви бачите таке повідомлення, то знаєте, що зіткнулися з проблемою:

Збірка змішаного режиму побудована на основі версії 'v1.1.4322' під час виконання і не може бути завантажена в режимі виконання 4.0 без додаткової інформації про конфігурацію.

[Знімок]

Хороша новина для додатків полягає в тому, що у вас є можливість повернутися до прив’язки епохи .NET 2.0 для цих збірок, встановивши прапор app.config таким чином:

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

Так виглядає те, як змінився час завантаження збірок змішаного режиму. Я не можу знайти жодних деталей щодо цієї зміни або чому це було зроблено. Але useLegacyV2RuntimeActivationPolicyатрибут повертається до завантаження CLR 2.0.


28
Варто відзначити тут , що тим часом marklios відповісти ( stackoverflow.com/questions/1604663 / ... ) забезпечує зв'язок з його повного пояснення по приводу цієї зміни.
Steffen Opel

1
Ретельне пояснення цього можна знайти на MSDN (хоча в ньому прямо не згадується рішення, згадане вище): msdn.microsoft.com/en-us/magazine/ee819091.aspx
Mouhammed Soueidane

Що робити, якщо я додав це до конфігурації для моєї програми та конфігурації для мого проекту UnitTest, і я все одно отримую помилку завантаження файлу під час запуску тестів. Чи варто розмістити нове запитання?
CodenameCain

126

Ось пояснення, яке я написав нещодавно, щоб допомогти проти неприємності інформації про цей атрибут. http://www.marklio.com/marklio/PermaLink,guid,ecc34c3c-be44-4422-86b7-900900e451f9.aspx (посилання на Інтернет-архів Wayback Machine Machine)

Процитуйте найрелевантніші біти:

[Встановлення .NET] v4 "не впливає". Він не повинен змінювати поведінку існуючих компонентів при встановленні.

Атрибут useLegacyV2RuntimeActivationPolicy в основному дозволяє вам сказати: "У мене є деякі залежності від застарілих API-програм shim. Будь ласка, змусьте їх працювати так, як вони звикли стосовно обраного часу виконання ».

Чому ми не зробимо це поведінкою за замовчуванням? Ви можете стверджувати, що така поведінка є більш сумісною та значно полегшує перенесення коду з попередніх версій. Якщо ви пам’ятаєте, це не може бути поведінкою за замовчуванням, оскільки це зробить встановлення v4 вражаючим, що може зламати існуючі програми, встановлені на вашій машині.

Повний пост пояснює це детальніше. У RTM документи MSDN щодо цього повинні бути кращими.


user20493, чи можете ви запустити додаток зі змінною оточення COMPlus_CLRLoadLogDir, встановленою в порожній каталог, програма має доступ до запису та ділитися отриманими журналами (будь-ласка, прокручуйте будь-який PII перед поділом). Це може допомогти пояснити, що відбувається. Атрибут config може не застосовуватися до контексту, в якому працює ваша програма.
Марк Міллер

Це посилання також повинно допомогти вам зрозуміти, у чому полягає проблема, і що вирішує для вас рішення: msdn.microsoft.com/en-us/magazine/ee819091.aspx
Мухаммед Судейдан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.