gpt4 book ai didi

roslyn - 当解决方案包含具有不同编译选项的项目时如何使用 Roslyn

转载 作者:行者123 更新时间:2023-12-02 10:00:01 32 4
gpt4 key购买 nike

最初的问题是我有一个巨大的解决方案,其中项目有不同的选项(例如,x64 或 x86 配置、是否允许不安全代码等等)。我正在尝试使用 Roslyn (2.9.0) 通过 DEBUG x64 配置来编译\解析该解决方案。某些项目编译失败,因为只能使用“DEBUG x86”。

我使用“DEBUG x64”配置创建了一个测试解决方案。

Project A is a console application (DEBUG x64). 
Project B is a library (DEBUG x86)

并编写此代码:

MSBuildLocator.RegisterDefaults();
_workspace = MSBuildWorkspace.Create(props);
_workspace.SkipUnrecognizedProjects = false;
_solution = _workspace.OpenSolutionAsync(solutionFilePath).Result;
var projectsGpaph = _solution.GetProjectDependencyGraph();
var projects = projectsGpaph.GetTopologicallySortedProjects();

未设置“props”时

_workspace.Diagnostics 为空,“项目”具有正确的顺序(库,然后是应用程序)

B: project.CompilationOptions.Platform is AnyCpu
A: project.CompilationOptions.Platform is AnyCpu32BitPreferred

当“props”设置为

var props = new Dictionary<string, string>()
{
{"Configuration", "Debug"},
{"Platform", "x64"}
};

_workspace.Diagnostics 为空,“项目”顺序错误:

A: project.CompilationOptions.Platform is X64
B: project.CompilationOptions.Platform is X64

当我执行“project.GetCompilationAsync().Result”时抛出异常:

System.ArgumentException: 'Reference of type 
'Microsoft.CodeAnalysis.UnresolvedMetadataReference' is not valid for this
compilation.
Parameter name: references[0]'

如何强制 Roslyn 考虑 .sln\.csproj 设置?

最佳答案

我认为答案是“它不支持加载具体项目的编译选项”。

对于我的问题,我将其行为与 Roslyn 2.7 进行了比较:

使用 Roslyn 2.7:

当我使用“任何 CPU”配置时,GetTopologicallySortedProjects 在此测试解决方案上正常工作,并且我的庞大解决方案编译时没有错误。

使用 Roslyn 2.9:

我发现 ProjectDependencyGraph::_referencesMap 中的项目引用是错误的,原因似乎是不可变集合的错误实现。当我编译我的巨大解决方案(任何 CPU)时,出现许多内部错误,结果是:

System.AggregateException: One or more errors occurred. ---> System.ArgumentNullException: Value cannot be null.
Parameter name: key
at System.Collections.Immutable.Requires.FailArgumentNullException(String parameterName)
at System.Collections.Immutable.Requires.NotNullAllowStructs[T](T value, String parameterName)
at System.Collections.Immutable.ImmutableDictionary`2.TryGetValue(TKey key, TValue& value)
at Microsoft.CodeAnalysis.MSBuild.CommandLineArgumentReader.ReadDebugInfo()
at Microsoft.CodeAnalysis.CSharp.CSharpCommandLineArgumentReader.ReadCore()
at Microsoft.CodeAnalysis.MSBuild.CommandLineArgumentReader.Read()
at Microsoft.CodeAnalysis.CSharp.CSharpCommandLineArgumentReader.Read(ProjectInstance project)
at Microsoft.CodeAnalysis.CSharp.CSharpProjectFile.ReadCommandLineArgs(ProjectInstance project)
at Microsoft.CodeAnalysis.MSBuild.ProjectFile.GetCommandLineArgs(ProjectInstance project)
at Microsoft.CodeAnalysis.MSBuild.ProjectFile.CreateProjectFileInfo(ProjectInstance project)
at Microsoft.CodeAnalysis.MSBuild.ProjectFile.<BuildProjectFileInfoAsync>d__17.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
at Microsoft.CodeAnalysis.MSBuild.ProjectFile.<GetProjectFileInfosAsync>d__16.MoveNext()

关于roslyn - 当解决方案包含具有不同编译选项的项目时如何使用 Roslyn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52131365/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com