在C#T4模板中通过DTE访问项目

我目前正在尝试迭代我的所有项目(sharepoint)以将所有functionguid放入文件中。 我想在它们前面加上项目名称。 我的问题是DTE.Solution.Item和DTE.Solution.Projects.Item(或foreach的枚举器)不会将整数作为参数,foreach返回一个不能转换为Project的对象。

这是我的代码片段:

var hostServiceProvider = (IServiceProvider) Host; var dte = (DTE) hostServiceProvider.GetService(typeof(DTE)); var projectCount = dte.Solution.Projects.Count; var projects = new Dictionary(); foreach(Project dteProject in dte.Solution) { var dteProject = dte.Solution.Item(i); projects.Add(dteProject.Name, dteProject.FullName); } 

好的 – 代码没问题 – 调试器不是! 抛出调试上下文的我的exception,但如果没有附加调试器,模板将运行正常。

试试Solution.Projects属性:

 <#@ template language="C#" debug="true" hostspecific="true" #> <#@ assembly name="Microsoft.VisualStudio.Shell.Interop.8.0" #> <#@ assembly name="EnvDTE" #> <#@ assembly name="EnvDTE80" #> <#@ assembly name="VSLangProj" #> <#@ import namespace="Microsoft.VisualStudio.Shell.Interop" #> <#@ import namespace="EnvDTE" #> <#@ import namespace="EnvDTE80" #> <#@ import namespace="Microsoft.VisualStudio.TextTemplating" #> <#@ output extension=".txt" #> <# var hostServiceProvider = (IServiceProvider)this.Host; var dte = (DTE)hostServiceProvider.GetService(typeof(DTE)); foreach (Project project in dte.Solution) { #> <#= project.Name #> <# } #> 

试试这个

  var item = dte.Solution.Projects.GetEnumerator(); while (item.MoveNext()) { var project = item.Current as EnvDTE.Project; if (project == null) { continue; } ... }