Мне нужно настроить таргетинг на .NET Framework 4.0 с помощью Visual Studio 2012 и убедиться, что мой код будет работать правильно при развертывании в нашей среде 4.0 (Windows Server 2003).
Мультитаргетинг в Visual Studio 2012 работает правильно, но только для mscorlib.dll
. При ссылке на любую другую библиотеку DLL для компиляции вы получаете правильные ошибки, например. ссылка на тип, который не существует в версии 4.0, но версия DLL версии 4.5 загружается во время выполнения и отладки.
Это делает невозможным проверку того, что мой код будет правильно работать в производственной среде, учитывая критические изменения в обновлении на месте, которое было сделано в версии 4.5 фреймворка.
Я провел несколько модульных тестов, чтобы протестировать функциональность множественного таргетинга, проверив некоторые различия между 4.0 и 4.5, найденные на MSDN. Тесты содержатся в собственных проектах, ориентированных на версию фреймворка, которую они тестируют. Все тесты должны пройти успешно.
Тесты против MSCORLIB
Эти тесты проходят успешно, так как List<string>
находится в mscorlib.dll
:
Framework 4.0: -проходит-
[TestMethod]
public void List_Foreach_should_not_throw_if_list_is_modified() {
var list = new List<string> { "This", "here", "be", "a", "list", "of", "strings" };
list.ForEach((s) => {
if (s.Equals("be", StringComparison.OrdinalIgnoreCase)) {
list.Add(".");
}
});
}
Структура 4.5: -проходит-
[TestMethod]
[ExpectedException(typeof(InvalidOperationException))]
public void List_Foreach_should_throw_if_list_is_modified() {
var list = new List<string> { "This", "here", "be", "a", "list", "of", "strings" };
list.ForEach((s) => {
if (s.Equals("be", StringComparison.OrdinalIgnoreCase)) {
list.Add(".");
}
});
}
Тесты на другие библиотеки DLL фреймворка
Однако эти тесты не работают правильно (тест 4.5 проходит, тест 4.0 — нет), поскольку эти типы находятся в System.ComponentModel.Composition.dll
, а всегда загружается версия 4.5:
Framework 4.0 - сбой, выдает исключение, ожидаемое для 4.5-
[TestMethod]
public void Should_be_able_to_create_a_serializer_for_MEF_catalogs()
{
var catalog = new AggregateCatalog();
var serializer = new XmlSerializer(typeof(AggregateCatalog));
}
Framework 4.5 -проходит-
[TestMethod]
[ExpectedException(typeof(InvalidOperationException))]
public void Should_not_be_able_to_create_a_serializer_for_MEF_catalogs()
{
var catalog = new AggregateCatalog();
var serializer = new XmlSerializer(typeof(AggregateCatalog));
}
Это так, как задумано? Это кажется непересекающимся, учитывая, что загружена версия mscorlib 4.0, но версия 4.5 любой другой сборки.
Есть ли способ получить желаемую функциональность?
Обновить
Вот решения/проекты, которые я использую.