7

我有一个项目根据元数据生成文本(表示一个接口和一个类)。我想将这个生成的代码作为一个新的类和接口直接插入当前在特定项目和目录下打开的解决方案。我将创建菜单工具,将生成的类,但我不知道怎么做是我的自定义的Visual Studio扩展中的下列项目获得进入:从Visual Studio扩展生成代码

  1. 迭代当前的解决方案,并找到一个项目将生成的代码转储到。
  2. 在Visual Studio中打开一个新的文件窗口,并将生成的文本直接从我的工具注入到该窗口中。
  3. 在我的自定义扩展中,在当前解决方案中的特定项目中创建一个新文件夹。

编辑 - 为了澄清我需要打开一个新的文件(例如,右键单击一个项目 - >添加 - >新建类),并从我的自定义的Visual Studio扩展中的文本插入到它。

感谢

+1

你有没有考虑使用T4模板,而不是一个扩展的?您可以在.config文件中将元数据创建为XML,然后运行T4模板以生成每个类/接口。它只适用于1-1元生成的映射。 – DaveShaw 2012-04-12 15:35:15

+0

是的我现在实际上使用T4模板来生成代码,但是这些类是从数据库中的元数据生成的,所以我不希望它们存在于项目中,我希望能够让用户说出哪种类型他们想要,然后我生成代码(使用T4),并返回一个类和一个接口作为文本,这留下了我的问题上面。 – 2012-04-12 16:38:47

+0

将T4模板放在您要使用生成的代码的相同位置是有意义的。 – StingyJack 2012-04-12 16:47:37

回答

10

要创建从一个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"); 
+0

如何在不提示保存对话框(无声保存)的情况下保存生成的文件并将其作为项添加到解决方案? – Gayan 2017-06-09 04:37:02

相关问题