Что делает "useLegacyV2RuntimeActivationPolicy" в конфигурации .NET 4?

При преобразовании проекта, который использовал SlimDX и, следовательно, имел неуправляемый код, в .NET 4.0 я столкнулся со следующей ошибкой:

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

Googling around дал мне решение, которое должно добавить это в конфигурацию приложений:

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

Мой вопрос: что делает useLegacyV2RuntimeActivationPolicy? Я не могу найти документацию об этом.

Ответ 1

Через некоторое время (и больше поиска) я нашел эту запись в блоге от Jomo Fisher.

Одна из недавних проблем, которые мы видели, заключается в том, что из-за поддержки параллельных версий .NET 4.0 изменил способ привязки к старым сборкам смешанного режима. Эти сборки представляют собой, например, те, которые скомпилированы из С++\CLI. Доступные в настоящее время сборки DirectX представляют собой смешанный режим. Если вы видите такое сообщение, вы знаете, что столкнулись с проблемой:

Комбинация смешанного режима построена по сравнению с версией "v1.1.4322" среды выполнения и не может быть загружена в среду выполнения 4.0 без дополнительной информации о конфигурации.

[Снип]

Хорошей новостью для приложений является то, что у вас есть возможность вернуться к привязке эры .NET 2.0 для этих сборок, установив флаг app.config следующим образом:

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

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

Ответ 2

Вот объяснение, которое я написал недавно, чтобы помочь с пустой информацией об этом атрибуте. http://www.marklio.com/marklio/PermaLink,guid,ecc34c3c-be44-4422-86b7-900900e451f9.aspx (ссылка на канал интернет-архива)

Для цитирования наиболее релевантных бит:

[Установка .NET] v4 является "недействительным". Он не должен изменять поведение существующих компонентов при установке.

Атрибут useLegacyV2RuntimeActivationPolicy в основном позволяет вам сказать: "У меня есть некоторые зависимости от устаревших API-интерфейсов прокладки. Пожалуйста, заставьте их работать так, как они привыкли в отношении выбранной среды выполнения".

Почему мы не делаем это по умолчанию? Вы можете утверждать, что это поведение более совместимо и значительно упрощает перенос кода из предыдущих версий. Если вы вспомните, это не может быть по умолчанию, потому что это сделает установку v4 эффективной, что может нарушить существующие приложения, установленные на вашем компьютере.

Полный пост объясняет это более подробно. В RTM документы MSDN на этом должны быть лучше.