Как избавиться от конфликтов ссылок на пакеты в проекте VSIX

У меня есть решение с несколькими проектами, которое создает пакет Visual Studio.

Некоторые проекты и пакеты Nuget показаны ниже. Расширение Visual Studio верхнего уровня — MultiLanguageWPF.

MultiLanguageWPF
| 
+-- MultiLanguageLegacy
|   |       Nuget: Microsoft.CodeAnalysis.Analyzers  Version 1.0.0 
|   |
|   +-- MultiLangCodeParser
|   |       Nuget: Microsoft.CodeAnalysis.Analyzers  Version 1.0.0
|   |       Nuget: Microsoft.CodeAnalysis.Compilers  Version 1.0.0
|   |
+---+-- MultiLangCommon
            Nuget: Microsoft.CodeAnalysis            Version 1.0.0
            Nuget: Microsoft.CodeAnalysis.Analyzers  Version 1.0.0

Все эти пакеты Nuget включены в версию 1.0.0. Все проекты построены на основе Framework 4.7.2.

Этот вопрос касается трех предупреждений, которые генерируются для проекта MultiLanaguageWPF:

Обнаружены конфликты между разными версиями «Microsoft.CodeAnalysis», которые не удалось разрешить. Эти ссылочные конфликты перечислены в журнале сборки, если уровень детализации журнала установлен на подробный.

Обнаружены конфликты между различными версиями «Microsoft.CodeAnalysis.VisualBasic», которые не удалось разрешить. Эти ссылочные конфликты перечислены в журнале сборки, если уровень детализации журнала установлен на подробный.

Обнаружены конфликты между разными версиями «Microsoft.CodeAnalysis.CSharp», которые не удалось разрешить. Эти ссылочные конфликты перечислены в журнале сборки, если уровень детализации журнала установлен на подробный.

Пакеты Microsoft.CodeAnalysis.VisualBasic и Microsoft.CodeAnalysis.CSharp являются зависимостями пакета Microsoft.CodeAnalysis.Compilers.

Эти три предупреждения генерируются для проекта MultiLanaguageWPF, который на самом деле не использует эти пакеты. Очевидно, что все упомянутые библиотеки DLL должны быть включены в проект верхнего уровня и в конечном итоге упакованы в установку VSIX, поэтому я думаю, что это имеет смысл.

Как было предложено в предупреждающих сообщениях, я установил уровень детализации журнала. Для пакета Microsoft.CodeAnalysis это часть того, что я вижу.

16>  Primary reference "Microsoft.CodeAnalysis, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35".
16>      Resolved file path is "C:\Users\Phil\.nuget\packages\microsoft.codeanalysis.common\1.0.0\lib\net45\Microsoft.CodeAnalysis.dll".
16>      Reference found at search path location "{RawFileName}".
16>      Found related file "C:\Users\Phil\.nuget\packages\microsoft.codeanalysis.common\1.0.0\lib\net45\Microsoft.CodeAnalysis.xml".
16>      This reference is not "CopyLocal" because at least one source item had "Private" set to "false" and no source items had "Private" set to "true".
16>      The ImageRuntimeVersion for this reference is "v4.0.30319".

16>  Unified Dependency "Microsoft.CodeAnalysis, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35".
16>      Using this version instead of original version "1.0.0.0" in "C:\MultiLang_Version_7_1\VS2013\MultiLang\bin\Debug\MultiLanguageLegacy.dll" because AutoUnify is 'true'.
16>      Using this version instead of original version "1.0.0.0" in "C:\Users\Phil\.nuget\packages\microsoft.codeanalysis.csharp\1.0.0\lib\net45\Microsoft.CodeAnalysis.CSharp.dll" because AutoUnify is 'true'.
16>      Using this version instead of original version "1.0.0.0" in "C:\Users\Phil\.nuget\packages\microsoft.codeanalysis.csharp.workspaces\1.0.0\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll" because AutoUnify is 'true'.
16>      Using this version instead of original version "1.0.0.0" in "C:\Users\Phil\.nuget\packages\microsoft.codeanalysis.visualbasic\1.0.0\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll" because AutoUnify is 'true'.
16>      Using this version instead of original version "1.0.0.0" in "C:\Users\Phil\.nuget\packages\microsoft.codeanalysis.visualbasic.workspaces\1.0.0\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll" because AutoUnify is 'true'.
16>      Using this version instead of original version "1.0.0.0" in "C:\Users\Phil\.nuget\packages\microsoft.codeanalysis.workspaces.common\1.0.0\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll" because AutoUnify is 'true'.
16>      Using this version instead of original version "1.0.0.0" in "C:\Users\Phil\.nuget\packages\microsoft.codeanalysis.workspaces.common\1.0.0\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll" because AutoUnify is 'true'.
16>      Using this version instead of original version "1.0.0.0" in "C:\Users\Phil\.nuget\packages\microsoft.visualstudio.languageservices\1.0.0\lib\net45\Microsoft.VisualStudio.LanguageServices.dll" because AutoUnify is 'true'.
16>      Using this version instead of original version "1.0.0.0" in "C:\MultiLang_Version_7_1\VS2013\MultiLang\bin\Debug\MultiLangCommon.dll" because AutoUnify is 'true'.
16>      Using this version instead of original version "1.0.0.0" in "C:\MultiLang_Version_7_1\VS2013\MultiLang\bin\Debug\MultiLangCodeParser.dll" because AutoUnify is 'true'.
16>      Could not resolve this reference. Could not locate the assembly "Microsoft.CodeAnalysis, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.

Похоже, что это механизм AutoUnify, из-за которого он выбирает версию 3.0.0.0 вместо версии 1.0.0.0.

Из того, что я узнал об этой ошибке, можно было бы исправить ее с помощью bindingRedirect в файле app.config, если бы это был EXE-проект.

Насколько я понимаю, это не работает для проекта DLL и, следовательно, не для проекта расширения Visual Studio (VSIX).

Можно ли как-то избавиться от этих предупреждений в проекте VSIX?

(Кстати, я не обновился до версии 3.0.0.0, потому что эта версия предназначена только для .NET Standard, поэтому я предполагаю, что она несовместима с Framework 4.7.2.)


person Phil Jollans    schedule 10.08.2019    source источник


Ответы (1)


Можно ли как-то избавиться от этих предупреждений в проекте VSIX?

Самый простой способ воспроизвести три предупреждения — создать пустой проект vsix, а затем сослаться на пакет Microsoft.CodeAnalysis version-1.0.0 в формате PackageReference.

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

Поэтому я думаю, что пакеты, на которые вы ссылаетесь, несовместимы с проектом vsix с SDK, связанным с VS2019. Пожалуйста, проверьте этот документ, для VS2019 вы должны использовать 3.0 или более поздняя версия.

Кстати, я не обновился до версии 3.0.0.0, потому что эта версия предназначена только для .NET Standard, поэтому я предполагаю, что она несовместима с Framework 4.7.2.

Пожалуйста, проверьте этот документ для подробности о совместимости между стандартом .net и .net framework.

См. существует несколько проблем с использованием библиотек .NET Standard, созданных для этих версий из проектов .NET Framework 4.6.1. Для проектов .NET Framework, в которых необходимо использовать такие библиотеки, рекомендуется обновить проект до целевой версии .NET Framework 4.7.2 или выше.

На самом деле ссылка на сборку, предназначенную для .net standard 2.0 в .net framework 4.7.2 projects и выше, является официальным рекомендуемым способом. Так что вам не нужно беспокоиться об этом.

Я рекомендую вам обновить Microsoft.CodeAnalysis до 3.2.0 version, также вам может понадобиться обновить связанные пакеты, такие как Microsoft.CodeAnalysis.Analyzers, тогда эта проблема исчезнет.

Надеюсь, поможет:)

person LoLance    schedule 12.08.2019
comment
Большое спасибо за этот подробный ответ. Я обновил почти все пакеты до последней версии (а также Visual Studio), и похоже, что эти конкретные ошибки исправлены. У меня есть еще некоторые конфликты, которые я надеюсь исправить самостоятельно. Если я не смогу их исправить, я спрошу еще раз. - person Phil Jollans; 13.08.2019
comment
@PhilJollans Рад узнать, что это помогает :) - person LoLance; 13.08.2019