Что делает 'useLegacyV2RuntimeActivationPolicy' в конфигурации .NET 4?
-
05-07-2019 - |
Вопрос
При преобразовании проекта, который использовал SlimDX и, следовательно, имеет неуправляемый код, в .NET 4.0 я столкнулся со следующей ошибкой:
Сборка смешанного режима построена на основе версии 'v2.0.50727' среды выполнения и не может быть загружена в среду выполнения 4.0 без дополнительной информации о конфигурации.
Поиск в Google дал мне решение, которое заключается в добавлении этого в конфигурацию приложений:
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
Мой вопрос в том, что такое useLegacyV2RuntimeActivationPolicy
делаешь?Я не могу найти никакой документации по этому поводу.
Решение
Спустя некоторое время (и еще больше поисков) я нашел эта запись в блоге автор: Джомо Фишер.
Одна из недавних проблем, с которыми мы столкнулись, заключается в том, что из-за поддержки параллельных сред выполнения .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://www.marklio.com/marklio/PermaLink,guid,ecc34c3c-be44-4422-86b7-900900e451f9.aspx (ссылка на механизм возврата в интернет-архив)
Чтобы процитировать наиболее подходящие биты:
[Установка .NET] v4 является & # 8220; без последствий & # 8221 ;. Он не должен изменять поведение существующих компонентов при установке.
Атрибут useLegacyV2RuntimeActivationPolicy в основном позволяет сказать: «У меня есть некоторые зависимости от устаревших API-интерфейсов shim. Пожалуйста, заставьте их работать так, как они привыкли в отношении выбранной среды выполнения. & # 8221;
Почему мы не устанавливаем это поведение по умолчанию? Вы можете утверждать, что это поведение более совместимо и значительно упрощает перенос кода из предыдущих версий. Если вы помните, это не может быть поведением по умолчанию, поскольку это может повлиять на установку v4, что может привести к поломке существующих приложений, установленных на вашем компьютере.
Полный пост объясняет это более подробно. В RTM документы MSDN по этому вопросу должны быть лучше.