Что делает «useLegacyV2RuntimeActivationPolicy» в конфигурации .NET 4? - PullRequest
208 голосов
/ 22 октября 2009

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

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

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

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

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

Ответы [ 2 ]

164 голосов
/ 18 ноября 2009

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

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

123 голосов
/ 18 марта 2010

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

Чтобы процитировать наиболее подходящие биты:

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

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

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

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

...