以编程方式创建Visual Studio项目

11

我想基于一个已创建、测试并运行良好的模板创建一个新项目,但是当我试图在C#代码(在MVC3项目中)中完成时,遇到了两个问题:

  1. EnvDTE80、EnvDTE90和EnvDTE100之间有什么区别?因为我尝试使用EnvDTE100进行这个示例,但它不起作用,因为该对象处理的是Solution4而不是Solution2Solution4的行为不同。
  2. 如何在不使用默认路径的情况下创建项目,而使用我需要的特定文件夹?

更新:

这里是使用名为EnvDTE80的dll可以工作的代码:

  System.Type type = System.Type.GetTypeFromProgID("VisualStudio.DTE.8.0");
  Object obj = System.Activator.CreateInstance(type, true);
  EnvDTE80.DTE2 dte = (EnvDTE80.DTE2)obj;
  Solution2 _solution = (Solution2)dte.Solution;
  string projectTemplatePath = @"C:\Documents and Settings\jmachado\Escritorio";
  projectTemplatePath =_solution.GetProjectTemplate("",""); <-- looking for some overload to create project based in a specific folder an not from '<drive>:\Program Files\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\Language.'

但是如果我使用了EnvDTE100

  System.Type type = System.Type.GetTypeFromProgID("VisualStudio.DTE.10.0");
  Object obj = System.Activator.CreateInstance(type, true);
  EnvDTE100.DTE2 dte = (EnvDTE100.DTE2)obj;
  Solution4 _solution = (Solution4)dte.Solution;
  string projectTemplatePath = @"C:\Documents and Settings\jmachado\Escritorio";
  projectTemplatePath =_solution.GetProjectTemplate("",""); <-- looking for some overload to create project based in a specific folder an not from '<drive>:\Program Files\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\Language.'

并且表示DTE2在EnvDTE100的命名空间中不存在。


听起来你想使用虚拟目录,而不是将所有代码复制到每个新项目中。你可以使用一个源,这样你就可以一次性修复所有错误(而不必为所有项目进行修复)。http://learn.iis.net/page.aspx/150/understanding-sites-applications-and-virtual-directories-on-iis/ - Lloyd Powell
1
你能分享一些示例代码来阐明你的问题吗? - Joachim Isaksson
@Joachim Isaksson 好的,请给我两分钟更新问题。 - Jorge
@Joachim Isaksson 好的,这个方案解决了第一个问题,但对于第二个问题呢? - Jorge
这里有一个类似的帖子: http://stackoverflow.com/questions/770264/visual-studio-extensibility-programmatically-creating-a-project/18156838#18156838希望能对你有所帮助! - cvillalobosm
显示剩余3条评论
1个回答

7

EnvDTE80、EnvDTE90和EnvDTE100是用于VS 8.0 (2005)、9.0 (2008)和10.0 (2010)的DTE类型库。

截至VS2010,只有两个DTE根对象接口,其中DTE2是最新的。因此,要获取VS 2010的DTE对象,可以执行以下操作:

System.Type type = System.Type.GetTypeFromProgID("VisualStudio.DTE.10.0");
Object obj = System.Activator.CreateInstance(type, true);
EnvDTE80.DTE2 dte = (EnvDTE100.DTE2)obj;

请注意,ProgID是“10.0”,但变量类型仍为EnvDTE80.DTE2

其余的应该可以从那里开始工作。还要注意,如果需要,您始终可以将Solution4转换为Solution2(但GetProjectTemplate应直接在Solution4上可用)。


你好,感谢询问。现在我还有第二个问题,如何创建一个具有特定路径的项目,而不是使用 Visual Studio 默认的路径? - Jorge
我不太理解该请求。如果您有自己的自定义项目模板,而没有将其复制到 VS 模板文件夹中,则不要使用 GetProjectTemplate,而是直接将完整路径传递给 AddFromTemplate - Pavel Minaev
有没有类似于VS2015的替代方案,或者我们只能使用DTE100? - tofutim
你需要在 GetTypeFromProgID 中使用适当的 DTE 版本,例如对于 VS 2015,使用 VisualStudio.DTE.14.0。当多个 Visual Studio 版本并存时,这将确定你正在与哪一个版本交互。接口名称(DTE2)保持不变。它们是累积的 - 每个新版本都支持所有旧接口。同样,包含这些旧接口定义的类型库随新的 VS 版本一起发布。 - Pavel Minaev
1
@Pavel Minaev...你上面展示的代码在VS2015中不起作用,它报错说EnvDTE100对象上不可用DTE2。而且我正在使用GetTypeFromProgId方法中正确的VS2015字符串引用。 - dinotom

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