Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有关Visual Studio项目创建的事件_C#_Events_Visual Studio Addins_Envdte_Visual Studio Templates - Fatal编程技术网

C# 有关Visual Studio项目创建的事件

C# 有关Visual Studio项目创建的事件,c#,events,visual-studio-addins,envdte,visual-studio-templates,C#,Events,Visual Studio Addins,Envdte,Visual Studio Templates,我想在用户在Visual Studio 2010\2012中创建project\solution时添加功能。i、 e.创建新项目时,我需要执行C#代码 我在谷歌上搜索了很多,但没有找到任何在项目创建后激发的事件。 有什么方法可以做到这一点吗?创建一个包含代码的模板项目。因此,其他用户可以使用您的模板,而不是默认的VS模板。如果您试图捕获交互式项目创建(即用户从菜单中选择“新建->项目”),您应该能够直接挂接菜单事件。然而,VisualStudio并不直接提供这些事件 。 是的,这篇文章很古老,但

我想在用户在Visual Studio 2010\2012中创建project\solution时添加功能。i、 e.创建新项目时,我需要执行C#代码

我在谷歌上搜索了很多,但没有找到任何在项目创建后激发的事件。

有什么方法可以做到这一点吗?

创建一个包含代码的模板项目。因此,其他用户可以使用您的模板,而不是默认的VS模板。

如果您试图捕获交互式项目创建(即用户从菜单中选择“新建->项目”),您应该能够直接挂接菜单事件。然而,VisualStudio并不直接提供这些事件

。 是的,这篇文章很古老,但我相信它仍然是准确的。如果我错了,请纠正我。自从我创建VS扩展以来,已经有很长时间了。事件友好名称可能类似于“New.Project”。您必须计算出GUID和ID

如果您以前未创建Visual Studio扩展


如果您试图捕获非交互式的项目创建,那么还有很多地方需要钩住。比我聪明的人必须插话。

问题是事件只在运行时触发。由于项目的创建不是在运行时进行的,因此没有相关的事件


我能想到的唯一方法是检查包含所有项目的文件夹的大小,看看它是否发生了更改,然后在进行一些研究后启动您的C#code

,多亏了@Joe Steele提到的文章,我成功地连接了事件,负责项目创建:

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
    ,但这是有帮助的

  • 有时,在调试过程中,事件根本没有触发,这让我感到困惑,但谢天谢地,我偶然发现了这条建议:

  • SolutionEvents对象可能超出范围,并在解决方案关闭之前被垃圾收集。要保留对此对象的引用,请在实现解决方案事件处理程序的类中声明一个私有变量

    因此,引入私有变量解决了这个问题:

    private CommandEvents createCmd;
    

    我需要执行C代码你这是什么意思?你能详细解释一下吗。你是说你想运行C#cmd/u想在project/you wan中插入预定义的C#code来触发一些C#exe还是什么?我有一个C#code,它使用envde等,我想把它添加为函数,或者在创建项目时调用的其他东西。我不确定,但试试看这是否能帮到你。我以前尝试过,但是VS2010 C++模板项目只支持JavaScript代码,我想执行C代码。这样可以工作,但是有3个问题:一,我只是VS插件,我不能一直检查用户文件夹的大小(我可以执行哪个事件?)第二个-用户可以将其项目添加到计算机中的任何位置,因此我没有要检查的特定文件夹。第三,当我检测到尺寸变化时,我如何知道添加了哪个项目?也许用户添加了另一个文件?