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

214

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

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

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

<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
Здесь стоит отметить, что в то же время ответ Марклиоса ( stackoverflow.com/questions/1604663/… ) содержит ссылку на подробное объяснение этого изменения.
Штеффен Опель
1
Подробное объяснение этого можно найти в MSDN (хотя в нем явно не упоминается решение, упомянутое выше): msdn.microsoft.com/en-us/magazine/ee819091.aspx
Мухаммед Соуэйдан
Что делать, если я добавил это как в конфигурацию для моего приложения, так и в конфигурацию для моего проекта UnitTest, и я все еще получаю ошибку загрузки файла при выполнении тестов. Должен ли я опубликовать новый вопрос?
CodenameCain
126

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

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

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

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

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

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

Марк Миллер
источник
user20493, можете ли вы запустить свое приложение с переменной среды COMPlus_CLRLoadLogDir, установленной в пустой каталог, к которому у приложения есть доступ для записи, и поделиться полученными журналами (пожалуйста, очистите любой PII перед совместным использованием). Это может помочь объяснить, что происходит. Атрибут config не может быть применен к контексту, в котором работает ваше приложение.
Марк Миллер
Эта ссылка также должна помочь вам понять, в чем заключается проблема, и что решение для вас делает: msdn.microsoft.com/en-us/magazine/ee819091.aspx
Мухаммед Соуэйдан