ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – Roslyn SyntaxTree改变注入

2019-06-23 14:54:34  阅读:544  来源: 互联网

标签:c roslyn


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

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

解决方法:

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

这意味着实现您想要的并不容易.但是,您的项目并非不可能,您可以想象创建自己的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或直接运行,具体取决于您尝试执行的操作.

标签:c,roslyn
来源: https://codeday.me/bug/20190623/1271801.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有