MSBuildWorkspace无法将具有<projectreference>的项目编译到另一个项目

时间:2019-05-30 22:04:29

标签: msbuild roslyn roslyn-code-analysis

请注意,我也曾问过这个问题(带有复制代码)on Roslyn's GitHub

  • 使用2个项目(CoreLibrary和DownstreamLibrary)创建一个新的解决方案。
  • 将项目参考从DownstreamLibrary添加到CoreLibrary。
  • 运行以下代码,并注意DownstreamLibrary不再编译。

请注意,我已经尝试将net461,netcoreapp2.1和netstandard2.0作为项目的目标框架-每次都遇到相同的问题。

reduce

您将收到以下输出:

const findOdd = arr => arr.reduce((acc, d, i, list) => {
    if (!acc[d]) {
        acc[d] = 0;
    }

    acc[d]++;

    if (i === list.length - 1) {
        return Object.keys(acc)
            .reduce((subAcc, key) => ({
                ...subAcc,
                ...(acc[key] % 2 === 0 ? {} : {
                    [key]: acc[key]
                })
            }), {})
    }
    return acc;
}, {})

所以我的问题是如何解决以上错误并让DownstreamLibrary进行编译?

编辑 我99%确信根本原因是此错误

  

无法从程序集Microsoft.Build.Tasks.Core,版本= 15.1.0.0中加载“ Microsoft.Build.Tasks.ResolveNonMSBuildProjectOutput”任务

我已经用procmon确认它正在加载以下已通过ILSpy 确认的DLL(C:\ Program Files \ dotnet \ sdk \ 2.1.602 \ Microsoft.Build.Tasks.Core.dll)。 中没有ResolveNonMSBuildProjectOutput任务。此DLL did 的较旧版本具有此任务。

1 个答案:

答案 0 :(得分:2)

我找到了此WorkspaceFailed错误的手动解决方法:

[失败]在处理with消息时,Msbuild失败:无法从程序集Microsoft.Build.Tasks.Core,版本= 15.1.0.0,Culture = neutral,程序集加载“ Microsoft.Build.Tasks.ResolveNonMSBuildProjectOutput”任务。 PublicKeyToken = b03f5f7f11d50a3a。确认声明正确无误,并保证程序集及其所有依赖项都可用,并且任务包含实现Microsoft.Build.Framework.ITask的公共类。

有一些解决步骤:

  1. https://github.com/microsoft/msbuild/issues/4770之后,我将VS 2019从16.2更新到16.5.3 ...这没有解决我的错误,但是值得记录一下我这样做了。
  2. 我将Microsoft.Build。*和Microsoft.CodeAnalysis依赖关系升级到最新的,但还没有解决,同样的错误。
  3. 我导航到C:\ Program Files \ dotnet \ sdk,该目录以前有几个目录:
1.0.0/                  1.0.0-rc4-004771/  2.0.3/    2.1.505/
1.0.0-preview1-002702/  1.0.3/             2.1.202/  3.1.100/
1.0.0-preview2-003121/  1.0.4/             2.1.4/    3.1.201/
1.0.0-preview4-004233/  1.1.0/             2.1.502/  NuGetFallbackFolder/
  1. 我将其重命名为sdk_o并创建了一个新文件夹C:\ Program Files \ dotnet \ sdk,仅复制了3.1.201 /

成功!这个错误已经消失了,但是运行我的roslyn应用程序然后导致了一些错误,例如(路径被剥离)

[失败]处理带有消息的文件时,Msbuild失败“ ProcessFrameworkReferences”任务意外失败。 System.IO.FileNotFoundException:无法加载文件或程序集'NuGet.Frameworks,版本= 5.5.0.4,区域性=中性,PublicKeyToken = 31bf3856ad364e35'。该系统找不到指定的文件。文件名:'NuGet.Frameworks,版本= 5.5.0.4,文化=中性,PublicKeyToken = 31bf3856ad364e35'

通过在我的项目中添加NuGet.ProjectModel 5.5.1解决了这一问题,csproj现在具有以下程序包引用:

   <ItemGroup>
     <PackageReference Include="Microsoft.Build" Version="16.5.0" ExcludeAssets="runtime" />
     <PackageReference Include="Microsoft.Build.Framework" Version="16.5.0" ExcludeAssets="runtime" />
     <PackageReference Include="Microsoft.Build.Locator" Version="1.2.6" />
     <PackageReference Include="Microsoft.Build.Tasks.Core" Version="16.5.0" ExcludeAssets="runtime" />
     <PackageReference Include="Microsoft.CodeAnalysis" Version="3.5.0" />
     <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.5.0" />
     <PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="3.5.0" />
     <PackageReference Include="NuGet.ProjectModel" Version="5.5.1" />
   </ItemGroup>

此代码不再有WorkspaceFailed事件:

Microsoft.Build.Locator.MSBuildLocator.RegisterDefaults();
var workspace = MSBuildWorkspace.Create();
workspace.WorkspaceFailed += (s, e) => { Console.WriteLine(e.Diagnostic); };
var project = await workspace.OpenProjectAsync(@"C:/path/to.csproj");     

我正在与Roslyn一起加载的csproj如下所示:

<Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
      <TargetFramework>netcoreapp3.1</TargetFramework>
      <UseWindowsForms>true</UseWindowsForms>
      <OutputType>Library</OutputType>
      <ApplicationIcon />
      <StartupObject />
   </PropertyGroup>

   <ItemGroup>
      <ProjectReference Include="..\..\dependencies\some.csproj" />
   </ItemGroup>
</Project>