我希望在用户在Visual Studio 2010\2012中创建新项目或解决方案时添加功能,即需要在创建新项目时执行C#代码。
我已经搜索了很多,但没有找到任何在项目创建期间被触发的事件。
有什么方法可以实现吗?
我希望在用户在Visual Studio 2010\2012中创建新项目或解决方案时添加功能,即需要在创建新项目时执行C#代码。
我已经搜索了很多,但没有找到任何在项目创建期间被触发的事件。
有什么方法可以实现吗?
经过一些研究和感谢@Joe Steele提到的文章,我已经成功钩取了CommandEvents.AfterExecute
事件,该事件负责项目创建:
DTE application = this.GetService(typeof(SDTE)) as DTE;
string guidVSStd97 = "{5efc7975-14bc-11cf-9b2b-00aa00573819}".ToUpper();
int cmdidNewProject = 216;
this.createCmd = application.Events.CommandEvents[guidVSStd97, cmdidNewProject];
this.createCmd.AfterExecute += this.command_AfterExecute;
void command_AfterExecute(string Guid, int ID, object CustomIn, object CustomOut)
{
// place your code here
}
注意:
可能最困难的部分是找到正确的guid
和commandId
,但this article有所帮助。
有时,在调试过程中,事件根本不会触发,这让我感到困惑,但幸运的是,我偶然发现了这个建议:
解决方案事件对象可能在解决方案关闭之前超出范围并被垃圾回收。为了保留对该对象的引用,请在实现解决方案事件处理程序的类中声明一个私有变量。 来源
因此,引入私有变量解决了这个问题:
private CommandEvents createCmd;
如果您正在尝试捕获交互式项目创建(即用户从菜单中选择“新建 -> 项目”),则应该能够钩住菜单事件。但是,Visual Studio不直接提供这些事件。
Microsoft支持论坛上的这篇文章谈到了绕过这个问题的方法。 是的--这篇文章非常古老,但我认为仍然准确。如果我错了,请纠正我。自从我创建VS扩展以来已经过了很长时间。事件友好名称可能类似于“New.Project”。您将不得不找出GUID和ID。
如果您之前没有创建过Visual Studio扩展,这是一个很好的起点。
如果您正在尝试捕获非交互式项目创建--那么有更多的地方可以钩住。比我聪明的人会发表意见。