Почему проект VS2012 со ссылочной сборкой не может автоматически ориентироваться на 4.0

В консольном приложении Visual Studio 2012 C# я понижаю ".NET Framework Target" с 4.5 до 4.0. Win 7 Pro с обоими установленными Frameworks.

Затем я ссылаюсь на сборку, которая через предупреждения жалуется на следующее:

The primary reference "System.Threading.Tasks.Dataflow, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" could not be resolved because it has an indirect dependency on the framework assembly "System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" which could not be resolved in the currently targeted framework. ".NETFramework,Version=v4.0". To resolve this problem, either remove the reference "System.Threading.Tasks.Dataflow, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" or retarget your application to a framework version which contains "System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".

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

Диалоговое окно "Добавить ссылку" не имеет никакого выбора System.Runtime, но если я вручную выберу C:\Windows\Microsoft.NET\Framework\v4.0.30319\ и укажу на найденную там сборку System.Runtime, предупреждения исчезнут и я могу собрать.

Вопросы:

  1. Является ли такое форсирование версии System.Runtime потенциальной проблемой в будущем (развертывание).

  2. Если свойства VS Project настроены на целевой Framework 4.0 (не относится ли это к нацеливанию на 4.0 SystemRuntime/CLR), почему ссылочная DLL не подхватывает это и почему ручное добавление ссылки в мой проект устраняет эту проблему?

2 ответа

Решение

Хотя библиотека System.Runtime находится внутри C:\Windows\Microsoft.NET\Framework\v4.0.30319\ каталог, он не является частью.NET 4.0 Framework. .NET 4.5 - это обновление 4.0 на месте, которое устанавливается в ту же папку с тем же номером версии.

Вот снимок экрана, который доказывает, что библиотека не существует в игре.NET 4.0:

Обычная 4.0 установка

Вы также можете проверить это, перейдя к C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework каталог, в котором вы найдете оригинальные сборки для всех установленных версий фреймворка. Вы найдете System.Runtime.dll как часть .NETCore\v4.5 а также .NETPortable\v4.5 подкаталоги.

Причина, по которой вы можете добавить библиотеку в ваш проект, заключается в том, что время выполнения не изменилось между 4.0 и 4.5, поэтому Visual Studio не знает и даже не заботится о том, что библиотека, которую вы добавили вручную, установлена ​​на 4.5. В этом случае таргетинг в Visual Studio - это всего лишь фильтр, который исключает случайное добавление сборки 4.5 в проект, ориентированный на 4.0.

Дополнительная информация:

У Рика Страл есть очень хороший пост в блоге на эту тему с более подробным анализом:

http://www.west-wind.com/weblog/posts/2012/Mar/13/NET-45-is-an-inplace-replacement-for-NET-40

Является ли такое форсирование версии System.Runtime потенциальной проблемой?

Да, это просто не сработает. Он работает на вашей машине, потому что у вас установлено 4.5. Ваша программа аварийно завершит работу и сгорит на клиентском компьютере с версией 4.0. Никогда не добавляйте ссылку из каталога Framework. Довольно печально, что они все еще рядом, у них слишком много программистов в беде, но обратное сравнение - это святое.

Система сборки может сказать вам, что у вас есть проблема, когда вы используете эталонные сборки. Те, которые показаны в диалоговом окне Добавить ссылку, они хранятся в сборках c:\program files\reference и не совпадают со сборками времени выполнения. Вы знаете, что работает, вы получили предупреждение. Который, несколько неуклюже, сказал вам, что ваша программа не будет работать на машине с 4.0. Не игнорируйте это предупреждение, вам действительно нужно выбрать 4.5, чтобы использовать эту сборку. Жесткое требование, которого вы не можете избежать.

почему ссылочная DLL не берет это

Потому что он отказывается создавать программу, которая не может работать. Особенность, а не ошибка.

Другие вопросы по тегам