Evrensel Windows projelerini yönetme

Evrensel Windows uygulamaları, hem Windows 8.1 hem de Windows Telefon 8.1'i hedefleyen uygulamalardır ve geliştiricilerin her iki platformda da kod ve diğer varlıkları kullanmasına olanak tanır. Paylaşılan kod ve kaynaklar paylaşılan bir projede tutulurken, platforma özgü kod ve kaynaklar biri Windows, diğeri windows Telefon için ayrı projelerde tutulur. Evrensel Windows uygulamaları hakkında daha fazla bilgi için bkz . Evrensel Windows uygulamaları. Projeleri yöneten Visual Studio uzantıları, evrensel Windows uygulama projelerinin tek platformlu uygulamalardan farklı bir yapıya sahip olduğunu bilmeli. Bu kılavuz, paylaşılan projede gezinmeyi ve paylaşılan öğeleri yönetmeyi gösterir.

  1. TestUniversalProject adlı bir C# VSIX projesi oluşturun. (Dosya>Yeni>Proje ve ardından C#>Genişletilebilirlik>Visual Studio Paketi). Özel Komut proje öğesi şablonu ekleyin (Çözüm Gezgini proje düğümüne sağ tıklayın ve Yeni Öğe Ekle'yi>seçin ve Genişletilebilirlik'e gidin). Dosyayı TestUniversalProject olarak adlandırın.

  2. Microsoft.VisualStudio.Shell.Interop.12.1.DesignTime.dll ve Microsoft.VisualStudio.Shell.Interop.14.0.DesignTime.dll için başvuru ekleyin (Uzantılar bölümünde).

  3. TestUniversalProject.cs dosyasını açın ve aşağıdaki using yönergeleri ekleyin:

    using EnvDTE;
    using EnvDTE80;
    using Microsoft.VisualStudio;
    using Microsoft.VisualStudio.PlatformUI;
    using Microsoft.Internal.VisualStudio.PlatformUI;
    using System.Collections.Generic;
    using System.IO;
    using System.Windows.Forms;
    
  4. TestUniversalProject sınıfında Çıkış penceresine işaret eden özel bir alan ekleyin.

    public sealed class TestUniversalProject
    {
        IVsOutputWindowPane output;
    . . .
    }
    
  5. Başvuruyu TestUniversalProject oluşturucusunun içindeki çıkış bölmesine ayarlayın:

    private TestUniversalProject(Package package)
    {
        if (package == null)
        {
            throw new ArgumentNullException("package");
        }
    
        this.package = package;
    
        OleMenuCommandService commandService = this.ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
        if (commandService != null)
        {
            CommandID menuCommandID = new CommandID(MenuGroup, CommandId);
            EventHandler eventHandler = this.ShowMessageBox;
            MenuCommand menuItem = new MenuCommand(eventHandler, menuCommandID);
            commandService.AddCommand(menuItem);
        }
    
        // get a reference to the Output window
        output = (IVsOutputWindowPane)ServiceProvider.GetService(typeof(SVsGeneralOutputWindowPane));
    }
    
  6. Yönteminden ShowMessageBox mevcut kodu kaldırın:

    private void ShowMessageBox(object sender, EventArgs e)
    {
    }
    
  7. Bu kılavuzda birkaç farklı amaçla kullanacağımız DTE nesnesini alın. Ayrıca, menü düğmesine tıklandığında bir çözümün yüklendiğinden emin olun.

    private void ShowMessageBox(object sender, EventArgs e)
    {
        var dte = (EnvDTE.DTE)this.ServiceProvider.GetService(typeof(EnvDTE.DTE));
        if (dte.Solution != null)
        {
            . . .
        }
        else
        {
            MessageBox.Show("No solution is open");
            return;
        }
    }
    
  8. Paylaşılan projeyi bulun. Paylaşılan proje saf bir kapsayıcıdır; oluşturmaz veya çıkış oluşturmaz. Aşağıdaki yöntem, paylaşılan proje özelliğine sahip nesneyi arayarak çözümdeki IVsHierarchy ilk paylaşılan projeyi bulur.

    private IVsHierarchy FindSharedProject()
    {
        var sln = (IVsSolution)this.ServiceProvider.GetService(typeof(SVsSolution));
        Guid empty = Guid.Empty;
        IEnumHierarchies enumHiers;
    
        //get all the projects in the solution
        ErrorHandler.ThrowOnFailure(sln.GetProjectEnum((uint)__VSENUMPROJFLAGS.EPF_LOADEDINSOLUTION, ref empty, out enumHiers));
        foreach (IVsHierarchy hier in ComUtilities.EnumerableFrom(enumHiers))
        {
            if (PackageUtilities.IsCapabilityMatch(hier, "SharedAssetsProject"))
            {
                return hier;
            }
        }
        return null;
    }
    
  9. yöntemindeShowMessageBox, paylaşılan projenin başlık (Çözüm Gezgini görünen proje adı) çıktısını verin.

    private void ShowMessageBox(object sender, EventArgs e)
    {
        var dte = (DTE)this.ServiceProvider.GetService(typeof(DTE));
    
        if (dte.Solution != null)
        {
            var sharedHier = this.FindSharedProject();
            if (sharedHier != null)
            {
                string sharedCaption = HierarchyUtilities.GetHierarchyProperty<string>(sharedHier, (uint)VSConstants.VSITEMID.Root,
                     (int)__VSHPROPID.VSHPROPID_Caption);
                output.OutputStringThreadSafe(string.Format("Found shared project: {0}\n", sharedCaption));
            }
            else
            {
                MessageBox.Show("Solution has no shared project");
                return;
            }
        }
        else
        {
            MessageBox.Show("No solution is open");
            return;
        }
    }
    
  10. Etkin platform projesini alın. Platform projeleri, platforma özgü kod ve kaynaklar içeren projelerdir. Aşağıdaki yöntem, etkin platform projesini almak için yeni alanı VSHPROPID_SharedItemContextHierarchy kullanır.

    private IVsHierarchy GetActiveProjectContext(IVsHierarchy hierarchy)
    {
        IVsHierarchy activeProjectContext;
        if (HierarchyUtilities.TryGetHierarchyProperty(hierarchy, (uint)VSConstants.VSITEMID.Root,
             (int)__VSHPROPID7.VSHPROPID_SharedItemContextHierarchy, out activeProjectContext))
        {
            return activeProjectContext;
        }
        else
        {
            return null;
        }
    }
    
  11. yönteminde ShowMessageBox etkin platform projesinin başlık çıktısını oluşturun.

    private void ShowMessageBox(object sender, EventArgs e)
    {
        var dte = (DTE)this.ServiceProvider.GetService(typeof(DTE));
    
        if (dte.Solution != null)
        {
            var sharedHier = this.FindSharedProject();
            if (sharedHier != null)
            {
                string sharedCaption = HierarchyUtilities.GetHierarchyProperty<string>(sharedHier, (uint)VSConstants.VSITEMID.Root,
                     (int)__VSHPROPID.VSHPROPID_Caption);
                output.OutputStringThreadSafe(string.Format("Shared project: {0}\n", sharedCaption));
    
                var activePlatformHier = this.GetActiveProjectContext(sharedHier);
                if (activePlatformHier != null)
                {
                    string activeCaption = HierarchyUtilities.GetHierarchyProperty<string>(activePlatformHier,
                         (uint)VSConstants.VSITEMID.Root, (int)__VSHPROPID.VSHPROPID_Caption);
                    output.OutputStringThreadSafe(string.Format("Active platform project: {0}\n", activeCaption));
                }
                else
                {
                    MessageBox.Show("Shared project has no active platform project");
                }
            }
            else
            {
                MessageBox.Show("Solution has no shared project");
            }
        }
        else
        {
            MessageBox.Show("No solution is open");
        }
    }
    
  12. Platform projeleri aracılığıyla yineleme yapın. Aşağıdaki yöntem, paylaşılan projeden tüm içeri aktarma (platform) projelerini alır.

    private IEnumerable<IVsHierarchy> EnumImportingProjects(IVsHierarchy hierarchy)
    {
        IVsSharedAssetsProject sharedAssetsProject;
        if (HierarchyUtilities.TryGetHierarchyProperty(hierarchy, (uint)VSConstants.VSITEMID.Root,
            (int)__VSHPROPID7.VSHPROPID_SharedAssetsProject, out sharedAssetsProject)
            && sharedAssetsProject != null)
        {
            foreach (IVsHierarchy importingProject in sharedAssetsProject.EnumImportingProjects())
            {
                yield return importingProject;
            }
        }
    }
    

    Önemli

    Kullanıcı deneysel örnekte bir C++ evrensel Windows uygulaması projesi açtıysa yukarıdaki kod bir özel durum oluşturur. Bu bilinen bir sorundur. Özel durumdan kaçınmak için yukarıdaki bloğu aşağıdakilerle değiştirin foreach :

    var importingProjects = sharedAssetsProject.EnumImportingProjects();
    for (int i = 0; i < importingProjects.Count; ++i)
    {
        yield return importingProjects[i];
    }
    
  13. yöntemindeShowMessageBox, her platform projesinin başlık çıktısını oluşturun. Etkin platform projesinin başlık çıkışını veren satırın arkasına aşağıdaki kodu ekleyin. Bu listede yalnızca yüklenen platform projeleri görüntülenir.

    output.OutputStringThreadSafe("Platform projects:\n");
    
    IEnumerable<IVsHierarchy> projects = this.EnumImportingProjects(sharedHier);
    
    bool isActiveProjectSet = false;
    foreach (IVsHierarchy platformHier in projects)
    {
        string platformCaption = HierarchyUtilities.GetHierarchyProperty<string>(platformHier, (uint)VSConstants.VSITEMID.Root,
            (int)__VSHPROPID.VSHPROPID_Caption);
        output.OutputStringThreadSafe(string.Format(" * {0}\n", platformCaption));
    }
    
  14. Etkin platform projesini değiştirin. Aşağıdaki yöntem etkin projeyi kullanarak SetPropertyayarlar.

    private int SetActiveProjectContext(IVsHierarchy hierarchy, IVsHierarchy activeProjectContext)
    {
        return hierarchy.SetProperty((uint)VSConstants.VSITEMID.Root, (int)__VSHPROPID7.VSHPROPID_SharedItemContextHierarchy, activeProjectContext);
    }
    
  15. yönteminde ShowMessageBox etkin platform projesini değiştirin. Bu kodu bloğun foreach içine ekleyin.

    bool isActiveProjectSet = false;
    string platformCaption = null;
    foreach (IVsHierarchy platformHier in projects)
    {
        platformCaption = HierarchyUtilities.GetHierarchyProperty<string>(platformHier, (uint)VSConstants.VSITEMID.Root,
             (int)__VSHPROPID.VSHPROPID_Caption);
        output.OutputStringThreadSafe(string.Format(" * {0}\n", platformCaption));
    
        // if this project is neither the shared project nor the current active platform project,
        // set it to be the active project
        if (!isActiveProjectSet && platformHier != activePlatformHier)
        {
            this.SetActiveProjectContext(sharedHier, platformHier);
            activePlatformHier = platformHier;
            isActiveProjectSet = true;
        }
    }
    output.OutputStringThreadSafe("set active project: " + platformCaption +'\n');
    
  16. Şimdi deneyin. Deneysel örneği başlatmak için F5 tuşuna basın. Deneysel örnekte bir C# evrensel hub uygulaması projesi oluşturun (Yeni Proje iletişim kutusunda Visual C#>Windows Windows>8>Universal>Hub Uygulaması). Çözüm yüklendikten sonra Araçlar menüsüne gidin ve TestUniversalProject Çağır'a tıklayın ve çıkış bölmesinde metni denetleyin. Aşağıdakine benzer bir şey görmeniz gerekir:

    Found shared project: HubApp.Shared
    The active platform project: HubApp.Windows
    Platform projects:
     * HubApp.Windows
     * HubApp.WindowsPhone
    set active project: HubApp.WindowsPhone
    

Platform projesindeki paylaşılan öğeleri yönetme

  1. Platform projesinde paylaşılan öğeleri bulun. Paylaşılan projedeki öğeler platform projesinde paylaşılan öğeler olarak görünür. Bunları Çözüm Gezgini göremezsiniz, ancak bulmak için proje hiyerarşisinde gezinebilirsiniz. Aşağıdaki yöntem hiyerarşiyi gösterir ve tüm paylaşılan öğeleri toplar. İsteğe bağlı olarak her öğenin başlık çıkışını alır. Paylaşılan öğeler yeni özelliğiyle VSHPROPID_IsSharedItemtanımlanır.

    private void InspectHierarchyItems(IVsHierarchy hier, uint itemid, int level, List<uint> itemIds, bool getSharedItems, bool printItems)
    {
        string caption = HierarchyUtilities.GetHierarchyProperty<string>(hier, itemid, (int)__VSHPROPID.VSHPROPID_Caption);
        if (printItems)
            output.OutputStringThreadSafe(string.Format("{0}{1}\n", new string('\t', level), caption));
    
        // if getSharedItems is true, inspect only shared items; if it's false, inspect only unshared items
        bool isSharedItem;
        if (HierarchyUtilities.TryGetHierarchyProperty(hier, itemid, (int)__VSHPROPID7.VSHPROPID_IsSharedItem, out isSharedItem)
            && (isSharedItem == getSharedItems))
        {
            itemIds.Add(itemid);
        }
    
        uint child;
        if (HierarchyUtilities.TryGetHierarchyProperty(hier, itemid, (int)__VSHPROPID.VSHPROPID_FirstChild, Unbox.AsUInt32, out child)
            && child != (uint)VSConstants.VSITEMID.Nil)
        {
            this.InspectHierarchyItems(hier, child, level + 1, itemIds, isSharedItem, printItems);
    
            while (HierarchyUtilities.TryGetHierarchyProperty(hier, child, (int)__VSHPROPID.VSHPROPID_NextSibling, Unbox.AsUInt32, out child)
                && child != (uint)VSConstants.VSITEMID.Nil)
            {
                this.InspectHierarchyItems(hier, child, level + 1, itemIds, isSharedItem, printItems);
            }
        }
    }
    
  2. yönteminde ShowMessageBox aşağıdaki kodu ekleyerek platform projesi hiyerarşi öğelerine eşlik edin. Bloğun foreach içine ekleyin.

    output.OutputStringThreadSafe("Walk the active platform project:\n");
    var sharedItemIds = new List<uint>();
    this.InspectHierarchyItems(activePlatformHier, (uint)VSConstants.VSITEMID.Root, 1, sharedItemIds, true, true);
    
  3. Paylaşılan öğeleri okuyun. Paylaşılan öğeler platform projesinde gizli bağlantılı dosyalar olarak görünür ve tüm özellikleri sıradan bağlı dosyalar olarak okuyabilirsiniz. Aşağıdaki kod, ilk paylaşılan öğenin tam yolunu okur.

    var sharedItemId = sharedItemIds[0];
    string fullPath;
    ErrorHandler.ThrowOnFailure(((IVsProject)activePlatformHier).GetMkDocument(sharedItemId, out fullPath));
    output.OutputStringThreadSafe(string.Format("Shared item full path: {0}\n", fullPath));
    
  4. Şimdi deneyin. Deneysel örneği başlatmak için F5 tuşuna basın. Deneysel örnekte bir C# evrensel hub uygulaması projesi oluşturun (Yeni Proje iletişim kutusunda, Visual C#>Windows Windows>8>Evrensel>Merkez Uygulaması) Araçlar menüsüne gidin ve TestUniversalProject'i Çağır'a tıklayın ve çıkış bölmesinde metni işaretleyin. Aşağıdakine benzer bir şey görmeniz gerekir:

    Found shared project: HubApp.Shared
    The active platform project: HubApp.Windows
    Platform projects:
     * HubApp.Windows
     * HubApp.WindowsPhone
    set active project: HubApp.WindowsPhone
    Walk the active platform project:
        HubApp.WindowsPhone
            <HubApp.Shared>
                App.xaml
                    App.xaml.cs
                Assets
                    DarkGray.png
                    LightGray.png
                    MediumGray.png
                Common
                    NavigationHelper.cs
                    ObservableDictionary.cs
                    RelayCommand.cs
                    SuspensionManager.cs
                DataModel
                    SampleData.json
                    SampleDataSource.cs
                HubApp.Shared.projitems
                Strings
                    en-US
                        Resources.resw
            Assets
                HubBackground.theme-dark.png
                HubBackground.theme-light.png
                Logo.scale-240.png
                SmallLogo.scale-240.png
                SplashScreen.scale-240.png
                Square71x71Logo.scale-240.png
                StoreLogo.scale-240.png
                WideLogo.scale-240.png
            HubPage.xaml
                HubPage.xaml.cs
            ItemPage.xaml
                ItemPage.xaml.cs
            Package.appxmanifest
            Properties
                AssemblyInfo.cs
            References
                .NET for Windows Store apps
                HubApp.Shared
                Windows Phone 8.1
            SectionPage.xaml
                SectionPage.xaml.cs
    

Platform projelerindeki ve paylaşılan projelerdeki değişiklikleri algılama

  1. Paylaşılan projelerdeki değişiklikleri algılamak için hiyerarşi ve proje olaylarını platform projelerinde olduğu gibi kullanabilirsiniz. Ancak, paylaşılan projedeki proje öğeleri görünmez, yani paylaşılan proje öğeleri değiştirildiğinde bazı olaylar tetiklenmez.

    Projedeki bir dosya yeniden adlandırıldığında olayların sırasını göz önünde bulundurun:

    1. Dosya adı diskte değiştirilir.

    2. Proje dosyası, dosyanın yeni adını içerecek şekilde güncelleştirilir.

      Hiyerarşi olayları (örneğin, IVsHierarchyEvents) genellikle Çözüm Gezgini olduğu gibi kullanıcı arabiriminde görüntülenen değişiklikleri izler. Hiyerarşi olayları, bir dosya silme ve ardından bir dosya ekleme işleminden oluşacak bir dosya yeniden adlandırma işlemini dikkate alır. Ancak, görünmez öğeler değiştirildiğinde hiyerarşi olay sistemi bir OnItemDeleted olayı tetikler, ancak bir OnItemAdded olayı tetikler. Bu nedenle, platform projesindeki bir dosyayı yeniden adlandırırsanız, hem hem de OnItemDeletedOnItemAddedalırsınız, ancak paylaşılan bir projedeki bir dosyayı yeniden adlandırırsanız, yalnızca OnItemDeletedalırsınız.

      Proje öğelerindeki değişiklikleri izlemek için, DTE proje öğesi olaylarını (içinde ProjectItemsEventsClassbulunanlar) işleyebilirsiniz. Ancak, çok sayıda olayı işiyorsanız, içindeki IVsTrackProjectDocuments2olayları işleme konusunda daha iyi bir performans elde edebilirsiniz. Bu kılavuzda yalnızca hiyerarşi olaylarını ve DTE olaylarını göstereceğiz. Bu yordamda, paylaşılan bir projeye ve platform projesine olay dinleyicisi eklersiniz. Ardından, paylaşılan projedeki bir dosyayı ve platform projesindeki başka bir dosyayı yeniden adlandırdığınızda, her yeniden adlandırma işlemi için tetiklenen olayları görebilirsiniz.

      Bu yordamda, paylaşılan bir projeye ve platform projesine olay dinleyicisi eklersiniz. Ardından, paylaşılan projedeki bir dosyayı ve platform projesindeki başka bir dosyayı yeniden adlandırdığınızda, her yeniden adlandırma işlemi için tetiklenen olayları görebilirsiniz.

  2. Olay dinleyicisi ekleyin. Projeye yeni bir sınıf dosyası ekleyin ve HierarchyEventListener.cs olarak adlandırın.

  3. HierarchyEventListener.cs dosyasını açın ve yönergeleri kullanarak aşağıdakileri ekleyin:

    using Microsoft.VisualStudio.Shell.Interop;
    using Microsoft.VisualStudio;
    using System.IO;
    
  4. sınıfının uygulamasını HierarchyEventListenerIVsHierarchyEventssağlama:

    class HierarchyEventListener : IVsHierarchyEvents
    { }
    
  5. aşağıdaki kodda olduğu gibi öğesinin üyelerini IVsHierarchyEventsuygulayın.

    class HierarchyEventListener : IVsHierarchyEvents
    {
        private IVsHierarchy hierarchy;
        IVsOutputWindowPane output;
    
        internal HierarchyEventListener(IVsHierarchy hierarchy, IVsOutputWindowPane outputWindow) {
             this.hierarchy = hierarchy;
             this.output = outputWindow;
        }
    
        int IVsHierarchyEvents.OnInvalidateIcon(IntPtr hIcon) {
            return VSConstants.S_OK;
        }
    
        int IVsHierarchyEvents.OnInvalidateItems(uint itemIDParent) {
            return VSConstants.S_OK;
        }
    
        int IVsHierarchyEvents.OnItemAdded(uint itemIDParent, uint itemIDSiblingPrev, uint itemIDAdded) {
            output.OutputStringThreadSafe("IVsHierarchyEvents.OnItemAdded: " + itemIDAdded + "\n");
            return VSConstants.S_OK;
        }
    
        int IVsHierarchyEvents.OnItemDeleted(uint itemID) {
            output.OutputStringThreadSafe("IVsHierarchyEvents.OnItemDeleted: " + itemID + "\n");
            return VSConstants.S_OK;
        }
    
        int IVsHierarchyEvents.OnItemsAppended(uint itemIDParent) {
            output.OutputStringThreadSafe("IVsHierarchyEvents.OnItemsAppended\n");
            return VSConstants.S_OK;
        }
    
        int IVsHierarchyEvents.OnPropertyChanged(uint itemID, int propID, uint flags) {
            output.OutputStringThreadSafe("IVsHierarchyEvents.OnPropertyChanged: item ID " + itemID + "\n");
            return VSConstants.S_OK;
        }
    }
    
  6. Aynı sınıfta, bir proje öğesi yeniden adlandırıldığında gerçekleşen DTE olayı için başka bir olay ItemRenamedişleyicisi ekleyin.

    public void OnItemRenamed(EnvDTE.ProjectItem projItem, string oldName)
    {
        output.OutputStringThreadSafe(string.Format("[Event] Renamed {0} to {1} in project {2}\n",
             oldName, Path.GetFileName(projItem.get_FileNames(1)), projItem.ContainingProject.Name));
    }
    
  7. Hiyerarşi olayları için kaydolun. İzlemekte olduğunuz her proje için ayrı olarak kaydolmanız gerekir. Aşağıdaki kodu ShowMessageBoxiçine, biri paylaşılan proje için, diğeri de platform projelerinden biri için ekleyin.

    // hook up the event listener for hierarchy events on the shared project
    HierarchyEventListener listener1 = new HierarchyEventListener(sharedHier, output);
    uint cookie1;
    sharedHier.AdviseHierarchyEvents(listener1, out cookie1);
    
    // hook up the event listener for hierarchy events on the
    active project
    HierarchyEventListener listener2 = new HierarchyEventListener(activePlatformHier, output);
    uint cookie2;
    activePlatformHier.AdviseHierarchyEvents(listener2, out cookie2);
    
  8. DTE proje öğesi olayına ItemRenamedkaydolun. İkinci dinleyiciyi bağladıktan sonra aşağıdaki kodu ekleyin.

    // hook up DTE events for project items
    Events2 dteEvents = (Events2)dte.Events;
    dteEvents.ProjectItemsEvents.ItemRenamed += listener1.OnItemRenamed;
    
  9. Paylaşılan öğeyi değiştirin. Platform projesinde paylaşılan öğeleri değiştiremezsiniz; bunun yerine, bu öğelerin gerçek sahibi olan paylaşılan projede bunları değiştirmeniz gerekir. ile IsDocumentInProjectpaylaşılan projede ilgili öğe kimliğini alarak paylaşılan öğenin tam yolunu vererek alabilirsiniz. Ardından paylaşılan öğeyi değiştirebilirsiniz. Değişiklik platform projelerine yayılır.

    Önemli

    Değiştirmeden önce bir proje öğesinin paylaşılan öğe olup olmadığını öğrenmelisiniz.

    Aşağıdaki yöntem, proje öğesi dosyasının adını değiştirir.

    private void ModifyFileNameInProject(IVsHierarchy project, string path)
    {
        int found;
        uint projectItemID;
        VSDOCUMENTPRIORITY[] priority = new VSDOCUMENTPRIORITY[1];
        if (ErrorHandler.Succeeded(((IVsProject)project).IsDocumentInProject(path, out found, priority, out projectItemID))
            && found != 0)
        {
            var name = DateTime.Now.Ticks.ToString() + Path.GetExtension(path);
            project.SetProperty(projectItemID, (int)__VSHPROPID.VSHPROPID_EditLabel, name);
            output.OutputStringThreadSafe(string.Format("Renamed {0} to {1}\n", path,name));
        }
    }
    
  10. Paylaşılan projedeki öğenin dosya adını değiştirmek için içindeki ShowMessageBox diğer tüm koddan sonra bu yöntemi çağırın. Paylaşılan projedeki öğenin tam yolunu alan kodun arkasına bunu ekleyin.

    // change the file name of an item in a shared project
    this.InspectHierarchyItems(activePlatformHier, (uint)VSConstants.VSITEMID.Root, 1, sharedItemIds, true, true);
    ErrorHandler.ThrowOnFailure(((IVsProject)activePlatformHier).GetMkDocument(sharedItemId, out fullPath));
    output.OutputStringThreadSafe(string.Format("Shared project item ID = {0}, full path = {1}\n", sharedItemId, fullPath));
    this.ModifyFileNameInProject(sharedHier, fullPath);
    
  11. Projeyi derleyin ve çalıştırın. Deneysel örnekte bir C# evrensel hub uygulaması oluşturun, Araçlar menüsüne gidin ve TestUniversalProjeyi Çağır'a tıklayın ve genel çıkış bölmesindeki metni denetleyin. Paylaşılan projedeki ilk öğenin adı (App.xaml dosyası olmasını bekliyoruz) değiştirilmelidir ve olayın tetiklendiğini ItemRenamed görmeniz gerekir. Bu durumda, App.xaml'in yeniden adlandırılması App.xaml.cs dosyasının da yeniden adlandırılmasına neden olduğundan dört olay (her platform projesi için iki olay) görmeniz gerekir. (DTE olayları paylaşılan projedeki öğeleri izlemez.) İki OnItemDeleted olay (platform projelerinin her biri için bir olay) görmeniz gerekir, ancak hiçbir olay görmezsiniz OnItemAdded .

  12. Şimdi bir platform projesindeki bir dosyayı yeniden adlandırmayı deneyin ve tetiklenen olaylardaki farkı görebilirsiniz. çağrısından ModifyFileNamesonra içine ShowMessageBox aşağıdaki kodu ekleyin.

    // change the file name of an item in a platform project
    var unsharedItemIds = new List<uint>();
    this.InspectHierarchyItems(activePlatformHier, (uint)VSConstants.VSITEMID.Root, 1, unsharedItemIds, false, false);
    
    var unsharedItemId = unsharedItemIds[0];
    string unsharedPath;
    ErrorHandler.ThrowOnFailure(((IVsProject)activePlatformHier).GetMkDocument(unsharedItemId, out unsharedPath));
    output.OutputStringThreadSafe(string.Format("Platform project item ID = {0}, full path = {1}\n", unsharedItemId, unsharedPath));
    
    this.ModifyFileNameInProject(activePlatformHier, unsharedPath);
    
  13. Projeyi derleyin ve çalıştırın. Deneysel örnekte bir C# Evrensel Projesi oluşturun, Araçlar menüsüne gidin ve TestUniversalProjeyi Çağır'a tıklayın ve genel çıkış bölmesindeki metni denetleyin. Platform projesindeki dosya yeniden adlandırıldıktan sonra hem bir olay hem de bir OnItemAddedOnItemDeleted olay görmeniz gerekir. Dosyanın değiştirilmesi başka hiçbir dosyanın değiştirilmesine neden olmadığından ve platform projesindeki öğelerde yapılan değişiklikler herhangi bir yere yayılmadığından, bu olayların yalnızca biri vardır.