以编程方式创建 Visual Studio 项目
Posted
技术标签:
【中文标题】以编程方式创建 Visual Studio 项目【英文标题】:Create a Visual Studio project programmatically 【发布时间】:2012-02-06 02:41:41 【问题描述】:正如我的问题所说,我想创建一个基于模板的新项目,该模板已经创建了一个经过测试并且工作正常,但是当我尝试在 C# 代码中(在 mvc3 项目中)执行它时遇到两个问题。
EnvDTE80, EnvDTE90 and EnvDTE100
之间有哪些区别,因为我尝试使用 EnvDTE100
执行 this example 但它不起作用,因为对象处理它是 Solution4
而不是 Solution2
和 Solution4
没有相同的行为。
如何在不使用默认路径但使用我需要的特定文件夹的情况下创建项目
更新
如果我使用名为 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
的命名空间中退出
【问题讨论】:
听起来您想参与一个虚拟目录,而不是将所有代码复制到可以使用一个源的每个新项目中,这样您就可以一次修复所有错误(而不是必须修复所有项目)。 learn.iis.net/page.aspx/150/… 您能否分享一些示例代码来说明您实际尝试实现的目标以澄清您的问题? @Joachim Isaksson 当然,请给两分钟更新问题 @Joachim Isaksson 完成,问题已经更新了 查看***.com/questions/6833119/…,它似乎可以处理您所看到的内容。 【参考方案1】:EnvDTE80、EnvDTE90 和 EnvDTE100 分别是 VS 8.0 (2005)、9.0 (2008) 和 10.0 (2010) 的 DTE 类型库。
只有两个 DTE 根对象接口,截至 VS2010 - 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 默认设置不同的特定路径创建项目?? 我不太明白这个请求。如果您有自己的自定义项目模板,但没有复制到 VS 模板文件夹,则不要使用GetProjectTemplate
,而只需将模板的完整路径直接传递给AddFromTemplate
。
是否有 VS2015 的等价物,还是我们只使用 DTE100?
您需要在GetTypeFromProgID
中使用合适的DTE版本,例如VisualStudio.DTE.14.0
用于 VS 2015。当并排安装多个 Visual Studio 版本时,这将确定您正在与哪个版本交谈。不过,接口名称 (DTE2
) 保持不变。这些是累积的——每个新版本都支持所有旧接口。同样,包含这些旧接口定义的类型库也随新的 VS 版本一起提供。
@Pavel Minaev... 您上面显示的代码不适用于 VS2015,它错误地说 DTE2 在 EnvDTE100 对象上不可用。我在 GetTypeFromProgId 方法中使用了 VS2015 的正确字符串引用。以上是关于以编程方式创建 Visual Studio 项目的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式创建 pro 时如何在 Visual Studio 中查看资源文件内容
以编程方式监视在 Visual Studio 中打开了哪个选项卡
EnvDTE.DTE 为 Visual Studio 2015 创建空的 C++ 项目
我可以在 Visual Studio 2012 中以编程方式折叠/展开某个名称的所有预处理器块吗?
Visual Studio Express中缺少文件,无法打开项目;如果我重新创建项目,我还能以某种方式与Github同步吗?