使用C# T4模板通过DTE访问项目

9
我目前正在尝试遍历所有的项目(SharePoint),以便将所有功能GUID写入文件。我希望在前缀中使用项目名称。我的问题是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<string, string>();

foreach(Project dteProject in dte.Solution)
{
    var dteProject = dte.Solution.Item(i);
    projects.Add(dteProject.Name, dteProject.FullName);
}

好的——代码没问题——调试器有问题!我的异常是在调试上下文中抛出的,但如果没有连接调试器,模板将正常运行。


我遇到了完全相同的问题,今天早上刚刚遇到了它(问题的提问时间非常好)。在我的情况下,当迭代Project.ProjectItems时,它会抛出InvalidCastException异常。如下所述,只有在调试模板时才会抛出异常。 - daveaglick
2个回答

14

尝试使用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 #>
    <#
}

#>

@Grumbler85:我更新了我的回答。上面的代码是一个T4模板,在我的Visual Studio 2010上成功运行。 - Steven
好的 - 我现在看到问题了 - 我尝试调试我的T4已经有一段时间了 - 但我没有调试你的,但是当我这样做时,你的也失败了。因此,似乎T4调试并不是最好的。 - TGlatzer
如果您正在使用解决方案文件夹,我认为这不起作用,您必须实现某种递归并可能检查Kind。 - Hunter Web Apps
此解决方案将处理具有递归模式的解决方案文件夹。https://dev59.com/7FkT5IYBdhLWcg3wV-GZ - Hunter Web Apps

2

试试这个

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

@Grumbler85 好奇。我经常使用它,没有任何不良影响。 - podiluska
可能是VS2012出了问题? - TGlatzer
好的 - 现在它不会崩溃了,但是我在item.MoveNext()处收到了InvalidCastException...这很奇怪。 - TGlatzer
我能看到你使用T4头文件吗? - TGlatzer
这是包含关系的一部分 - 如果您发布您所拥有的内容,那我可以查看缺少了什么 :) - podiluska

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