从现有的 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

为了让前面的代码片段正常工作。

希望这对其他人有帮助!