C# 罗斯林综合征

C# 罗斯林综合征,c#,roslyn,C#,Roslyn,我编写了我的类MonitorSyntaxRewriter,它继承自CSharpSyntaxRewriter。通过这个类,我改变了我的语法树。但是,我如何“注入”这个修改过的synaxtree呢?我的意思是,我在VisualStudio中有一些随机项目,在构建时,我希望所有语法树都通过这个MonitorSyntaxRewriter。有什么选择吗 还是有其他可能的解决办法?(创建新的解决方案…)。我只是不想在项目中更改我的*.cs文件 据我所知,在编译语法树并将其发送到磁盘之前,无法插入构建过程并重

我编写了我的类MonitorSyntaxRewriter,它继承自CSharpSyntaxRewriter。通过这个类,我改变了我的语法树。但是,我如何“注入”这个修改过的synaxtree呢?我的意思是,我在VisualStudio中有一些随机项目,在构建时,我希望所有语法树都通过这个MonitorSyntaxRewriter。有什么选择吗


还是有其他可能的解决办法?(创建新的解决方案…)。我只是不想在项目中更改我的*.cs文件

据我所知,在编译语法树并将其发送到磁盘之前,无法插入构建过程并重写语法树

这意味着实现你想要的并不容易。然而,您的项目并非不可能,您可以创建自己的VisualStudio扩展,该扩展向VisualStudio添加了一个菜单选项,并启动了自己的构建和发布过程

为了重写语法树并将其应用于解决方案,您需要将它们应用于其父文档。在编写VisualStudio扩展时,您需要访问。其中包含当前打开的解决方案中的解决方案、项目和文档。我已经写了一些你可能感兴趣的工作空间

您可以通过以下方式在MEF导出类中导入Visual Studio工作区:

[Import(typeof(Microsoft.VisualStudio.LanguageServices.VisualStudioWorkspace))]
一旦访问了
VisualStudioWorkspace
,就可以逐个重写每个文档。以下示例代码将帮助您开始:

Workspace ws = null; //Normally you'd get access to the VisualStudioWorkspace here.
var currentSolution = ws.CurrentSolution;

foreach (var projectId in currentSolution.ProjectIds)
{
    var project = currentSolution.GetProject(projectId);
    foreach (var documentId in project.DocumentIds)
    {
        Document doc = project.GetDocument(documentId);
        var root = await doc.GetSyntaxRootAsync();

        //Rewrite your root here
        var rewrittenRoot = RewriteSyntaxRoot(root);

        //Save the changes to the current document
        doc = doc.WithSyntaxRoot(root);
        //Persist your changes to the current project
        project = doc.Project;
    }
    //Persist the project changes to the current solution
    currentSolution = project.Solution;
}

//Now you have your rewritten solution. You can emit the projects to disk one by one if you'd like.

这不会修改用户的代码,但允许您将自定义项目发送到磁盘或
MemoryStream
,您可以将其加载到
AppDomain
,或直接运行,具体取决于您尝试执行的操作。

,实际上不支持从VisualStudioWorkspace发出消息——有一些属性可能无法正常流动。此外,这当然意味着任何构建都将与正在安装并实际执行构建的Visual Studio相关联,这对于您应该运行的连续构建服务器来说似乎是不好的。最终,这是一个我们现在正在认真考虑的场景,需要所有上下堆栈的支持……这相当困难。