Podrobné pokyny: Vytvoření přípony projektu služby SharePoint
Tento postup ilustruje vytvoření rozšíření pro projekty SharePoint. Můžete použít rozšíření projektu pro reagování na události na úrovni projektu, jako je například přidání projektu, odstranění nebo změna jeho názvu. 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 How to: Add and Remove Mapped Folders.
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 modelu objektu automatizace (DTE) odstranit složky mapované 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:
Podporované edice Microsoft Windows, služby SharePoint a Visual Studio. Další informace naleznete v tématu Requirements for Developing SharePoint Solutions.
Rozhraní Visual Studio 2010 SDK. Tento návod používá šablonu Projektu VSIX v SDK pro vytvoření balíčku VSIX pro nasazení rozšíření vlastnosti projektu. Další informace naleznete v tématu Rozšíření nástroje SharePoint v aplikaci Visual Studio.
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
Spusťte nástroj Visual Studio.
V nabídce File (Soubor) přejděte na příkaz New (Nový) a klepněte na příkaz Project (Projekt).
V dialogovém okně Nový projekt rozbalte uzly Visual C# nebo Visual Basic a potom klikněte na uzel Rozšiřitelnost.
Poznámka
Uzel Rozšiřitelnost je k dispozici pouze v případě, že nainstalujete Visual Studio 2010 SDK. Další informace naleznete v oddílu požadavky dříve v tomto tématu.
V poli se seznamem v horní části dialogového okna zvolte Rozhraní .NET framework 4. Rozšíření nástrojů SharePoint vyžaduje funkce této verze .NET Framework.
Klikněte na šablonu Projekt VSIX.
Do pole Název zadejte ProjectExtensionPackage.
Klepněte na tlačítko OK.
Visual Studio přidá projekt ProjectExtensionPackage do Průzkumníku řešení.
Chcete-li vytvořit projekt rozšíření
V Průzkumníku řešení klikněte pravým tlačítkem myši na uzel řešení, klikněte na Přidat a pak na Nový projekt.
Poznámka
V projektech Visual Basic se uzel řešení zobrazí v Průzkumníku řešení pouze pokud je označeno zaškrtávací políčko Vždy zobrazit řešení v Obecné, projekty a řešení, dialogové okno Možnosti.
V dialogovém okně Nový projekt rozbalte uzel Visual C# nebo Visual Basic a potom klikněte na Windows.
V poli se seznamem v horní části dialogového okna zvolte Rozhraní .NET framework 4.
Zvolte šablonu projektu Knihovna tříd.
V poli Název zadejte ProjectExtension.
Klepněte na tlačítko OK.
Visual Studio přidá projekt ProjectExtension do řešení a otevře soubor výchozího kódu Class1.
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
Přidání nového souboru kódu s názvem CustomProperty do projektu ProjectExtension.
V nabídce Projekt klepněte na příkaz Přidat odkaz.
Na záložce .NET stiskněte klávesu CTRL a pak klikněte na tlačítko následujících sestavení a potom klikněte na tlačítko OK:
Microsoft.VisualStudio.SharePoint
System.ComponentModel.Composition
System.Windows.Forms
EnvDTE
V Aplikaci Solution Explorer, odkazy klepněte na složku projektu ProjectExtension EnvDTE.
V Vlastnosti okna změnit Vložit Interop typy 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
Pokud již není otevřený, poklikejte na soubor CustomProperty pro jeho upravování.
Do souboru vložte následující kód.
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í
- V nabídce Build (Sestavit) klepněte na příkaz Build Solution (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
V Průzkumníku řešení poklikejte na soubor source.extension.vsixmanifest.
Visual Studio otevře soubor v editoru manifestu. Tento editor vám umožňuje UI úpravy XML v manifestu. Zobrazí tyto informace později ve Správci rozšíření. Soubor extension.vsixmanifest je vyžadován všemi balíčky VSIX. Další informace o tomto souboru získáte v tématu VSX Schema for Extensions.
V poli Název produktu zadejte Vlastní vlastnost projektu.
V poli Autor napište Contoso.
V poli Popis zadejte Vlastní vlastnost projektu SharePoint, která přepíná mapování složky prostředků obrázků do projektu.
V oddílu Obsah editoru klikněte na tlačítko Přidání obsahu.
Zvolte Komponenta MEF v rozevíracím seznamu Volba typu obsahu.
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 (VSX Schema).
V oddílu Volba zdroje klikněte na možnost Projekt a potom zvolte ProjextExtension z rozevíracího seznamu.
Tato hodnota určuje název sestavení, které sestavujete v projektu.
Po dokončení klikněte na OK pro zavření dialogového okna Přidání obsahu.
Po dokončení klikněte na Uložit vše v nabídce Soubor a pak zavřete editor manifestu.
V nabídce Build (Sestavit) klepněte na příkaz Build Solution (Sestavit řešení). Přesvědčte se, zda je projekt zkompilován bez chyb.
Klikněte na projekt ProjectExtensionPackage v Průzkumníku řešení, klikněte na tlačítko Zobrazit všechny soubory a poté otevřete výstupní složku sestavení pro projekt ProjectExtensionPackage. Tato složka by měla nyní obsahovat 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 k testování 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. To je instance Visual Studio, která je vytvořena při spuštění VSIX nebo jeného rozšíření projektu. Poté, co je projekt odladěn, můžete instalovat rozšíření na vašem 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
Restartujte Visual Studio s pověřeními pro správu a otevřete řešení ProjectExtensionPackage.
Stiskněte F5 pro spuštění ladicího sestavení projektu.
Visual Studio nainstaluje rozšíření do %UserProfile%\AppData\Local\Microsoft\VisualStudio\10.0Exp\Extensions\Contoso\Custom Project Property\1.0 a spustí experimentální instanci Visual Studio.
Experimentální instance Visual Studio, vytvořit nové farmě řešení SharePoint projektu, například modul. Použijte výchozí hodnoty pro jiné hodnoty v průvodci.
V Průzkumníku řešení klikněte na uzel projektu.
Nová vlastní vlastnost Složka mapy obrázků se zobrazí v okně Vlastnosti s výchozí hodnotou False.
Změňte Složku mapy obrázků na True.
Složka prostředků obrázků je přidána do projektu služby SharePoint.
Změňte Složku mapy obrázků na False.
Složka prostředků obrázků je odstraněna z projektu služby SharePoint.
Ukončete experimentální instanci Visual Studio.
Viz také
Další zdroje
Postupy: Přidat vlastnost SharePoint projekty
Převod mezi systémovými typy projektů SharePoint a jinými typy projektů Visual Studio