问题描述
所以,我正在编写一个代码生成器工具,我想从用户必须指定的现有 csproj 中获取默认命名空间。本质上,我希望能够从路径加载 csproj 并从中获取一些配置。
我还希望能够从解决方案中获取所有现有项目,从中我将使用路径中的解决方案文件。
我研究了代码分析器并相信这是可行的方法,但到目前为止我还没有找到我想要实现的目标的一个示例。
我不希望支持旧格式的 csproj,只支持 VS2017 附带的 Microsoft.NET.Sdk 格式。
解决方法
因此,评论中所述的解决方案是使用 MSBuildWorkspace。
我的代码如下所示:
using Microsoft.CodeAnalysis.MSBuild;
using Microsoft.CodeAnalysis;
public class ProjectLoader : IProjectLoader
{
public string GetVSProjectDefaultNamespace(string projectPath)
{
var workspace = MSBuildWorkspace.Create();
Project project;
try
{
project = workspace.OpenProjectAsync(projectPath).Result;
}
catch(Exception e)
{
throw new Exception("The requested project failed to load. Make sure the path to the project file is correct.",e);
}
var defaultNamespace = project.DefaultNamespace ?? project.Name;
return defaultNamespace;
}
}
安装以下 nuget 包很重要:
Microsoft.CodeAnalysis
Microsoft.CodeAnalysis.Workspaces.MSBuild
为了使上一个片段起作用。
希望这对其他人有帮助!