我正在尝试找到一种方法来编写视觉工作室“东西”,或者使用那里的工具,它允许我解析每一行,以便我可以在其他代码周围添加自定义代码,我将使用我自己的算法进行检查。
基本上,我想从 Visual Studio 代码编辑器中获取当前文件的读取文本,然后用我修改后的代码将其替换为新版本。
看着 resharper,宏,想不出办法做到这一点,我不想从文件中复制所有代码,将其粘贴到我要编写的 Windows 应用程序表单中,然后复制粘贴回来。有任何想法吗?
谢谢
我正在尝试找到一种方法来编写视觉工作室“东西”,或者使用那里的工具,它允许我解析每一行,以便我可以在其他代码周围添加自定义代码,我将使用我自己的算法进行检查。
基本上,我想从 Visual Studio 代码编辑器中获取当前文件的读取文本,然后用我修改后的代码将其替换为新版本。
看着 resharper,宏,想不出办法做到这一点,我不想从文件中复制所有代码,将其粘贴到我要编写的 Windows 应用程序表单中,然后复制粘贴回来。有任何想法吗?
谢谢
我建议使用Roslyn来完成这项任务。它提供了读取解决方案和项目的工具,然后将其中的源文件实现为它们的组成语法或语义树。Eric Lippert在他的博客上介绍了 CTP(重点是我的):
Roslyn 是一个代码分析 API 库,可用于构建编译器、开发环境、重构引擎等。它支持 C# 和 Visual Basic 的词汇、语法和语义分析。这太棒了。
您还可以使用Roslyn 创建 IDE Extensions,包括创建自己的重构工具:
为了扩展 Visual Studio IDE,编辑器服务 API 向现有语言服务功能公开了一组扩展点。其中的一些示例包括完成列表、代码大纲、突出显示引用、语法分类器和代码重构。对于这些扩展中的每一个,您都需要创建自己的 MEF 提供程序,并确保至少有一个 Export* 属性来描述有关提供程序的重要详细信息。
在另一个问题中,我演示了用这个主循环在最少量的代码中替换类型名称(例如int
with ):Int32
var workspace = Workspace.LoadSolution(path);
var solution = workspace.CurrentSolution;
foreach (var project in solution.Projects
.Where(prj => prj.LanguageServices.Language == "C#"))
{
foreach (var doc in project.Documents
.Where(d => d.SourceCodeKind == SourceCodeKind.Regular
&& d.LanguageServices.Language == "C#"))
{
var tree = SyntaxTree.ParseCompilationUnit(
doc.GetText(),
doc.DisplayName);
// Update the syntax tree
var newTree = UpdatePredefinedTypes(tree);
solution = solution.UpdateDocument(doc.Id, newTree.Text);
}
}
workspace.ApplyChanges(workspace.CurrentSolution, solution);
// When you run this on a project open in VS it notices the changes
您可以查看Visual Studio 自动化扩展点
或者您可以对所有文件进行后处理..想想您提到的复制/粘贴解决方案,但不是复制/粘贴,而是从磁盘读取文件并将它们写回。这可能由文件修改或用户交互触发。