Msbuild 如何消除VSIX项目中的包引用冲突

Msbuild 如何消除VSIX项目中的包引用冲突,msbuild,nuget,app-config,visual-studio-extensions,assembly-binding-redirect,Msbuild,Nuget,App Config,Visual Studio Extensions,Assembly Binding Redirect,我有一个包含多个项目的解决方案,它生成一个VisualStudio包 下面显示了一些项目和Nuget包。顶级Visual Studio扩展是多语言WPF MultiLanguageWPF | +-- MultiLanguageLegacy | | Nuget: Microsoft.CodeAnalysis.Analyzers Version 1.0.0 | | | +-- MultiLangCodeParser | | Nuget: Microsof

我有一个包含多个项目的解决方案,它生成一个VisualStudio包

下面显示了一些项目和Nuget包。顶级Visual Studio扩展是多语言WPF

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版中。所有项目都是根据框架4.7.2构建的

此问题涉及为项目MultiLanguageWPF生成的三个警告:

发现不同版本的Microsoft.CodeAnalysis之间存在冲突 这是无法解决的。中列出了这些引用冲突 日志详细性设置为详细时的生成日志

发现的不同版本之间存在冲突 无法解决Microsoft.CodeAnalysis.VisualBasic的问题。 这些引用冲突在生成日志时列在生成日志中 详细设置为详细

发现的不同版本之间存在冲突 无法解析的Microsoft.CodeAnalysis.CSharp。这些 当日志详细度为0时,生成日志中将列出引用冲突 设置为详细

包Microsoft.CodeAnalysis.VisualBasic和Microsoft.CodeAnalysis.CSharp是包Microsoft.CodeAnalysis.Compilers的依赖项

这三个警告是为项目MultiLanaguageWPF生成的,该项目实际上没有使用这些包。显然,所有引用的DLL都必须拉入顶级项目,并最终打包到VSIX安装中,所以我想这是有意义的

正如警告消息中所建议的,我已将日志详细性设置为detailed。对于包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.
似乎是自动统一机制导致它选择版本3.0.0.0而不是版本1.0.0.0

根据我对这个错误的了解,如果它是一个EXE项目,那么可以使用app.config文件中的bindingRedirect来修复它

我的理解是,这不适用于DLL项目,因此不适用于VisualStudio扩展VSIX项目

有没有办法在VSIX项目中消除这些警告

顺便说一下,我还没有更新到3.0.0.0版,因为这个版本只针对.NET标准,所以我假设它与Framework 4.7.2不兼容

有什么方法可以在VSIX中消除这些警告吗 项目

重现这三个警告的简单方法是创建一个vsix空项目,然后以PackageReference格式引用Microsoft.CodeAnalysis版本1.0.0包

构建项目,然后您可以得到相同的警告。

因此,我认为您引用的包与VS2019相关sdk的vsix项目不兼容。请检查,对于VS2019,您应该使用3.0或更高版本

顺便说一下,我还没有更新到版本3.0.0.0,因为 版本只针对.NET标准,所以我认为它不兼容 使用框架4.7.2

请检查有关.net标准和.net framework之间兼容性的详细信息

请参阅:使用为.NET Framework 4.6.1项目中的那些版本构建的.NET标准库时存在一些问题。对于需要使用此类库的.NET Framework项目,我们建议您将该项目升级到目标.NET Framework 4.7.2或更高版本

官方推荐的方法实际上是引用针对.net framework 4.7.2及更高版本项目中的.net标准2.0的程序集。所以你不必为此担心

我建议您将Microsoft.CodeAnalysis更新为3.2.0版本,还可能需要更新相关软件包,如Microsoft.CodeAnalysis.Analyzers,然后此问题将消失


希望能有所帮助:

非常感谢您提供的详细答案。我已经将几乎所有的软件包更新到了最新版本,还更新了VisualStudio,看起来这些特定的错误已经修复。我还有一些其他的冲突,我希望可以自己解决。如果我不能解决它们,我会再问一次。@PhilJollans很高兴知道这对我有帮助: