Configuration.Properties对象在Visual Studio 2017 VSIX扩展

时间:2017-04-14 20:30:36

标签: c# visual-studio-2015 visual-studio-2017 visual-studio-extensions

我使用VSIX项目模板为Visual Studio 2015构建了一个扩展。当您在解决方案资源管理器中右键单击项目时,它会在上下文菜单中添加一个按钮。单击此按钮时,它会更改该项目的某些调试设置,以便可以进行调试。

但是,我还需要使它与Visual Studio 2017兼容。就菜单中出现的按钮而言,一切似乎都能正常工作。我使用dte2对象来获取当前选定的项目,然后使用它来获取所选项目。从那里我得到活动配置并使用它来改变项目的属性。

在获得配置对象之前,一切正常。我可以获取该对象,但是当我尝试获取configuration.properties时,它返回null。

DTE2 dte2 = (DTE2)Package.GetGlobalService(typeof(SDTE));
SelectedItem selectedItem = dte2.SelectedItems.Item(1);
Project project = selectedItem.Project;

Configuration configuration = project.ConfigurationManager.ActiveConfiguration;
string path = configuration.Properties.Item("OutputPath").value.ToString();

在我尝试从配置中获取属性之前,一切正常。它返回null,所以当我使用.Item()时出现错误。

这个代码在Visual Studio 2015中对我有用,但它在Visual Studio 2017中不起作用。有没有人知道任何解决方案或解决这个问题?

This是我在谷歌研究之后发现的唯一相关链接。但是,视觉工作室团队的唯一回应是他们没有足够的信息。

修改 这就是我最终为我工作的原因:

DTE2 dte2 = (DTE2)Package.GetGlobalService(typeof(SDTE));
SelectedItem selectedItem = dte2.SelectedItems.Item(1);
Project project = selectedItem.Project;

VCProject vcproj = project.Object as VCProject;
VCConfiguration vcconfig = vcproj.ActiveConfiguration;
VCDebugSettings vcdebug = vcconfig.DebugSettings as VCDebugSettings;

然后VCDebugSettings对象可以编辑项目的调试属性。可以找到可用的属性here

1 个答案:

答案 0 :(得分:0)

  

有没有人知道任何解决方案或解决这个问题?

如果您的项目是c ++项目,则可以使用VCProject获取配置对象。像这样:

 private void GetProjectProperties(object sender, EventArgs e)
        {
            DTE2 dte = (DTE2)Package.GetGlobalService(typeof(SDTE));
            VCProject prj = dte.Solution.Projects.Item(1).Object as VCProject;
            foreach (VCConfiguration vccon in prj.Configurations)
            {
                IVCRulePropertyStorage generalRule = vccon.Rules.Item("ConfigurationGeneral");

                string outputPath = vccon.OutputDirectory;

                vccon.OutputDirectory = "$(test)";
                //string test1 = generalRule.GetEvaluatedPropertyValue(2);
                string tar = generalRule.GetEvaluatedPropertyValue("TargetExt");
                string name = generalRule.GetEvaluatedPropertyValue("TargetName");
            }
}