Как заставить проект установки Visual Studio обнаруживать зависимости nuget в соответствии со сборкой? - PullRequest
0 голосов
/ 05 ноября 2019

Я создал проект установки с использованием проектов установщика Microsoft Visual Studio (0.9.3, это последняя версия для Visual Studio 2019). После выполнения установки он устанавливает сборки пакетов Nuget, которые отличаются от сборок, созданных во время сборки.

Почему это происходит, и как я могу выбрать сборки, согласующиеся со сборками?

Мое приложение предназначено для платформы 4.7.2. Типичным примером является System.ValueTuple.dll (4.0.2)

Сборка получает сборку из: C: \ Users \ .nuget \ packages \ system.valuetuple \ 4.5.0 \ lib \ net47 \ System.ValueTuple. dll

Установка извлекает сборку из: C: \ Program Files (x86) \ Справочные сборки \ Microsoft \ Framework.NETFramework \ v4.7.2 \ Facades \ System.ValueTuple.dll

При установке на основена 4.0.2 создает проблему, но работает, когда я обновляю пакет nuget до версии 4.6 (и сборку до 4.0.3), устанавливаю переключатели на сборку C: \ Users \ vgdev.nuget \ packages \ system.valuetuple \ 4.5.0 \ref \ net47 \ System.ValueTuple.dll

Если вы посмотрите ближе, вы заметите, что путь выше имеет папку \ ref и содержит «справочную» сборку. Ссылочные сборки не предназначены для установки и вызывают ошибки BadImageformatException.

Сборка после обновления пакета Nuget продолжает извлекать пакеты из правильной папки \ lib, и приложение работает нормально. Поэтому я хочу, чтобы установщик работал последовательно со сборкой. Любой совет?

1 Ответ

0 голосов
/ 06 ноября 2019

Установка извлекает сборку из: C: \ Program Files (x86) \ Справочные сборки \ Microsoft \ Framework.NETFramework \ v4.7.2 \ Facades \ System.ValueTuple.dll

КакиеКстати, вы ссылаетесь на этот пакет? Я могу воспроизвести эту проблему только при добавлении ссылки вручную (щелкните правой кнопкой мыши проект => Добавить ссылку => Обзор ...) Если вы делаете это, удалите эту ссылку и добавьте эту ссылку обратно NugetПользовательский интерфейс диспетчера пакетов .

Мое приложение предназначено для платформы 4.7.2. Типичным примером является System.ValueTuple.dll (4.0.2). Когда я обновляю пакет nuget до версии 4.6 (и сборки до 4.0.3)

, я могу найти его только с последней версией 4.5.0 . И я думаю, что он содержит версию сборки 4.0.3 вместо 4.0.2.

(Полагаю, что-то портит процесс, когда VS распознает вашу версию сборки, потому что на большинстве машин он отображает 4.0.3, а на одной машине - 4.0.2, что довольно странно ...)

Сборка после обновления пакета Nuget продолжает извлекать пакеты из правильной папки \ lib, и приложение работает нормально. Поэтому я хочу, чтобы установщик работал последовательно со сборкой. Любой совет?

Причина проблемы:

Это странное поведение может иметь отношение к проекту установки. Я могу воспроизвести ту же ситуацию, и обнаружил, что эта проблема возникает, только когда я использую формат PackageReference для управления пакетами nuget в своем приложении. (. Net 4.7.2)

PackageReference формат - это новое управление пакетами nugetформат после VS2017. Я не уверен, что проект установки полностью поддерживает его.

Вот два предложения, которые могут помочь:

1 . Я обнаружил, что эта проблема возникает только при использовании формата PackageReference. Таким образом, вы можете попробовать использовать формат Packages.config в вашем приложении. И я проверил, что проект установки хорошо распознает этот формат.

Удалите все пакеты формата PackageReference и перейдите на Tools=>Nuget Packages Manager=>Nuget Package Manager, чтобы установить для Allow format selection... значение true.

Clean all nuget cache инажмите ok. После этого удалите папки bin и obj, затем перезапустите VS, чтобы добавить эти пакеты обратно в формате Packages.config.

2 . Если вы продолжаете использовать формат PackageReference. Попробуйте исключить сборку из папки ref и вручную добавить ее из папки lib с помощью Add=>Assembly=>Browse.

enter image description here

Примечание. Поскольку проект установки может не полностью поддерживатьПроекты формата packageReference, на самом деле, я думаю, # 1 может быть более подходящим для вашей ситуации. И вы можете создать новый простой проект в формате packages.config, чтобы проверить, можно ли решить проблему с помощью формата Packages.config. Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...