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

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

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

Поиск в Google дал мне решение, которое состоит в том, чтобы добавить это в конфигурацию приложений:

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

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

2 ответа

Решение

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

Одна из недавних проблем, с которыми мы столкнулись, заключается в том, что благодаря поддержке параллельных сред выполнения.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.

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

Чтобы процитировать наиболее важные биты:

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

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

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

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

Другие вопросы по тегам