Nuget и транзитивные зависимости на разных версиях. net Framework DLL - PullRequest
0 голосов
/ 25 февраля 2020

Вот ситуация, в которой я оказался совсем недавно. Сделайте это:

  1. В VS 2019 16.4.5 создайте новое целевое приложение консоли C#. net 4.7.1
  2. Добавьте ссылку на System.IO.Compression
  3. Добавьте эту строку в Main () (если вы действительно попытаетесь запустить, вам понадобится sh, поэтому не надо):

    var a = new System.IO. Compression.ZipArchive (System.IO.Stream.Null);

  4. Компиляция

  5. Изучение метаданных выходного файла. Он будет содержать ссылку на System.IO.Compression версии 4.0, которая предположительно является версией, включенной в. net 4.7.1.

Теперь сделайте это:

  1. В VS 2019 16.4.5 создайте новое целевое приложение консоли C#. net 4.7.1
  2. Установите пакет nuget System.Threading.Tasks.Extensions версия 4.5.3 (последняя версия на время публикации; ничего особенного в этом пакете, просто используя его в качестве примера)
  3. Добавьте эту строку в Main () (она будет sh, если вы действительно попытаетесь запустить, так что 't):

    var a = new System.IO.Compression.ZipArchive (System.IO.Stream.Null);

  4. Compile

  5. Перейдите в выходной каталог. msbuild поместит туда System.IO.Compression.dll, но это версия 4.2. Это происходит потому, что System.Threading.Tasks.Extensions имеет транзитивную зависимость от System.IO.Compression 4.2. Метаданные для скомпилированного exe-файла покажут, что он теперь также ссылается на версию 4.2 вместо 4.0.

Это все хорошо, пока вы не попытаетесь развернуть приложение на другом компьютере, и оно не будет работать во время выполнения, потому что только версия 4.0 System.IO.Compression включена в распространяемый 4.7.1. Так каково решение этого? Должен ли я:

  • Развернуть System.IO.Compression 4.2 с моим приложением и заставить установщик скопировать его в каталог установки вместе с exe-файлом?
  • Возиться с перенаправлениями привязки?
  • Выясните, что распространяемое включает в версию 4.2 и включает ли это и один, и 4.7.1 Framework, распространяемый в моем установщике?
  • Что-то еще полностью?
...