Как предотвратить копирование библиотек фасадов библиотеками.NET 4.7.1 в папку bin?
Я уверен, что здесь, вероятно, происходит множество вещей, которые я не понимаю достаточно хорошо, так что прости меня, если это глупый вопрос или если отсутствуют очевидные детали.
У меня есть решение Visual Studio 2015, которое я обновил с.NET 4.5.1 до.NET 4.7.1. Решение состоит из проекта веб-сайта (не веб-приложения) и нескольких библиотек. Библиотеки на самом деле не имеют каких-либо зависимостей (кроме друг друга), и хотя они нацелены на.NET 4.7.1, они не используют, не нуждаются и не ссылаются на.NETStandard.Library.
Когда я собираю одну из библиотек, в частности, она продолжает копировать кучу фасадных библиотек.NET 4.7.1 в папку bin сайта. К сожалению, веб-сайт является приложением Kentico 11, и он продолжает пытаться загрузить фасад System.IO.Compression.ZipFile и задушить его, потому что это эталонная сборка, а не настоящая сборка.
Если я удаляю.dll, все работает нормально... но я не хочу удалять его каждый раз или добавлять событие после сборки, чтобы удалить его. Это просто глупо.
Может кто-нибудь помочь мне понять, что здесь происходит, и как это убрать?
3 ответа
Kentico 11 может работать только с.NET 4.7, поэтому, пытаясь полностью поддерживать ваши библиотеки.NET 4.7.1, я считаю, что он копирует эти дополнительные библиотеки фасадных библиотек. Это основано на объявлении о выпуске.NET 4.7.1, а именно в этом разделе:
BCL - поддержка.NET Standard 2.0
.NET Framework 4.7.1 имеет встроенную поддержку.NET Standard 2.0..NET Framework 4.7.1 добавляет около 200 недостающих API, которые были частью.NET Standard 2.0, но фактически не реализованы в.NET Framework 4.6.1, 4.6.2 или 4.7. Вы можете обратиться к деталям.NET Standard в.NET Standard документация Microsoft.
Приложения, предназначенные для.NET Framework 4.6.1–4.7, должны развернуть дополнительные файлы поддержки.NET Standard 2.0, чтобы использовать библиотеки.NET Standard 2.0. Эта ситуация возникла из-за того, что спецификация.NET Standard 2.0 была завершена после выпуска.NET Framework 4.6.1..NET Framework 4.7.1 является первым выпуском.NET Framework после.NET Standard 2.0, позволяющим нам обеспечить всестороннюю поддержку.NET Standard 2.0.
https://blogs.msdn.microsoft.com/dotnet/2017/10/17/announcing-the-net-framework-4-7-1/
Ссылка, которая привела меня к такому выводу: https://github.com/Particular/NServiceBus/issues/5047
Обновить:
Мне не удалось воспроизвести вашу проблему в Visual Studio 2017 версии 15.6.2.
Я установил проект сайта Kentico 11, ориентированный на.NET 4.7. Затем я создал библиотечный проект для.NET 4.7.1. Я добавил в проект некоторый фиктивный код, чтобы использовать пространства имен Sysetem.IO.Compression и System.Net.Http. Я добавил ссылку на проект из Kentico и запустил сборку. Нет фасадных DLL-файлов, скопированных в папку bin.
Этот пост указывает, что проблема была исправлена в Visual Studio версии 15.6 https://github.com/dotnet/sdk/issues/1647
Дополнительные файлы, которые развертываются в папке bin, необходимы для поддержки ссылок и запуска библиотек.NET Standard 1.x и.NET Standard 2.0 в приложении.NET Framework.
Мы задокументировали это как известные проблемы с.NET Framework 4.7.1.
Однако наличие этих дополнительных файлов недостаточно. Вам также необходимо создать перенаправления привязки, чтобы обеспечить правильное объединение типов в разных библиотеках.
Visual Studio 15.6.3 (и более поздние версии) содержит изменения, которые автоматически генерируют эти перенаправления привязки для вашего приложения.
.NET Framework 4.7.2 решает проблемы, которые требуют развертывания этих дополнительных файлов вместе с вашим приложением. При нацеливании или запуске в.NET Framework 4.7.2 дополнительные файлы не будут скопированы в папку bin, и перенаправления привязки не будут создаваться автоматически.
Вы можете попробовать.NET Framework 4.7.2 и посмотреть, что нового, следуя инструкциям здесь.
Ссылки на сборки имеют свои свойства. Вы можете указать, хотите ли вы скопировать сборку в выходной каталог сборки. Может быть, где-то это установлено true
, Чтобы проверить это, перейдите в Solution Explorer в Visual Studio и щелкните правой кнопкой мыши на соответствующей сборке. Затем нажмите "Свойства" и найдите свойство "Копировать локально".