从现有的 csproj 获取默认命名空间(Microsoft.NET.Sdk 格式)
Get default namespace from existing csproj (Microsoft.NET.Sdk format)
因此,我正在编写一个代码生成器工具,我想从用户必须指定的现有 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
为了让前面的代码片段正常工作。
希望这对其他人有帮助!
因此,我正在编写一个代码生成器工具,我想从用户必须指定的现有 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
为了让前面的代码片段正常工作。
希望这对其他人有帮助!