Сборка в смешанном режиме [log4net] не будет загружаться в .NET 4.0 и не будет работать при перекомпиляции для .NET 4.0 - PullRequest
2 голосов
/ 17 ноября 2010

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

Мое приложение изначально было написано в VS2008 и предназначалось для .NET 3.5 SP1. Я только что обновился до VS2010 и решил, что постараюсь воспользоваться новыми языковыми функциями и интегрированным MEF, поэтому я изменил все свои проекты на .NET 4.0. После правильной настройки и компиляции всего (например, событий после сборки, ссылок MEF и тому подобного) я запустил свое приложение и получил известную ошибку:

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

Затем я добавил следующий атрибут в мой элемент <startup> в app.config:

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

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

Я также пытался обойти эту проблему, перекомпилировав исходный код log4net для целевой платформы .NET 4.0, но это не сработало так, как я надеялся. После компиляции я получил эту ошибку:

Нарушение правил безопасности наследования при переопределении члена: 'log4net.Util.ReadOnlyPropertiesDictionary.GetObjectData (System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)'. Доступность защищенного метода переопределения должна соответствовать доступности защищенности переопределяемого метода.

Итак, я нашел пост, в котором рекомендовалось добавить следующую строку в AssemblyInfo.cs:

[assembly: System.Security.SecurityRules(System.Security.SecurityRuleSet.Level1)]

И когда я это сделал, я закончил прямо там, где начал! (с ошибкой сборки смешанного режима).

Тьфу.

1 Ответ

0 голосов
/ 19 ноября 2010

В результате я получил все для работы после перекомпиляции исходного кода, нацеленного на .NET 4.0. Мне все еще не нравится это, потому что все говорят, что это должно работать. Единственное, что мне также нужно было сделать, чтобы приложение наконец-то запустилось, это использовать MEF2 из CodePlex, а , а не , встроенный в .NET 4.0. Я не понимаю, почему эти две вещи связаны между собой, но я вернусь и попытаюсь заставить его работать с log4net как есть. Я опубликую детали здесь, как только я закончу, и, надеюсь, это поможет кому-то, кто столкнулся с той же проблемой.

...