【问题标题】:Get default namespace from existing csproj (Microsoft.NET.Sdk format)从现有 csproj 获取默认命名空间(Microsoft.NET.Sdk 格式)
【发布时间】:2021-01-08 16:29:22
【问题描述】:

所以,我正在编写一个代码生成器工具,我想从用户必须指定的现有 csproj 中获取默认命名空间。本质上,我希望能够从路径加载 csproj 并从中获取一些配置。

我还希望能够从解决方案中获取所有现有项目,我将从其中使用路径中的解决方案文件。

我已经研究过代码分析器并相信这是要走的路,但到目前为止我还没有找到一个我想要实现的示例。

我不希望支持旧格式 csproj,只支持 VS2017 附带的 Microsoft.NET.Sdk 格式。

【问题讨论】:

  • 你的工具可以写成Source generator吗?那你就不用担心加载csproj文件等了
  • 它是一个类似于 ef 核心逆向工程支架的工具,但用于 repoDb 并且对 EF 的依赖性为零。我正在查询 information_schema、生成基本实体和其他一些配置代码。但我不希望我的用户必须为该工具指定命名空间。我将研究 Source 生成器。
  • 我的想法是让它能够作为接收某些参数的 CLI 运行,例如 db 引擎、连接字符串以及文件将在哪个 csproj 中结束。
  • 是的,我认为源生成器不适合我正在构建的那种工具。
  • 这很好,但值得提出这个问题!将 sln / csproj 加载到 MSBuildWorkspace 中,并使用 Roslyn 分析它可能是最简单的方法

标签: c# visual-studio msbuild roslyn-code-analysis


【解决方案1】:

因此,cmets 中所述的解决方案是使用 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

为了之前的 sn-p 工作。

希望这对其他人有帮助!

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2015-08-23
    • 1970-01-01
    • 2018-12-20
    相关资源
    最近更新 更多