从Visual Studio扩展生成代码

10
我有一个生成文本的项目(表示接口和类),基于元数据。我想把这个生成的代码作为一个新的类和接口插入到当前打开的解决方案中的特定项目和目录下面。我会创建一个生成类的菜单工具,但是我不知道如何从我的自定义Visual Studio扩展程序中访问以下项目:
  1. 迭代当前解决方案并找到要转储生成代码的项目。
  2. 在Visual Studio中打开一个新的文件窗口,并将来自我的工具的生成文本直接注入该窗口。
  3. 在自定义扩展程序中在当前解决方案的特定项目中创建一个新的文件夹。
编辑 - 澄清一下,我需要打开一个新文件(例如,右键单击项目 -> 添加 - > 新类)并从我的自定义Visual Studio扩展中将文本插入其中。
谢谢

1
你有没有考虑使用 T4 模板来代替扩展?你可以在 .config 文件中创建 XML 格式的元数据,然后运行 T4 模板来生成每个类/接口。但是这种方法只适用于一对一的元数据映射。 - DaveShaw
是的,我现在实际上正在使用T4模板来生成代码,但这些类是从数据库中的元数据生成的,所以我不希望它们存在于项目内,我想让用户能够说出他们想要哪种类类型,然后我使用T4生成代码并返回一个类和一个接口作为文本,这就让我面临上述问题。 - John Maloney
把T4模板放在你将使用生成的代码的同一个位置是有意义的。 - StingyJack
@JohnMaloney 你可以使用T4模板查询数据库。我们有一些调用存储过程来生成自定义实体和DAL代码的模板。 - DaveShaw
@DaveShaw,目前我正在做的就是允许用户右键单击一个项目并打开一个VS工具窗口,让他们选择要生成的类的类型,然后使用T4模板为该类和接口生成完整的源代码。这个过程没有问题,我需要知道如何在Visual Studio中打开一个新窗口,将我的生成文本插入其中(例如,右键单击一个项目->添加->新类),并从我的自定义Visual Studio扩展中插入文本。 - John Maloney
1个回答

15

要从 Visual Studio 扩展 (ToolWindowPane) 创建一个新文件,首先使用 GetService 方法:

// Get an instance of the currently running Visual Studio IDE
DTE dte = (DTE)GetService(typeof(DTE));

其次,请确保当前打开了一个解决方案。如果没有打开解决方案,则文件生成将无法正常工作:

string solutionDir = System.IO.Path.GetDirectoryName(dte.Solution.FullName);

第三步,从DTE对象生成新文件:

dte.ItemOperations.NewFile(@"General\Visual C# Class", "ObjectOne", EnvDTE.Constants.vsViewKindTextView);

创建新文件后,使用以下代码访问该文件的文本并将其替换为您生成的文本:

TextSelection txtSel = (TextSelection)dte.ActiveDocument.Selection;
TextDocument txtDoc = (TextDocument)dte.ActiveDocument.Object("");

txtSel.SelectAll();
txtSel.Delete();
txtSel.Insert("Hello World");

2
如何在不提示保存对话框的情况下(静默保存)保存生成的文件并将其添加到解决方案中? - Gayan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接