C#从DTE获取配置

时间:2017-04-07 13:51:21

标签: c# envdte vspackage

我正在尝试为Visual Studio 2013构建某种自定义配置管理器。我已经创建了一个VSPackage MenuCommand,并且当前在Visual Studio实验实例中运行它。为了获得当前解决方案的项目,我使用:

public static EnvDTE80.DTE2 GetActiveIDE()
{
    // Get an instance of currently running Visual Studio IDE.
    var dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.12.0");      
    return dte2;
}

public static IList<Project> Projects()
{
    Projects projects = GetActiveIDE().Solution.Projects;
    List<Project> list = new List<Project>();
    var item = projects.GetEnumerator();
    while (item.MoveNext())
    {
        var project = item.Current as Project;
        if (project == null)
        {
            continue;
        }
        list.Add(project);
    }

    return list;
}

当我尝试访问项目的ConfigurationManager时,我得到一个NullRefernceException:

var projects = Projects().OrderBy(p => p.Name).ToList();
foreach (var project in projects)
{
    DataRow row = solutionConfigurationData.NewRow();
    row[0] = project.Name;
    row[1] = project.ConfigurationManager.ActiveConfiguration.ConfigurationName;
    row[2] = project.ConfigurationManager.ActiveConfiguration.PlatformName;
}

COM-Object本身(项目)工作正常,因为如果注释掉行[1]和行[2],我会得到所有项目名称的列表。

不知道如何获得项目配置,因为我找到的所有帖子都使用配置管理器。

1 个答案:

答案 0 :(得分:0)

1)不要使用Marshal.GetActiveObject来获取加载扩展的EnvDTE实例,它可以返回另一个正在运行的实例。使用GetService(typeof(EnvDTE.DTE))

2)递归地导航解决方案的项目,而不是线性导航。见HOWTO:Navigate the files of a solution from a Visual Studio .NET macro or add-in

3)如果项目不支持配置,EnvDTE.Project.ConfigurationManager可以返回null。但是对于C#和VB.NET项目,它应该可行。 C ++项目使用不同的项目模型(VCConfiguration)。对于其他项目,可能甚至不能以编程方式支持配置。