Práce s vlastnostmi projektu Visual C++
Zde je použití rozhraní v konkrétní Microsoft.VisualStudio.VCProjectEngine.dll—in IVCRulePropertyStorage– k získání a nastavení vlastností projektu Visual C++ a vlastnosti položky projektu.Doporučujeme, abyste použití těchto rozhraní, protože nejsou k dispozici prostřednictvím vlastnosti projektu Visual C++ GetProperty a nemusí být stabilní mezi verzemi.
V souborech ve složce % ProgramFiles%\MSBuild\Microsoft.Cpp\v4.0\V120\1033\ jsou definovány vlastnosti projektu Visual C++.Můžete například general.xml obsahuje obecné vlastnosti projektu, debugger_general.xml obsahuje vlastnosti Obecné ladicí program a tak dále.Můžete použít IVCRulePropertyStorage rozhraní pro čtení a zápis pouze vlastnosti, pro které jedné z těchto souborů existuje.
Nastavení a získání vlastnosti položky projektu Visual C++ z Tool vlastnost.
Jiný soubor typy položek mají různé sady vlastností.Najít typ položky souboru v sadě Visual Studio Průzkumníka řešení, otevřete místní nabídku pro soubor a zvolte možnost vlastnosti.Typ položky souboru CPP je například zobrazen jako kompilátor C/C++.Chcete-li vyhledat všechny vlastnosti typu daná položka:
Hledat typ položky zobrazované jméno v adresáři %ProgramFiles%\MSBuild\Microsoft.Cpp\v4.0\V120\1033\.Například při hledání "Kompilátor C/C++", soubor ProjectItemsSchema.xml uvádí, zda je název typu odpovídající položky ClCompile.
Chcete-li vyhledat soubor pravidel pro daný typ položky, vyhledejte ve stejném adresáři.(V takovém případě vzhledem k tomu, že ClCompile se zobrazí v mnoha nesouvisející TARGETS a souborech, můžete omezit hledání na soubory XML.) Soubor pravidel pro typ položky ClCompile je cl.xml.
Hledat v souboru pravidel pro vlastnost, kterou chcete vyhledat.Například vlastnost, která má zobrazovaný název další adresáře zahrnout má název vlastnosti AdditionalIncludeDirectories.
Soubor pravidel také určuje, kde je trvalá dané vlastnosti.Vlastnosti přidružené k ClCompile typ položky zůstávají v souboru projektu.(Vyhledat stálost atribut.) Hodnoty vlastností, které změníte zůstávají v souboru projektu.
Informace o tom, jak používat a rozšiřovat stránky vlastností Visual C++ naleznete v těchto článcích.Uvádějí Visual Studio 2010, ale je stále platná informace o vlastnosti projektu.
Sledovat, jak lze použít následující kód, lze ji integrovat do VSPackage s názvem TestVCProjectProperties, obsahující příkaz nabídky s názvem vlastnosti projektu Test.Informace, jak to provést, naleznete v tématu Názorný postup: Vytváření pomocí šablony balíček Visual Studio příkazu nabídky.
Získání a nastavení vlastností projektu Visual C++
V vlastnosti projektu dialogovém na rozšíření kartu, přidejte odkaz na Microsoft.VisualStudio.VCProjectEngine a na Framework kartu, přidejte odkaz na System.Windows.Forms.
Otevřete soubor TestVCProjectPropertiesPackage.cs.Přidat tyto using direktivy:
using EnvDTE; using EnvDTE80; using System.Windows.Forms; using Microsoft.VisualStudio.VCProjectEngine;
Přidejte odkaz na objekt aplikace – v takovém případě DTE2– k TestVCProjectPropertiesPackage třídy a vytvořte jej v instanci Initialize metoda:
public sealed class TestProjectPropertiesPackage : Package { DTE2 dte2; . . . protected override void Initialize() { Debug.WriteLine (string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this.ToString())); base.Initialize(); // Add command handlers for the menu (commands must exist in the .vsct file) OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService; if ( null != mcs ) { // Create the command for the menu item. CommandID menuCommandID = new CommandID(GuidList.guidTestProjectPropertiesCmdSet, (int)PkgCmdIDList.cmdidMyCommand); MenuCommand menuItem = new MenuCommand(MenuItemCallback, menuCommandID ); mcs.AddCommand( menuItem ); } dte2 = (DTE2)GetService(typeof(DTE)); } }
Odeberte stávající kódu z MenuItemCallback metody.Přidejte kód k získání otevřené projekty.Ujistěte se, že projekt je ve skutečnosti otevřen.
private void MenuItemCallback(object sender, EventArgs e) { VCProject prj; Projects projColl = dte2.Solution.Projects; if (projColl.Count == 0) { MessageBox.Show("You must have a project open in the experimental instance."); return; } if (projColl.Count > 0) { // To be filled in later } }
Získejte první projekt a vyhledejte konfigurace projektu s názvem Win32|Debug:
private void MenuItemCallback(object sender, EventArgs e) { VCProject prj; Projects projColl = dte2.Solution.Projects; if (projColl.Count == 0) { MessageBox.Show("You must have a project open in the experimental instance."); return; } if (projColl.Count > 0) { prj = (VCProject)dte2.Solution.Projects.Item(1).Object; VCConfiguration config = prj.Configurations.Item("Debug|Win32"); } }
V tomto kroku můžete získat IncludePath vlastnost z ConfigurationDirectories pravidla a přidejte D:\Include na aktuální hodnotu.
[!POZNÁMKA]
Můžete buď dvě metody k získání hodnoty vlastností.GetUnevaluatedPropertyValue Metoda získá hodnotu bez vyzkoušet všechny vlastnosti – například $(SolutionDir)– a GetEvaluatedPropertyValue metoda rozšiřuje tyto vlastnosti.
private void MenuItemCallback(object sender, EventArgs e) { VCProject prj; Projects projColl = dte2.Solution.Projects; if (projColl.Count == 0) { MessageBox.Show("You must have a project open in the experimental instance."); return; } if (projColl.Count > 0) { prj = (VCProject)dte2.Solution.Projects.Item(1).Object; VCConfiguration config = prj.Configurations.Item("Debug|Win32"); IVCRulePropertyStorage rule = config.Rules.Item("ConfigurationDirectories") as IVCRulePropertyStorage; string rawValue = rule.GetUnevaluatedPropertyValue("IncludePath"); string evaluatedValue = rule.GetEvaluatedPropertyValue("IncludePath"); rule.SetPropertyValue("IncludePath", rawValue + "D:\\Include;"); // Get the new property value MessageBox.Show(rule.GetUnevaluatedPropertyValue("IncludePath")); } }
Řešení k vytvoření a spuštění ladění.Sestavení se zobrazí v druhou instanci sady Visual Studio označované jako pokusné instance.Otevřít Visual C++ projektu v pokusné instanci.V nabídce, zvolte nástroje, vlastností projektu testu.Dialogové okno zobrazí hodnotu $(VC_IncludePath);$(WindowsSDK_IncludePath);D:\Include;D:\Include;.
Získání a nastavení jazyka Visual C++ – položky projektu vlastnosti
V projektu TestVCProjectProperties jste vytvořili v předchozím postupu, přejděte MenuItemCallback metody.Přidejte následující kód můžete najít soubor CPP v projektu, získat další adresáře zahrnout vlastnost a nastavte ji na D:\Includea zobrazíte dialogové okno, který se zobrazuje nová hodnota:
private void MenuItemCallback(object sender, EventArgs e) { VCProject prj; Projects projColl = dte2.Solution.Projects; if (projColl.Count == 0) { MessageBox.Show("You must have a project open in the experimental instance."); return; } if (projColl.Count > 0) { prj = (VCProject)dte2.Solution.Projects.Item(1).Object; VCConfiguration config = prj.Configurations.Item("Debug|Win32"); IVCRulePropertyStorage rule = config.Rules.Item("ConfigurationDirectories") as IVCRulePropertyStorage; string rawValue = rule.GetUnevaluatedPropertyValue("IncludePath"); string evaluatedValue = rule.GetEvaluatedPropertyValue("IncludePath"); rule.SetPropertyValue("IncludePath", rawValue + "D:\\Include;"); // Get the new property value MessageBox.Show(rule.GetUnevaluatedPropertyValue("IncludePath")); foreach (VCFile file in prj.Files) { if (file.FileType == eFileType.eFileTypeCppCode) { VCFileConfiguration fileConfig = file.FileConfigurations.Item("Debug|Win32") as VCFileConfiguration; IVCRulePropertyStorage fileRule = fileConfig.Tool as IVCRulePropertyStorage; string evaluatedValue2 = fileRule.GetEvaluatedPropertyValue("AdditionalIncludeDirectories"); fileRule.SetPropertyValue("AdditionalIncludeDirectories", "D:\\Include"); MessageBox.Show(fileRule.GetEvaluatedPropertyValue("AdditionalIncludeDirectories")); } } } }
Řešení k vytvoření a spuštění ladění.Otevřít Visual C++ projektu v pokusné instanci.V nabídce, zvolte nástroje, vlastností projektu testu.Dialogové okno zobrazí hodnotu $(VC_IncludePath); $(WindowsSDK_IncludePath); D:\Include;D:\Include;, a druhý dialogové okno zobrazí hodnotu D:\Include.
K prohlédnutí, kde je tato hodnota trvalá, uložte všechny soubory v otevřeného projektu v pokusné instanci.Nová hodnota se zobrazí v souboru VCXPROJ.
Zjišťování změn hodnota vlastnosti
Můžete přihlásit k odběru ItemPropertyChange2 událostí zjistit, kdy vlastnost projektu Visual C++ nebo vlastnost položky projekt získá jinou hodnotu.
V TestVCProjectPropertiesPackage třídy, vytvoří obslužnou rutinu události pro tuto událost.V takovém případě obslužná rutina zobrazí pouze zobrazí dialogové okno Vlastnosti, která byla změněna.
void OnVCProjectEngineItemPropertyChange(Object item, string strPropertySheet, string strItemType, string PropertyName) { MessageBox.Show("got property change event for " + PropertyName); }
V Initialize v případě metody získat VCProjectEngineEventsObject z objektu application událostí, a přidat obslužnou rutinu události, které jste právě vytvořili:
protected override void Initialize() { Debug.WriteLine (string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this.ToString())); base.Initialize(); // Add the command handlers for the menu (commands must exist in the .vsct file) OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService; if ( null != mcs ) { // Create the command for the menu item CommandID menuCommandID = new CommandID(GuidList.guidTestProjectPropertiesCmdSet, (int)PkgCmdIDList.cmdidMyCommand); MenuCommand menuItem = new MenuCommand(MenuItemCallback, menuCommandID ); mcs.AddCommand( menuItem ); } dte2 = (DTE2)GetService(typeof(DTE)); VCProjectEngineEvents vcProjectEvents = dte2.Events.GetObject("VCProjectEngineEventsObject") as VCProjectEngineEvents; vcProjectEvents.ItemPropertyChange2 += new _dispVCProjectEngineEvents_ItemPropertyChange2EventHandler(OnVCProjectEngineItemPropertyChange); }
Řešení k vytvoření a spuštění ladění.Otevřít Visual C++ projektu v pokusné instanci.V nabídce, zvolte nástroje, vlastností projektu testu.Zobrazí dialogové okno $(VC_IncludePath); $(WindowsSDK_IncludePath); D:\Include;D:\Include;, se zobrazí dialogové okno druhý Got událost změny vlastnosti pro IncludePath, třetí pole zobrazí dialogové okno D:\Include, a zobrazí dialogové okno čtvrtou Got událost změny vlastnosti pro AdditionalIncludeDirectories.
[!POZNÁMKA]
Nezískáte událost změny vlastnosti, poté, co jsou držena formou změny v tomto kódu.Chcete-li zobrazit události, změňte hodnotu vlastnosti na něco jiného.