【发布时间】:2019-05-30 22:04:28
【问题描述】:
注意我也问过这个问题(带有复制代码)on Roslyn's GitHub
- 创建一个包含 2 个项目(CoreLibrary 和 DownstreamLibrary)的新解决方案。
- 将项目引用从 DownstreamLibrary 添加到 CoreLibrary。
- 运行以下代码并注意 DownstreamLibrary 不再编译。
请注意,我已尝试将 net461、netcoreapp2.1 和 netstandard2.0 作为项目的目标框架 - 每次都出现同样的问题。
static async Task Main(string[] args)
{
MSBuildLocator.RegisterDefaults();
using (var workspace = MSBuildWorkspace.Create())
{
workspace.WorkspaceFailed += (sender, workspaceFailedArgs) => WriteLine(workspaceFailedArgs.Diagnostic.Message);
var solution = await workspace.OpenSolutionAsync(@"c:\source\ForRoslynTest\ForRoslynTest.sln");
WriteLine($"Loaded solution {solution.FilePath}");
var projectTree = workspace.CurrentSolution.GetProjectDependencyGraph();
foreach (var projectId in projectTree.GetTopologicallySortedProjects())
{
await CompileProject(workspace.CurrentSolution.GetProject(projectId));
}
}
}
private static async Task CompileProject(Project project)
{
WriteLine($"Compiling {project.Name}. It has {project.MetadataReferences.Count} metadata references.");
var compilation = await project.GetCompilationAsync();
var errors = compilation.GetDiagnostics().Where(diagnostic => diagnostic.Severity == DiagnosticSeverity.Error);
if (errors.Any())
{
WriteLine($"COMPILATION ERROR: {compilation.AssemblyName}: {errors.Count()} compilation errors: \n\t{string.Join("\n\t", errors.Where(e => false).Select(e => e.ToString()))}");
}
else
{
WriteLine($"Project {project.Name} compiled with no errors");
}
}
您将收到以下输出:
Msbuild failed when processing the file 'c:\source\ForRoslynTest\DownstreamLibrary\DownstreamLibrary.csproj' with message: C:\Program Files\dotnet\sdk\2.1.602\Microsoft.Common.CurrentVersion.targets: (1548, 5): The "Microsoft.Build.Tasks.ResolveNonMSBuildProjectOutput" task could not be loaded from the assembly Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a. Confirm that the <UsingTask> declaration is correct, that the assembly and all its dependencies are available, and that the task contains a public class that implements Microsoft.Build.Framework.ITask.
Found project reference without a matching metadata reference: c:\source\ForRoslynTest\CoreLibrary\CoreLibrary.csproj
Loaded solution c:\source\ForRoslynTest\ForRoslynTest.sln
Compiling CoreLibrary. It has 113 metadata references.
Project CoreLibrary compiled with no errors
Compiling DownstreamLibrary. It has 0 metadata references.
COMPILATION ERROR: DownstreamLibrary: 3 compilation errors:
c:\source\ForRoslynTest\DownstreamLibrary\Class1.cs(1,7): error CS0246: The type or namespace name 'System' could not be found (are you missing a using directive or an assembly reference?)
c:\source\ForRoslynTest\DownstreamLibrary\Class1.cs(5,18): error CS0518: Predefined type 'System.Object' is not defined or imported
c:\source\ForRoslynTest\DownstreamLibrary\Class1.cs(5,18): error CS1729: 'object' does not contain a constructor that takes 0 arguments
所以我的问题是如何修复上述错误并让 DownstreamLibrary 编译?
编辑 我 99% 确定根本原因是这个错误
无法从程序集 Microsoft.Build.Tasks.Core 加载“Microsoft.Build.Tasks.ResolveNonMSBuildProjectOutput”任务,版本=15.1.0.0
我已通过 procmon 确认它正在加载我已通过 ILSpy 确认的以下 DLL (C:\Program Files\dotnet\sdk\2.1.602\Microsoft.Build.Tasks.Core.dll) 它没有 ResolveNonMSBuildProjectOutput 任务。此 DLL 的旧版本确实有此任务。
【问题讨论】:
-
我发现如果我将代码作为 .net 4.7.2 应用程序而不是 netcoreapp2.1 应用程序执行,它可以正常工作。想法?
-
那么,这个问题还没有明显的解决方案,它确实是你的错误报告中跟踪的一个错误?
-
@ceztko 我们的应用程序现在针对
net472,根据我的评论。据我所知,MSBuildWorkspace 不适用于 .NET Core(例如,请参阅 here)
标签: msbuild roslyn roslyn-code-analysis