Проблема с использованием «useLegacyV2RuntimeActivationPolicy» и поддерживаемого времени выполнения в приложении - PullRequest
3 голосов
/ 26 марта 2010

Я изменил файл .config нескольких разных приложений, например:

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

Когда я делал это для devenv.exe.config (VS 2005 - не спрашивайте :)), все работало замечательно - большая часть Visual Studio использовала .NET 2.0, но я смог использовать таргетинг на сборки. NET 4.0 Framework.

Я попытался сделать то же самое для пользовательского .exe, который основан на MS CAB (немного изменен) и имеет гибридное сочетание содержимого WPF и WinForms. Как только я изменил файл конфигурации приложения, я начал получать это исключение, когда-то во время запуска приложения:

Операция Undo обнаружила контекст, отличный от того, который был применен в соответствующей операции Set. Возможная причина в том, что контекст был установлен в потоке, а не восстановлен (отменен). System.InvalidOperationException: операция Undo обнаружила контекст, отличный от того, который был применен в соответствующей операции Set. Возможная причина в том, что контекст был установлен в потоке, а не восстановлен (отменен).

Существует большая длинная трассировка стека, которая не показывает ничего в коде моего приложения напрямую (просто набор сборок MS).

Если я изменю файл приложения .config следующим образом:

<startup useLegacyV2RuntimeActivationPolicy="true">
</startup>

Т.е. я удаляю элемент enabledRuntime, тогда приложение не выдает это исключение. Но когда я перехожу к точке в моем коде, где я пытаюсь загрузить сборку .NET 4, если происходит сбой с этим:

System.BadImageFormatException: не удалось загрузить файл или сборку '' или одну из ее зависимостей. Эта сборка построена средой выполнения, более новой, чем текущая загруженная среда, и не может быть загружена.

Полагаю, это ожидается.

У меня два вопроса:

1) Любая идея, почему я получаю исключение System.InvalidOperationException, когда я изменяю файл конфигурации этого приложения, чтобы включить элемент supportRuntime, добавив поддержку .NET 4 и любые предложения, что я могу с этим сделать?

2) Если ответ «не знаю, почему / не знаю, что вы можете с этим поделать», то мой код .NET 3.5 SP1 (C #) может обеспечить более точную поддержку для условного добавления .NET 4 поддержка времени выполнения для определенной сборки (ий) без преобразования всего моего приложения в целевую .NET 4 или без использования декларативного подхода к файлу конфигурации? В какой-то момент я бы перевел все приложение на целевой .NET 4, но в краткосрочной перспективе это сложная задача, и я надеюсь на какое-то краткосрочное решение / хак.

Большое спасибо за любой совет, который вы можете дать!

1 Ответ

4 голосов
/ 30 марта 2010

Я не совсем уверен, какое поведение вы видите для VS2005, но не должно быть так, что «большинство Visual Studio использовали .NET 2.0, но я смог использовать сборку, нацеленную на .NET». 4.0 рамки ". Этот конфиг должен вызвать все в процессе для запуска на v4. Если это не так, я бы хотел узнать об этом, потому что это скорее всего ошибка. (Кстати, я уверен, что вы понимаете, что находитесь за пределами поддерживаемого сценария, перенеся VS2005 вперед до v4.)

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

Что касается подхода постепенного обновления ... На самом деле нет хорошего ответа. CLR поддерживает автоматическую активацию SxS внутри COM для компонентов COM, поэтому, если ваше приложение реализовано таким образом, что вы можете извлекать модули как компоненты COM, вы можете использовать это. Проблема в том, что большинство приложений написаны не таким образом, и простое обновление всего до v4 - это меньше работы, чем перестройка приложения.

Отдельные нагрузки при сборке возникают во время выполнения, которое вызвало нагрузку. Для нормальной нагрузки сборки нет встроенной активации SxS.

...