Добавление библиотек.NET Standard в 4.7.1 lib добавляет множество ссылок, некоторые из которых не работают
Поскольку мне нужно импортировать библиотеку, ориентированную на.NET Standard 2, я обновил свою библиотеку до.NET 4.7.1, как я понял из этого видео MS, чтобы избежать этой проблемы: https://www.youtube.com/watch?v=u67Eu_IgEMs
Однако добавление стандарта.NET теперь приводит к десяткам ссылок на System.xxx, а не к одной ссылке на стандарт.NET (согласно видео).
Что еще хуже, некоторые ссылки были добавлены, но в основном файле, по-видимому, отсутствует генерирование предупреждений, например
Warning The referenced component 'Microsoft.Win32.Primitives' could not be found.
Warning The referenced component 'System.IO.FileSystem' could not be found.
Warning The referenced component 'System.Security.Cryptography.X509Certificates' could not be found.
Warning The referenced component 'System.Globalization.Calendars' could not be found.
Я даже заново создал демонстрационный проект в видео и получил тот же результат - нет единой ссылки на.NET Standard, вместо этого было много ссылок на DLL.
Warning The referenced component 'System.Security.Cryptography.Encoding' could not be found.
Warning The referenced component 'System.Security.Cryptography.Primitives' could not be found.
Warning The referenced component 'System.IO.Compression.ZipFile' could not be found.
Warning The referenced component 'System.Console' could not be found.
Я попробовал нугет update-package -reinstall
и понижен и обновлен до.NET стандарта 2.0 и 2.0.1, а также
3 ответа
Ответ, который я создаю для своего собственного вопроса:
Использует ли ваш проект.NET Framework packages.config
? Если это так, НЕ ссылаться на стандартные библиотеки.NET. Пакет /reference/binding-redirect в VS 2017 ужасно сломан, если вы введете.NET Standard. Попытка исправить это вызовет больше проблем (я потратил впустую несколько дней, пытаясь). Ожидайте сборки, которые не загружаются, несмотря на то, что они присутствуют, много предупреждений и неработающее приложение.
Если вы используете System.Net.Http
запланируйте провести несколько дней в вопросах Google и GitHub, пытаясь заставить это работать.
Если вы можете выполнить обновление до packageReferences, это должно решить проблему. Но если ваш проект содержит пакеты, которые импортируют контент, например JQuery
или же Bootstrap
имейте в виду, что они больше не работают, и вместо этого вы потратите больше времени на исправление этих ссылок и переходите к npm
или же bower
вместе с исправлением компиляции TypeScript тоже. Нет, спасибо.
В идеале вы должны использовать формат csproj 2017 года, но он не совместим с WinForms, ASP.NET или Windows Services - так сложно, если у вас есть устаревший проект.
Из-за некоторых проблем с реализацией поддержки.NET Standard 2.0 в.NET Framework 4.7.1 необходимо развернуть дополнительные файлы в папке bin.
Эта проблема описана как известная проблема здесь.
Количество файлов, скопированных в выходную папку, будет 0, если вы ориентируетесь или работаете в.NET Framework 4.7.2.
Также убедитесь, что вы используете последнюю версию Visual Studio (по крайней мере, версию 15.6.3), поскольку некоторые изменения, необходимые для работы этого сценария, доступны там.
FWIW, я использовал Visual Studio 15.7.5 и вручную исправлял все мои перенаправления привязки (чтобы удалить их). Однако я заметил, что у моего коллеги была Visual Studio 15.9.4, и на экране свойств проекта теперь есть "Автоматическая генерация перенаправлений привязки". Я ранее установил это в csproj вручную. Но обновление до VS 15.9.4 и повторная сборка проектов избавили меня от всех перенаправлений привязки для меня.
У меня была абсолютно такая же проблема. Я пытался установить пакет Microsoft.Azure.ServiceBus на пустой консольный проект.NET Framework 4.7.1 и получил все эти неработающие ссылки.
Насколько я понял, основная причина - https://github.com/dotnet/standard/issues/567 а возможный обходной путь описан здесь https://github.com/dotnet/corefx/issues/29622.
Поэтому я просто заменил битые ссылки, как
<Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
</Reference>
в моем.csproj файле
<Reference Include="System.Security.Cryptography.Primitives"/>
и это сработало, потому что эта сборка является частью.NET Framework 4.7.1. Также я удалил все перенаправления привязки из файла.config относительно неработающих ссылок.
Также я обнаружил интересный факт. Была ссылка
<Reference Include="System.Runtime.Serialization.Primitives, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.Serialization.Primitives.4.3.0\lib\net46\System.Runtime.Serialization.Primitives.dll</HintPath>
</Reference>
и он не был сломан, поскольку эта сборка существует в папке.../MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net471\lib. Интересно, может ли это быть проблемой сборки MS?