2013-05-06 4 views
3

В чем разница между тремя следующими сценариями (в файлах app.config exe)?В чем разница между использованием useLegacyV2RuntimeActivationPolicy и несколькими поддерживаемыми Runtimes

<startup> 
    <supportedRuntime version="v4.0" /> 
    <supportedRuntime version="v2.0" /> 
</startup> 


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


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

Я прочитал документацию MS на нем и некоторые блоги, но она до сих пор не очень понятно, для меня именно то, что происходит, и когда использовать который.

EDIT
У меня есть ситуации, когда стороннее приложение было скомпилировано с CLR 2 (а также использует устаревшую COM) и разрешенные расширения, которые я сделал для приложения компилируются с CLR 4. Так , перекомпиляция приложения для меня не вариант. Мне просто нужно знать влияние трех сценариев.

+1

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Третий сценарий, действительно, самый лучший. Это эффективно решает проблему. Красиво сделано. Это повлияло на то, что у меня было на производстве, поэтому решение помогло мне быстро исправить ситуацию. –

ответ

4

Атрибут useLegacyV2RuntimeActivationPolicy - это немного копирование. Установка этого значения в true позволяет программе .NET 4 загружать сборки смешанного режима (C++/CLI) или [ComVisible] .NET, которые явно заявили в реестре, что им нужна версия 2.0.50727 среды выполнения. Это не будет иметь никакого значения, если у вас нет таких сборок, они довольно редки. Здравый смысл - не использовать его, вы получите сообщение об ошибке, когда это потребуется. FileLoadException сообщение которого выглядит следующим образом:

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

Следующая нормальная задача - перестроить такие сборки для целевой .NET 4. Последнее, что вы делаете, это использовать этот атрибут.

Если вы предлагаете несколько версий CLR, как и в первых двух фрагментах, вы получите тот, который EXE запрашивает в своем манифесте. Последний силы версия v4. Подразумевается, что вы потенциально будете запускать код, который только когда-либо тестировался на CLR v2 в другой среде исполнения .NET. Это почти всегда будет хорошим, v4 очень совместим с v2. Но они воспользовались возможностью исправить ошибки в версии 4. Вы можете случайно зависеть от поведения с ошибкой. Очень редко.

+0

Сборка не обязательно должна быть 'ComVisible' - это также необходимо при загрузке сборников C++/CLI с таргетингом на .NET 3.5, например ... –

+0

На пример это' Microsoft.SqlServer.BatchParser.dll' из/для продукт SQL Server 2008 R2. Это сборка смешанного режима, скомпилированная с .NET 2.0, и вам нужно использовать 'useLegacyV2RuntimeActivationPolicy' для' true' для использования с сборкой .NET 4.0. –

2

supportedRuntime указывает, какое время выполнения используется для фактического запуска и выполнения самого приложения. Если вы установите для этого значение v4.0, то для запуска приложения будет использовано время исполнения 4.0 clr. Добавление v2.0 и v4.0 говорит, что вы разрешите запуск среды CLR 2 или 4 для запуска приложения.

Опция изменяет поведение при загрузке сборки, ориентированной на среду выполнения CLR 2, из приложения, выполняющегося во время выполнения CLR 4. Когда он установлен в true, для загрузки сборки CLR 2 будет использоваться среда выполнения 4.0. Это в основном требуется, если вы загружаете сборку смешанного режима, ориентированную на CLR 2 в рамках проекта CLR 4, поскольку в противном случае вы получите ошибку.