我使用自定义向导做了类似的事情。
出于我的目的,我只想在每个类中注入一些简单的宏,以将其插入到静态工厂对象中。
我不需要修改实际的向导,只需复制默认的泛型类向导并修改代码生成 javascript。
该主题的文档是垃圾,但这里是 javascript 的一个很好的起点(这是您将获得最大权力的地方):
http://msdn.microsoft.com/en-us/library/t41260xs(v=VS.71).aspx
默认类向导 javascript 位于此处:
C:\Program Files\Microsoft Visual Studio 10.0\VC\VCWizards\CodeWiz\Generic\Class\Scripts\1033\default.js
复制项目
复制这个比我想象的要棘手,你需要复制并粘贴
Microsoft Visual Studio 10.0\VC\VCWizards\CodeWiz\Generic\
文件夹,然后前往:
C:\Program Files\Microsoft Visual Studio 10.0\VC\VCAddClass\Generic
复制此文件夹并修改其中的 Generic.vsdir 以指向 ..\Simple.vsz(VCAddClass 文件夹中的文件)的复制。
Simple.vsz 文件指向您在开始时欺骗的 VCWizards 中“通用”文件夹的位置,因此将新的 simple.vsz 指向该位置。
代码生成
至于实际的代码生成,并不难掌握。为了更快地开始,这是 default.js 的一般工作方式:
向导完成后,代码生成方法将从以下位置开始:
function OnFinish(selProj, selObj)
selProj 是(据我所知)EnvDTE.Project 的一个实例
http://msdn.microsoft.com/en-us/library/envdte.project.aspx
从向导获取信息似乎基于:
wizard.FindSymbol("CLASS_NAME")
真正的魔法开始发生在 selProj.CodeModel 对象上
oCM.AddClass(strClassName, strHeader, vsCMAddPositionEnd, "", "", vsCMAccessDefault);
似乎这些方法向文件添加任何内容的约定只是将文件修改为单个操作,因为它需要文件路径作为其参数。
这将返回一个 CodeClass 实例,并且可以通过其方法添加,例如:
AddAttribute
AddFunction
...
如果您正在寻找非常严格的代码格式(或者在我的情况下插入不符合正常代码语法的宏,这将是非常严格的。
解决此问题的简单方法是为您需要使用 EditPoint 界面完全控制的部分自己构建一个字符串。
EditPoint 是代码文件中的一个位置,您可以调用如下方法:
EditPoint.Insert(string)
Editpoint.InsertFromFile(path)
要在要插入代码的位置获取 EditPoint,只需使用代码生成文件中现有项目之一的位置(如类或构造函数)并使用 .StartPointOf 或 .EndPointOf 获取 TextPoint 并操作参数.
拥有 TextPoint 后,您可以像这样创建 EditPoint:
newclass.EndPointOf(vsCMPartBody).CreateEditPoint().Insert("\nprivate:\n REGISTER_TYPE_MEMBER("+strClassName+");\n");
要改为在 .cpp 文件中获取 TextPoint:
oConstructor.StartPointOf(vsCMPartWhole,vsCMWhereDefinition).CreateEditPoint().Insert("REGISTER_TYPE_BODY_ID("+strClassName+",REPLACE_ID);\n\n\n");
这使您能够通过 JScript 字符串操作来做任何您想做的事情,只要您可以通过向导找到所需的输入数据(我还没有深入研究)