Udostępnij za pośrednictwem


Wskazówki: tworzenie rozszerzenia projektu SharePoint

Ten instruktaż ilustruje sposób tworzenia rozszerzenie dla projektów programu SharePoint.Rozszerzenie projektu można użyć do reagowania na zdarzenia poziomu projektu, takie jak kiedy projekt jest dodane, usunięte lub zmieniono jego nazwę.Można również dodać właściwości niestandardowe lub reagować, gdy wartość właściwości zostanie zmieniona.W odróżnieniu od rozszerzeń element projektu projekt rozszerzeń nie może być skojarzony z określonym typem projektu programu SharePoint.Podczas tworzenia rozszerzenie projektu rozszerzenie ładuje przy wszelkiego rodzaju projektu programu SharePoint jest otwarty w Visual Studio.

W tym instruktażu będzie utworzyć niestandardową właściwość logiczna, która jest dodawany do każdego projektu programu SharePoint, utworzona w Visual Studio.Po ustawieniu True, Nowa właściwość dodaje lub map obrazów folder zasobów do projektu.Po ustawieniu False, usunięty folder obrazy, jeśli istnieje.Aby uzyskać więcej informacji, zobacz Porady: dodawanie i usuwanie folderów mapowanych.

W tym instruktażu przedstawiono następujące zadania:

  • Tworzenie Visual Studio rozszerzenia dla projektów programu SharePoint, które wykonuje następujące czynności:

    • Dodaje właściwość niestandardową projektu do okna właściwości.Właściwość ma zastosowanie do każdego projektu programu SharePoint.

    • Używa modelu obiektowego projektu programu SharePoint, aby dodać zmapowanego folderu do projektu.

    • Używa Visual Studio modelu obiektów automatyzacji (DTE), aby usunąć folder mapowane z projektu.

  • Budowa Visual Studio pakiet rozszerzenia (VSIX) do wdrażania zestawu rozszerzenie właściwość projektu.

  • Debugowanie i badania właściwości projektu.

Wymagania wstępne

Potrzebne są następujące składniki na komputerze deweloperskim do przeprowadzenia tego instruktażu:

Tworzenie projektów

Do przeprowadzenia tego instruktażu, należy utworzyć dwa projekty:

  • Aby utworzyć pakiet VSIX wdrożyć rozszerzenie projektu projekt VSIX.

  • Projektu biblioteki klas, który implementuje rozszerzenie projektu.

Instruktaż należy rozpocząć od utworzenia projektów.

Aby utworzyć projekt VSIX

  1. Start Visual Studio.

  2. Na pasku menu wybierz pliku, Nowa, Projekt.

  3. W Nowy projekt okno dialogowe rozwiń Visual C# lub języka Visual Basic węzłów, a następnie wybierz polecenie rozszerzalności węzła.

    [!UWAGA]

    Ten węzeł jest dostępne tylko po zainstalowaniu programu Visual Studio SDK.Aby uzyskać więcej informacji zobacz sekcję Warunki wstępne, wcześniej w tym temacie.

  4. W górnej części okna dialogowego wybierz 4.5.NET Framework wersji.NET Framework na liście, a następnie wybierz Projektu VSIX szablonu.

  5. W Nazwa wprowadź ProjectExtensionPackage, a następnie wybierz polecenie OK przycisk.

    ProjectExtensionPackage projekt pojawia się w Solution Explorer.

Aby utworzyć rozszerzenie projektu

  1. W Solution Explorer, otwórz menu skrótów dla węzła rozwiązanie, wybierz Dodaj, a następnie wybierz polecenie Nowy projekt.

    [!UWAGA]

    W Visual Basic projektów, węzeł rozwiązanie pojawia się w Solution Explorer tylko wtedy, gdy Zawsze pokazuj rozwiązanie pole wyboru jest zaznaczone w Ogólne, Projekty i rozwiązania, Opcje — okno dialogowe.

  2. W Nowy projekt okno dialogowe rozwiń Visual C# lub języka Visual Basic węzły, a następnie wybierz polecenie Windows.

  3. W górnej części okna dialogowego wybierz opcję 4.5.NET Framework wersji.NET Framework na liście, a następnie wybierz Biblioteka klas szablonu projektu.

  4. W Nazwa wprowadź ProjectExtension, a następnie wybierz polecenie OK przycisk.

    Visual Studiododaje ProjectExtension projektu do rozwiązania i otwiera plik domyślny kod Class1.

  5. Usuń plik Class1 kodu z projektu.

Konfigurowanie projektu

Przed pisać kod, aby utworzyć rozszerzenie projektu należy dodać kod plików i odwołania do zestawów do rozszerzenie projektu.

Aby skonfigurować projektu

  1. Dodawanie pliku kodu o nazwie właściwości niestandardowej do projektu ProjectExtension.

  2. Otwórz menu skrótów dla ProjectExtension projektu, a następnie wybierz Dodaj odwołanie.

  3. W Reference Manager — właściwości niestandardowej okno dialogowe Wybierz Framework węzła, a następnie zaznacz pole wyboru obok zestawów System.ComponentModel.Composition i System.Windows.Forms.

  4. Wybierz rozszerzenia węzła, zaznacz pole wyboru obok zestawów Microsoft.VisualStudio.SharePoint i EnvDTE, a następnie wybierz OK przycisk.

  5. W Solution Explorerpod odwołania folder dla ProjectExtension projektu, wybierz opcję EnvDTE.

  6. W Właściwości okna, zmiana Osadzić typy współdziałania z modelem właściwość, aby False.

Definiowanie właściwości nowego projektu programu SharePoint

Tworzenie klasy, która określa rozszerzenie projektu i zachowanie właściwości nowego projektu.Aby zdefiniować nowe rozszerzenie projektu implementuje klasy ISharePointProjectExtension interfejsu.Implementuje ten interfejs, w każdym przypadku, gdy chcesz zdefiniować rozszerzenie projektu programu SharePoint.Ponadto, dodać ExportAttribute do klasy.Atrybut ten umożliwia Visual Studio do odnajdowania i załadować Twoje ISharePointProjectExtension realizacji.Przekazać ISharePointProjectExtension typ atrybut konstruktora.

Aby zdefiniować nowe właściwości projektu programu SharePoint

  • Wklej następujący kod do pliku kod właściwości niestandardowej.

    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;
    
            }
        }
    }
    

Budowania rozwiązania

Następnie zbudować rozwiązanie, aby upewnić się, że skompilowany bez błędów.

Rozwiązanie

  • Na pasku menu wybierz budować, Budowania rozwiązania.

Tworzenie pakiet VSIX wdrożyć rozszerzenie właściwości projektu

Aby wdrożyć rozszerzenie projektu, należy użyć projektu VSIX w swoje rozwiązanie, aby utworzyć pakiet VSIX.Najpierw należy skonfigurować pakiet VSIX modyfikując plik source.extension.vsixmanifest, który jest zawarty w projekcie VSIX.Następnie utwórz pakiet VSIX przez budowania rozwiązania.

Aby skonfigurować i utworzyć pakiet VSIX

  1. W Solution Explorer, aby otworzyć menu skrótów dla pliku source.extension.vsixmanifest, a następnie wybierz Otwórz przycisk.

    Visual StudioOtwiera plik manifestu projektanta.Informacje wyświetlane w metadane kartę pojawia się również w rozszerzenia i aktualizacje. Wszystkie pakiety VSIX wymagają pliku extension.vsixmanifest.Aby uzyskać więcej informacji na temat tego pliku, zobacz VSIX rozszerzenie schematu odwołania.

  2. W Nazwa produktu wprowadź Niestandardowe właściwości projektu.

  3. W autora wprowadź Contoso.

  4. W Opis wprowadź niestandardowe właściwości projektu programu SharePoint Włącza lub wyłącza mapowanie folderu Obrazy zasobów do projektu.

  5. Wybierz aktywów kartę, a następnie wybierz Nowa przycisk.

    Dodać nowego środka pojawi się okno dialogowe.

  6. W typu listy, wybierz opcję Microsoft.VisualStudio.MefComponent.

    [!UWAGA]

    Wartość ta odpowiada MEFComponent elementu w pliku extension.vsixmanifest.Ten element Określa nazwę zestawu rozszerzeń w pakiecie VSIX.Aby uzyskać więcej informacji, zobacz MEFComponent Element.

  7. W źródło listy, wybierz opcję projektu w bieżącym rozwiązaniem przycisku opcji.

  8. W Projekt listy, wybierz opcję ProjectExtension.

    Ta wartość identyfikuje nazwę zespołu, budowany w projekcie.

  9. Wybierz OK zamknąć Dodać nowego środka okno dialogowe.

  10. Na pasku menu wybierz pliku, Zapisz wszystkie kiedy zakończyć, a następnie zamknij projektanta manifestu.

  11. Na pasku menu wybierz budować, Budowania rozwiązania, a następnie upewnij się, że projekt kompiluje się bez błędów.

  12. W Solution Explorer, otwórz menu skrótów dla ProjectExtensionPackage projektu, a następnie wybierz polecenie Otwórz Folder w Eksploratorze przycisk.

  13. W Explorer plik, otwórz folder wyjściowy kompilacji dla projektu ProjectExtensionPackage i sprawdź, że folder zawiera plik o nazwie ProjectExtensionPackage.vsix.

    Domyślnie folder wyjściowy kompilacji jest...folder \bin\Debug w folderze, który zawiera plik projektu.

Badania właściwości projektu

Teraz możesz przetestować właściwości niestandardowych projektu.To najłatwiejszy do debugowania i przetestować nowe rozszerzenie właściwości projektu w wystąpieniu doświadczalnych Visual Studio.To wystąpienie Visual Studio jest tworzony podczas uruchamiania projekt rozszerzalność lub VSIX.Po debugowania projektu, można zainstalować rozszerzenia w systemie, a następnie kontynuować testowanie go w regularnych wystąpienie Visual Studio.

Do debugowania i przetestować rozszerzenia w doświadczalnych wystąpienie programu Visual Studio

  1. Uruchom ponownie Visual Studio z poświadczeniami administracyjnymi, a następnie otwórz rozwiązanie ProjectExtensionPackage.

  2. Rozpocznij kompilacja do debugowania projektu przez wybranie F5 kluczy lub na pasku, wybierając menu Debug, Start Debugging.

    Visual Studiorozszerzenie do %UserProfile%\AppData\Local\Microsoft\VisualStudio\11.0Exp\Extensions\Contoso\Custom Property\1.0 projektu i rozpoczyna eksperymentalne wystąpienie Visual Studio.

  3. W wystąpieniu doświadczalnych Visual Studio, tworzenie projektu programu SharePoint dla roztworu farmy i użyć wartości domyślnych dla innych wartości w kreatorze.

    1. Na pasku menu wybierz pliku, Nowa, Projekt.

    2. W górnej części Nowy projekt okno dialogowe Wybierz 3.5.NET Framework na liście wersje.NET Framework.

      Rozszerzenia narzędzi programu SharePoint wymaga funkcji w tej wersji .NET Framework.

    3. Pod Szablony węzła, rozwiń węzeł Visual C# lub języka Visual Basic węzeł, wybierz SharePoint węzła, a następnie wybierz 2010 węzła.

    4. Wybierz Projektu programu SharePoint 2010 szablon, a następnie wprowadź ModuleTest jako nazwę projektu.

  4. W Solution Explorer, wybierz opcję ModuleTest węzła projektu.

    Nowe właściwości niestandardowej Folder obrazów Map pojawia się w Właściwości okno z wartości domyślnej False.

  5. Zmień wartość tej właściwości, aby True.

    Folder Images zasób jest dodawany do projektu programu SharePoint.

  6. Zmień wartość tej właściwości z powrotem do False.

    Jeśli wybierzesz Tak przycisk w usunąć folder Obrazy? okno dialogowe, obrazy, folder zasobów zostanie usunięty z projektu programu SharePoint.

  7. Zamknij doświadczalnych wystąpienie Visual Studio.

Zobacz też

Koncepcje

Rozszerzanie projektów SharePoint

Porady: dodawanie właściwości do projektów SharePoint

Konwertowanie pomiędzy typami systemu projektu SharePoint a innymi typami projektu Visual Studio

Zapisywanie danych w rozszerzeniach systemu projektu SharePoint

Kojarzenie danych niestandardowych z rozszerzeniami narzędzi SharePoint