我正在尝试为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],我会得到所有项目名称的列表。
不知道如何获得项目配置,因为我找到的所有帖子都使用配置管理器。
答案 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)。对于其他项目,可能甚至不能以编程方式支持配置。