C# 罗斯林综合征
我编写了我的类MonitorSyntaxRewriter,它继承自CSharpSyntaxRewriter。通过这个类,我改变了我的语法树。但是,我如何“注入”这个修改过的synaxtree呢?我的意思是,我在VisualStudio中有一些随机项目,在构建时,我希望所有语法树都通过这个MonitorSyntaxRewriter。有什么选择吗C# 罗斯林综合征,c#,roslyn,C#,Roslyn,我编写了我的类MonitorSyntaxRewriter,它继承自CSharpSyntaxRewriter。通过这个类,我改变了我的语法树。但是,我如何“注入”这个修改过的synaxtree呢?我的意思是,我在VisualStudio中有一些随机项目,在构建时,我希望所有语法树都通过这个MonitorSyntaxRewriter。有什么选择吗 还是有其他可能的解决办法?(创建新的解决方案…)。我只是不想在项目中更改我的*.cs文件 据我所知,在编译语法树并将其发送到磁盘之前,无法插入构建过程并重
还是有其他可能的解决办法?(创建新的解决方案…)。我只是不想在项目中更改我的*.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相关联,这对于您应该运行的连续构建服务器来说似乎是不好的。最终,这是一个我们现在正在认真考虑的场景,需要所有上下堆栈的支持……这相当困难。