Sdílet prostřednictvím


Názorný postup: Vytváření rozšíření projektu SharePoint

Tento návod ukazuje, jak vytvořit rozšíření pro projekty SharePoint.Reagovat na události na úrovni projektu například při přidány, odstraněny nebo přejmenovány projektu lze použít rozšíření projektu.Můžete také přidat vlastní vlastnosti nebo reagovat na změny hodnot vlastností.Na rozdíl od rozšíření položek projektu nemohou být rozšíření projektu sdruženy s konkrétním typem projektu služby SharePoint.Když vytvoříte rozšíření projektu, rozšíření se otevře, kdzž je otevřen jakýkoli typ projekt služby SharePoint v Visual Studio.

V tomto návodu vytvoříte vlastní booleovskou vlastnost, která je přidána do jakéhokoli projektu SharePoint vytvořeného v Visual Studio.Při nastavení na True nová vlastnost přidá nebo mapuje složku prostředků obrázků do vašeho projektu.Pokud je nastavena na False, je odebrána složka Obrázky, pokud existuje.Další informace naleznete v tématu Jak: přidání a odebrání složky mapované.

Tento návod demonstruje následující úkoly:

  • Vytvoření Visual Studio rozšíření pro SharePoint projekty, které provede následující:

    • Přidává vlastní vlastnost projektu do okna Vlastností.Vlastnost se vztahuje na jakýkoli projekt SharePoint.

    • Používá objektový model projektu SharePoint pro přidání mapované složky do projektu.

    • Používá Visual Studio model objektu automatizace (DTE) pro odstranění mapované složky z projektu.

  • Vytváří rozšíření balíčku (VSIX) Visual Studio k nasazení sestavení vlastnosti přípony projektu.

  • Ladění a testování vlastnosti projektu.

Požadavky

Ve vývojovém počítači potřebujete následující součásti pro dokončení tohoto návodu:

Vytváření projektů

Chcete-li dokončit tento návod, je nutné vytvořit dva projekty:

  • Projekt VSIX k vytvoření balíčku VSIX pro nasazení rozšíření projektu.

  • Projekt knihovny tříd, který implementuje rozšíření projektu.

Začněte postup vytvořením projektů.

Pro vytvoření projektu VSIX

  1. Spusťte nástroj Visual Studio.

  2. Na panelu nabídek zvolte soubor, Nový, projektu.

  3. V Nový projekt dialogové okno pole, rozbalte položku Visual C# nebo jazyka Visual Basic uzly a pak zvolte rozšíření uzlu.

    [!POZNÁMKA]

    Tento uzel je k dispozici pouze v případě, že nainstalujete Visual Studio SDK.Další informace naleznete v části požadavky dříve v tomto tématu.

  4. V horní části dialogového okna zvolte .NET Framework 4.5 v seznamu verze rozhraní.NET Framework a pak zvolte Projektu VSIX šablony.

  5. V název zadejte ProjectExtensionPackagea pak zvolte OK tlačítko.

    ProjectExtensionPackage projekt se objeví v Průzkumníku.

Chcete-li vytvořit projekt rozšíření

  1. V Průzkumníku, otevřete místní nabídku pro uzel řešení, zvolte Přidata pak zvolte Nový projekt.

    [!POZNÁMKA]

    V Visual Basic projekty, uzel řešení zobrazí v Průzkumníku pouze vždy zobrazit řešení políčko v General, Projects and Solutions, Options Dialog Box.

  2. V Nový projekt dialogovém okně rozbalte Visual C# nebo Visual Basic uzly a pak zvolte Windows.

  3. V horní části dialogového okna zvolte .NET Framework 4.5 v seznamu verze rozhraní.NET Framework a pak zvolte Knihovny tříd šablony projektu.

  4. V název zadejte ProjectExtensiona pak zvolte OK tlačítko.

    Visual Studio přidá projekt ProjectExtension do řešení a otevře soubor výchozího kódu Class1.

  5. Odstraňte soubor kódu Class1 z projektu.

Konfigurace projektu

Před napsáním kódu pro vytvoření rozšíření projektu přidejte soubory kódu a odkazy na projekt sestavení.

Chcete-li konfigurovat projekt

  1. Přidání souboru kódu s názvem CustomProperty do projektu ProjectExtension.

  2. Otevření místní nabídky ProjectExtension projektu a pak zvolte Přidat odkaz.

  3. V Reference Manager-CustomProperty dialogovém okně zvolte Framework uzel a potom zaškrtněte políčko System.ComponentModel.Composition a System.Windows.Forms sestavení.

  4. Zvolte rozšíření uzel, zaškrtněte políčko vedle sestavení Microsoft.VisualStudio.SharePoint a EnvDTE a pak zvolte OK tlačítko.

  5. V Průzkumníkupod odkazy složku ProjectExtension projektu, zvolte EnvDTE.

  6. V Vlastnosti okna, změna Embed Interop Types vlastnost False.

Definování nová vlastnosti projektu služby SharePoint

Vytvořte třídu definující chování rozšíření a chování vlastnosti nového projektu.Chcete-li definovat nové rozšíření projektu, třída implementuje rozhraní ISharePointProjectExtension.Implementujte toto rozhraní pokaždé, když chcete definovat rozšíření pro projekt SharePoint.Také přidejte ExportAttribute do třídy.Tento atribut umožňuje Visual Studio zjišťovat a načíst vaše implementace ISharePointProjectExtension.Předejte typ ISharePointProjectExtension do konstruktoru atributu.

Chcete-li definovat novou vlastnost projektu služby SharePoint

  • Vložte následující kód do souboru CustomProperty.

    Imports System
    Imports System.Linq
    Imports System.ComponentModel
    Imports System.ComponentModel.Composition
    Imports System.Windows.Forms
    Imports Microsoft.VisualStudio.SharePoint
    Imports EnvDTE
    
    Namespace Contoso.SharePointProjectExtensions.MapImagesFolder
    
        ' Export attribute: Enables Visual Studio to discover and load this extension.
        ' MapImagesFolderProjectExtension class: Adds a new Map Images Folder property to any SharePoint project.
        <Export(GetType(ISharePointProjectExtension))> _
        Public Class MapImagesFolderProjectExtension
            Implements ISharePointProjectExtension
    
            Public Sub Initialize(ByVal projectService As ISharePointProjectService) Implements ISharePointProjectExtension.Initialize
                AddHandler projectService.ProjectPropertiesRequested, AddressOf Me.projectService_ProjectPropertiesRequested
            End Sub
    
            Private Sub projectService_ProjectPropertiesRequested(ByVal sender As Object, ByVal e As SharePointProjectPropertiesRequestedEventArgs)
                Dim propertiesObject As CustomProjectProperties = Nothing
    
                ' If the properties object already exists, get it from the project's annotations.
                If False = e.Project.Annotations.TryGetValue(propertiesObject) Then
                    ' Otherwise, create a new properties object and add it to the annotations.
                    propertiesObject = New CustomProjectProperties(e.Project)
                    e.Project.Annotations.Add(propertiesObject)
                End If
    
                e.PropertySources.Add(propertiesObject)
            End Sub
        End Class
    
        Public Class CustomProjectProperties
            Private sharePointProject As ISharePointProject = Nothing
            Private Const MapImagesFolderPropertyDefaultValue As Boolean = False
            Private Const MapImagesFolderPropertyId = "ContosoMapImagesFolderProperty"
    
            Public Sub New(ByVal myProject As ISharePointProject)
                sharePointProject = myProject
            End Sub
    
            ' Represents the new boolean property MapImagesFolder.
            ' True = Map an Images folder to the project if one does not already exist; otherwise, do nothing.
            ' False = Remove the Images folder from the project, if one exists; otherwise, do nothing.
            <DisplayName("Map Images Folder")> _
            <DescriptionAttribute("Specifies whether an Images folder is mapped to the SharePoint project.")> _
            <DefaultValue(MapImagesFolderPropertyDefaultValue)> _
            Public Property MapImagesFolder As Boolean
                Get
                    Dim propertyStringValue As String = String.Empty
    
                    ' Try to get the current value from the .user file; if it does not yet exist, return a default value.
                    If Not sharePointProject.ProjectUserFileData.TryGetValue(MapImagesFolderPropertyId, propertyStringValue) Then
                        Return MapImagesFolderPropertyDefaultValue
                    Else
                        Return CBool(propertyStringValue)
                    End If
                End Get
    
                Set(ByVal value As Boolean)
                    If value Then
                        If Not ImagesMappedFolderInProjectExists(sharePointProject) Then
                            ' An Images folder is not mapped to the project, so map one.
                            Dim mappedFolder As IMappedFolder = sharePointProject.MappedFolders.Add(MappedFolderType.Images)
                            sharePointProject.ProjectService.Logger.WriteLine( _
                                mappedFolder.Name & " mapped folder added to the project.", LogCategory.Status)
                        End If
                    ElseIf (ImagesMappedFolderInProjectExists(sharePointProject) AndAlso UserSaysDeleteFile()) Then
                        ' An Images folder is mapped to the project and the user wants to remove it.
                        DeleteFolder()
                    End If
    
                    sharePointProject.ProjectUserFileData(MapImagesFolderPropertyId) = value.ToString()
                End Set
            End Property
    
            Private Function ImagesMappedFolderInProjectExists(ByVal sharePointProject As ISharePointProject) As Boolean
                Dim returnValue As Boolean = False
                For Each folder As IMappedFolder In sharePointProject.MappedFolders
                    ' Check to see if an Images folder is already mapped.
                    If (folder.FolderType = MappedFolderType.Images) Then
                        returnValue = True
                    End If
                Next
                Return returnValue
            End Function
    
            Private Function UserSaysDeleteFile() As Boolean
                ' Ask the user whether they want to delete the Images folder.
                Dim returnValue As Boolean = False
                If (MessageBox.Show("Do you want to delete the Images folder from the project?", _
                    "Delete the Images folder?", MessageBoxButtons.YesNo) = DialogResult.Yes) Then
                    returnValue = True
                End If
                Return returnValue
            End Function
    
            Private Sub DeleteFolder()
                ' The Visual Studio DTE object model is required to delete the mapped folder.
                Dim dteProject As EnvDTE.Project = _
                    sharePointProject.ProjectService.Convert(Of ISharePointProject, EnvDTE.Project)(sharePointProject)
                Dim targetFolderName As String = _
                    sharePointProject.MappedFolders.First(Function(mf) mf.FolderType = MappedFolderType.Images).Name
                Dim mappedFolderItem As EnvDTE.ProjectItem = dteProject.ProjectItems.Item(targetFolderName)
                mappedFolderItem.Delete()
    
                sharePointProject.ProjectService.Logger.WriteLine("Mapped Folder " & _
                    targetFolderName & " deleted", LogCategory.Status)
            End Sub
        End Class
    End Namespace
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ComponentModel;
    using System.ComponentModel.Composition;
    using System.Windows.Forms;
    using Microsoft.VisualStudio.SharePoint;
    using EnvDTE;
    
    // Adds a new property called MapImagesFolder to any SharePoint project.
    // When MapImagesFolder is set to true, the Image folder is mapped to the project.
    // When MapImagesFolder is set to false, the Image folder is deleted from the project.
    namespace SP_Project_Extension
    {
        // Export attribute: Enables Visual Studio to discover and load this extension.
        [Export(typeof(ISharePointProjectExtension))]
    
        // Defines a new custom project property that applies to any SharePoint project.
        public class SPProjectExtension : ISharePointProjectExtension
        {
            // Implements ISharePointProjectService.Initialize, which determines the behavior of the new property.
            public void Initialize(ISharePointProjectService projectService)
            {
                // Handle events for when a project property is changed.
                projectService.ProjectPropertiesRequested +=
                    new EventHandler<SharePointProjectPropertiesRequestedEventArgs>(projectService_ProjectPropertiesRequested);
            }
    
            void projectService_ProjectPropertiesRequested(object sender, SharePointProjectPropertiesRequestedEventArgs e)
            {
                // Add a new property to the SharePoint project.
                e.PropertySources.Add((object)new ImagesMappedFolderProperty(e.Project));
            }
        }
    
        public class ImagesMappedFolderProperty
        {
            ISharePointProject sharePointProject = null;
            public ImagesMappedFolderProperty(ISharePointProject myProject)
            {
                sharePointProject = myProject;
            }
            static bool MapFolderSetting = false;
    
            [DisplayName("Map Images Folder")]
            [DescriptionAttribute("Specifies whether an Images folder is mapped to the SharePoint project.")]
            public bool MapImagesFolder
            // Represents the new boolean property MapImagesFolder.
            // True = Map an Images folder to the project if one does not already exist; otherwise, do nothing.
            // False = Remove the Images folder from the project, if one exists; otherwise, do nothing.
            {
                get
                {
                    // Get the current property value.
                    return MapFolderSetting;
                }
                set
                {
                    if (value)
                    {
                        if (!ImagesMappedFolderInProjectExists(sharePointProject))
                        {
                            // An Images folder is not mapped to the project, so map one.
                            IMappedFolder mappedFolder1 = sharePointProject.MappedFolders.Add(MappedFolderType.Images);
                            // Add a note to the logger that a mapped folder was added.
                            sharePointProject.ProjectService.Logger.WriteLine("Mapped Folder added:" + mappedFolder1.Name, LogCategory.Status);
                        }
                    }
                    else
                    {
                        if (ImagesMappedFolderInProjectExists(sharePointProject) && UserSaysDeleteFile())
                        {
                            // An Images folder is mapped to the project and the user wants to remove it.
                            // The Visual Studio DTE object model is required to delete the mapped folder.
                            // Reference the Visual Studio DTE model, get handles for the SharePoint project and project items.
                            EnvDTE.Project dteProject = sharePointProject.ProjectService.Convert<ISharePointProject, EnvDTE.Project>(sharePointProject);
                            string targetFolderName = sharePointProject.MappedFolders.First(mf => mf.FolderType == MappedFolderType.Images).Name;
                            EnvDTE.ProjectItem mappedFolderItem = dteProject.ProjectItems.Item(targetFolderName);
                            mappedFolderItem.Delete();
                            sharePointProject.ProjectService.Logger.WriteLine("Mapped Folder " + targetFolderName + " deleted", LogCategory.Status);
                        }
                    }
                    MapFolderSetting = value;
                }
    
            }
    
            private bool ImagesMappedFolderInProjectExists(ISharePointProject sharePointProject)
            {
                bool retVal = false;
                foreach (IMappedFolder folder in sharePointProject.MappedFolders)
                {
                    // Check to see if an Images folder is already mapped.
                    if (folder.FolderType == MappedFolderType.Images)
                        retVal = true;
                }
                return retVal;
            }
    
            private bool UserSaysDeleteFile()
            {
                // Prompt the user whether they want to delete the Images folder.
                bool retVal = false;
                if (MessageBox.Show("Do you want to delete the Images folder from the project?", "Delete the Images folder?", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    retVal = true;
                }
                return retVal;
    
            }
        }
    }
    

Vytváření řešení

Dále, sestavte řešení, abyste se ujistili, že se zkompiluje bez chyb.

Sestavte řešení

  • Na panelu nabídek zvolte sestavení, Sestavit řešení.

Vytvoření balíčku VSIX k nasazení rozšíření vlastnosti projektu

Chcete-li nasadit rozšíření projektu, použijte VSIX projekt ve vašem řešení k vytvoření VSIX balíčku.Nejprve nakonfigurujte VSIX balíček úpravou souboru source.extension.vsixmanifest, který je součástí projektu VSIX.Potom vytvořte VSIX balíček vytvořením řešení.

Chcete-li konfigurovat a vytvořit balíček VSIX

  1. V Průzkumníku, otevřete místní nabídku pro soubor source.extension.vsixmanifest a pak zvolte otevřete tlačítko.

    Visual StudioOtevře soubor v Návrháři manifestu.Informace se Metadata kartě se zobrazí také v aktualizace a rozšíření. Všechny balíčky VSIX vyžadují soubor extension.vsixmanifest.Další informace o tomto souboru získáte v tématu VSIX rozšíření schématu Reference.

  2. V Název produktu zadejte Vlastní vlastnost projektu.

  3. V Autor zadejte Contoso.

  4. V Popis zadejte Vlastní vlastnost projektu SharePoint, která přepíná mapování složky prostředků obrázků do projektu.

  5. Zvolte majetku kartu a pak zvolte Nový tlačítko.

    Přidat nový majetek zobrazí se dialogové okno.

  6. V typu seznam, zvolte Microsoft.VisualStudio.MefComponent.

    [!POZNÁMKA]

    Tato hodnota odpovídá prvku MEFComponent v souboru extension.vsixmanifest file.Tento prvek určuje název sestavení rozšíření v balíčku VSIX.Další informace naleznete v tématu MEFComponent Element.

  7. V zdroje seznam, zvolte projektu v aktuálním řešení přepínač.

  8. V projektu seznam, zvolte ProjectExtension.

    Tato hodnota určuje název sestavení, které vytváříte v projektu.

  9. Zvolte OK zavřete Přidat nový majetek dialogové okno.

  10. Na panelu nabídek zvolte soubor, Uložit všechny při dokončení a potom zavřete editor manifestu.

  11. Na panelu nabídek zvolte sestavení, Sestavit řešenía ujistěte se, že projekt zkompiluje bez chyb.

  12. V Průzkumníku, otevřete místní nabídku ProjectExtensionPackage projektu a zvolte Otevřít složku v Průzkumníku souborů tlačítko.

  13. V File Explorer, otevřete složku výstupu sestavení pro projekt ProjectExtensionPackage a ověřit, zda složka obsahuje soubor s názvem ProjectExtensionPackage.vsix.

    Ve výchozím nastavení je výstupní složka sestavení\bin\Debug složka pod složkou, která obsahuje soubor projektu.

Testování vlastnosti projektu

Nyní jste připraveni otestovat vlastní vlastnosti projektu.Je to nejsnadnější pro ladění a testování nového rozšíření vlastnosti projektu v experimentální instanci Visual Studio.Tato instance Visual Studio je vytvořena při spuštění VSIX nebo jeného rozšíření projektu.Po ladění projektu, můžete nainstalovat rozšíření systému a potom pokračovat v ladění a testování v normální instanci Visual Studio.

Chcete-li ladit a testovat rozšíření v experimentální instanci Visual Studio

  1. Restartujte Visual Studio s pověřeními pro správu a otevřete řešení ProjectExtensionPackage.

  2. Spuštění ladicího sestavení projektu výběrem F5 klíčů nebo v nabídce panelu Výběr ladění, Spuštění ladění.

    Visual Studionainstaluje rozšíření do %UserProfile%\AppData\Local\Microsoft\VisualStudio\11.0Exp\Extensions\Contoso\Custom Project Property\1. 0 a spustí experimentální instanci Visual Studio.

  3. V experimentální instanci Visual Studio, vytvoření projektu SharePoint pro řešení farmy a použít výchozí hodnoty pro jiné hodnoty v průvodci.

    1. Na panelu nabídek zvolte soubor, Nový, projektu.

    2. V horní části Nový projekt dialogovém okně zvolte rozhraní.NET Framework 3.5 v seznamu verze rozhraní.NET Framework.

      Rozšíření nástrojů SharePoint vyžaduje funkce této verze .NET Framework.

    3. Pod šablony uzel, rozbalte Visual C# nebo jazyka Visual Basic uzel, zvolte SharePoint uzel a pak zvolte 2010 uzlu.

    4. Zvolte Projektu služby SharePoint 2010 šablony a potom zadejte ModuleTest jako název projektu.

  4. V Průzkumníku, zvolte ModuleTest uzel projektu.

    Nová vlastní vlastnost Složka mapy obrázků se zobrazí v okně Vlastnosti s výchozí hodnotou False.

  5. Změňte hodnotu vlastnosti na True.

    Složka prostředků obrázků je přidána do projektu služby SharePoint.

  6. Změnit hodnotu vlastnosti zpět na False.

    Pokud zvolíte Ano tlačítko na Odstranit složku Obrázky? dialogovém obrázky složky prostředků je odstraněn z projektu služby SharePoint.

  7. Ukončete experimentální instanci Visual Studio.

Viz také

Koncepty

Rozšíření SharePoint projektů

Jak: Přidat vlastnost SharePoint projekty

Převod mezi systémovými typy projektů SharePoint a jinými typy projektů Visual Studio

Uložení dat v rozšíření systému SharePoint projektu

Přidružení dat vlastní rozšíření nástroje služby SharePoint