Roslyn SyntaxTree改变了注射

时间:2015-10-25 12:58:42

标签: c# roslyn

我编写了我的类MonitorSyntaxRewriter,它继承自CSharpSyntaxRewriter。通过这门课,我改变了我的SyntaxTree。但是,我怎样才能注射"这个修改过的synaxtree在哪里?我的意思是,我在Visual Studio中有一些随机项目,在Build上,我希望所有语法树都通过这个MonitorSyntaxRewriter。那有什么选择吗?

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

1 个答案:

答案 0 :(得分:4)

据我所知,您可以插入构建过程并在语法树重新编译并发送到磁盘之前重写它们。

这意味着实现您想要的并不容易。但是,您的项目是不可能的,您可以想象创建自己的Visual Studio扩展,为Visual Studio添加一个菜单选项,并启动您自己的构建和发出进程。

为了重写语法树并将其应用于解决方案,您需要将它们应用于父文档。编写Visual Studio扩展时,您将要访问VisualStudioWorkspace。它包含当前打开的解决方案中的解决方案,项目和文档。我在您可能感兴趣的工作区上写了一些background info

您可以通过以下方式MEF导入 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或运行直接取决于你想要做的事情。