Passo a passo: Criando uma extensão de projeto do SharePoint
Essa explicação passo a passo mostra como criar uma extensão para projetos do SharePoint.Você pode usar uma extensão de projeto para responder a eventos de nível de projeto como quando um projeto é adicionado, excluído, ou renomeado.Você também pode adicionar propriedades personalizadas ou responder quando um valor da.A o contrário das extensões de item de projeto, as extensões do projeto não podem ser associadas com um tipo de projeto específico do SharePoint.Quando você cria uma extensão de projeto, a extensão é carregado quando qualquer tipo de projeto do SharePoint é aberto em Visual Studio.
Em essa explicação passo a passo, você criará uma propriedade booleana personalizado que é adicionada a qualquer projeto do SharePoint criado em Visual Studio.Quando definida como True, a nova propriedade adicionar, ou mapeamentos, uma pasta de recursos de imagens ao seu projeto.Quando definida como False, a pasta de imagens é removido, se existir.Para obter mais informações, consulte Como: adicionar e remover pastas mapeadas.
Essa explicação passo a passo demonstra as seguintes tarefas:
Criando uma extensão de Visual Studio para projetos do SharePoint que faça o seguinte:
Adiciona uma propriedade de projeto personalizado para a janela de propriedades.a propriedade aplica a todo o SharePoint o projeto.
Usa o modelo de objeto de projeto do SharePoint para adicionar uma pasta mapeada a um projeto.
Usa o modelo de objeto de automação de Visual Studio (DTE) para excluir uma pasta mapeada do projeto.
Criando um pacote de extensão de Visual Studio (VSIX) para implantar o assembly de extensão de propriedade de projeto.
Depuração e teste a propriedade de projeto.
Pré-requisitos
Você precisa dos seguintes componentes no computador de desenvolvimento de concluir este explicação passo a passo:
Edições suportadas de Microsoft Windows, do SharePoint e de Visual Studio.Para obter mais informações, consulte Requisitos para o desenvolvimento de soluções do SharePoint.
O SDK do Visual Studio.Essa explicação passo a passo usa o modelo de projeto de VSIX em SDK para criar um conjunto de VSIX para implantar a extensão de propriedade de projeto.Para obter mais informações, consulte Estender as ferramentas do SharePoint em Visual Studio.
Criando projetos
Para concluir esta explicação passo-a-passo, você deve criar dois projetos:
Um projeto de VSIX criar o conjunto de VSIX para implantar a extensão do projeto.
Um projeto de biblioteca de classe que implementa a extensão do projeto.
Inicie o passo-a-passo criando projetos.
Para criar o projeto VSIX
Inicie o Visual Studio
Em a barra de menu, escolha Arquivo, Novo, Projeto.
Em a caixa de diálogo de Novo Projeto , expanda os nós de Visual C# ou de Visual Basic , e então escolha o nó de Extensibilidade .
Observação Este nó está disponível somente se você instalar o Visual Studio SDK.Para obter mais informações, consulte a seção de pré-requisito anteriormente em este tópico.
Em a parte superior da caixa de diálogo, escolha o .NET Framework 4,5 na lista de versões do .NET Framework, e então escolha o modelo de projeto de VSIX .
Em a caixa de Nome , insira ProjectExtensionPackage, e então escolha o botão de OK .
o projeto de ProjectExtensionPackage aparece em Gerenciador de Soluções.
Para criar o projeto de extensão
Em Gerenciador de Soluções, abra o menu de atalho para o nó da solução, escolha Adicionar, e então escolha Novo Projeto.
Observação Em projetos de Visual Basic , o nó da solução aparece em Gerenciador de Soluções somente se a caixa de seleção de Sempre mostrar solução está selecionada em General, Projects and Solutions, Options Dialog Box.
Em a caixa de diálogo de Novo Projeto , expanda os nós de Visual C# ou de Visual Basic , e então escolha Janelas.
Em a parte superior da caixa de diálogo, escolha o .NET Framework 4,5 na lista de versões do .NET Framework, e então escolha o modelo de projeto Biblioteca de Classes .
Em a caixa de Nome , insira ProjectExtension, e então escolha o botão de OK .
Visual Studio adiciona o projeto de ProjectExtension a solução e abre o arquivo de código Class1 de opção.
Exclua o arquivo de código Class1 do projeto.
configurando o projeto
Antes que você escreva código para criar a extensão do projeto, adicione arquivos de código e as referências assembly para a extensão projeto.
para configurar o projeto
Adicione um arquivo de código que é chamado CustomProperty ao projeto de ProjectExtension.
Abra o menu de atalho para o projeto de ProjectExtension , e então escolha Adicionar Referência.
Em a caixa de diálogo de Gerenciador de referência – CustomProperty , escolha o nó de estrutura , selecione a caixa de seleção ao lado dos assemblies de System.ComponentModel.Composition e System.Windows.Forms.
Escolha o nó de Extensões , selecione a caixa de seleção ao lado dos assemblies de Microsoft.VisualStudio.SharePoint e de EnvDTE, e então escolha o botão de OK .
Em Gerenciador de Soluções, na pasta de Referências para o projeto de ProjectExtension , escolha EnvDTE.
Em a janela de Propriedades , altere a propriedade de Inserir Tipos Interop a False.
Definindo a propriedade do novo projeto do SharePoint
Crie uma classe que define a extensão do projeto e o comportamento da nova propriedade de projeto.Para definir a nova extensão do projeto, a classe implementa a interface de ISharePointProjectExtension .Implementar essa interface sempre que você deseja definir uma extensão para um projeto do SharePoint.Além de isso, adicione ExportAttribute à classe.Esse atributo permite que Visual Studio para descobrir e carregar sua implementação de ISharePointProjectExtension .Passar o tipo de ISharePointProjectExtension para o construtor do atributo.
Para definir a nova propriedade de projeto do SharePoint
Cole o seguinte código no arquivo de código de 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; } } }
Compilando uma solução
Em seguida, cria uma solução para certificar-se que compila sem erros.
Para criar a solução
- Em a barra de menu, escolha Compilar, Compilar solução.
Criando um conjunto de VSIX para implantar a extensão de propriedade de projeto
Para implantar a extensão do projeto, use o projeto de VSIX em sua solução criar um conjunto de VSIX.Primeiro, configure o conjunto de VSIX modificando o arquivo de source.extension.vsixmanifest que está incluído no projeto de VSIX.Em seguida, crie o conjunto de VSIX criando a solução.
Para configurar e criar o conjunto de VSIX
Em Gerenciador de Soluções, abra o menu de atalho para o arquivo de source.extension.vsixmanifest, e então escolha o botão de Abrir .
Visual Studio abre o arquivo no designer manifesto.Informações que aparece na guia de Metadados também aparece em Extensões e Atualizações. Quaisquer pacotes de VSIX requerem o arquivo de extension.vsixmanifest.Para obter mais informações sobre este arquivo, consulte Referência de esquema de extensão VSIX.
Em a caixa de Nome do produto , entre em Propriedade de projeto personalizado.
Em a caixa de Autor , entre em Contoso.
Em a caixa de Descrição , digite o Uma propriedade de projeto personalizado do SharePoint /desativar que alterna o mapeamento de pasta de recursos de imagens ao projeto.
Escolha a guia de Ativos , e então escolha o botão de Novo .
a caixa de diálogo de adicionar o novo recurso aparece.
Em a lista de Tipo , escolha Microsoft.VisualStudio.MefComponent.
Observação Esse valor corresponde ao elemento de MEFComponent no arquivo de extension.vsixmanifest.Esse elemento especifica o nome de um assembly de extensão no conjunto de VSIX.Para obter mais informações, consulte MEFComponent Element.
Em a lista de Origem , escolha o botão de opção de Um projeto na solução atual .
Em a lista de Projeto , escolha ProjectExtension.
Esse valor identifica o nome do assembly que você está criando no projeto.
Escolha OK para fechar a caixa de diálogo de adicionar o novo recurso .
Em a barra de menu, escolha Arquivo, Salvar Tudo quando você terminar, e então feche o designer manifesto.
Em a barra de menu, escolha Compilar, Compilar solução, e então certifique-se de que o projeto compila sem erros.
Em Gerenciador de Soluções, abra o menu de atalho para o projeto de ProjectExtensionPackage , e escolha o botão de Abrir pasta no Gerenciador de Arquivos .
Em Arquivo Explorer, abra a pasta de saída de compilação para o projeto de ProjectExtensionPackage, e depois verifique que a pasta contém um arquivo denominado ProjectExtensionPackage.vsix.
Por padrão, a pasta de saída de compilação é.\ bin \ debug de sob a pasta que contém o arquivo de projeto.
Testando a propriedade de projeto
Você agora está pronto para teste a propriedade de projeto personalizado.É mais fácil depurar e testar a nova extensão de propriedade de projeto em uma instância de avaliação de Visual Studio.Essa instância de Visual Studio é criada quando você executa um VSIX ou outro projeto de extensibilidade.Depois que você depura o projeto, você pode instalar a extensão no seu sistema e então continuar a depurada e testar em uma instância de Visual Studionormal.
Para depuração e teste a extensão em uma instância de avaliação do Visual Studio
Reinicie Visual Studio com credenciais administrativas, e abra a solução de ProjectExtensionPackage.
Inicie uma construção de depuração do seu projeto ou escolhendo a chave de F5 ou, na barra de menus, escolhendo Depurar, Iniciar Depuração.
O Visual Studio instala a extensão em %UserProfile%\AppData\Local\Microsoft\VisualStudio\11.0Exp\Extensions\Contoso\Custom Project Property\1.0 e inicia uma instância de avaliação do Visual Studio.
Em a instância de avaliação de Visual Studio, crie um projeto do SharePoint para uma solução de farm, e use os valores padrão para os outros valores no assistente.
Em a barra de menu, escolha Arquivo, Novo, Projeto.
Em a parte superior da caixa de diálogo de Novo Projeto , escolha o .NET Framework 3,5 na lista de versões do .NET Framework.
As extensões de ferramentas do SharePoint exigem recursos em esta versão de .NET Framework.
Sob o nó de Modelos , expanda o nó de Visual C# ou de Visual Basic , escolha o nó de SharePoint , e então escolha o nó de 2010 .
Escolha o modelo de Projeto do SharePoint 2010 , e digite em ModuleTest como o nome do seu projeto.
Em Gerenciador de Soluções, escolha o nó de projeto de ModuleTest .
Uma nova propriedade personalizada O mapa a pasta imagens aparece na janela de Propriedades com um valor padrão de False.
Altere o valor da propriedade a True.
Uma pasta de recursos de imagens é adicionada ao projeto do SharePoint.
Altere o valor da propriedade de volta a False.
Se você escolher o botão de Sim na caixa de diálogo de Exclua a pasta de imagens? , a pasta de recursos de imagens é excluída do projeto do SharePoint.
Feche a instância de avaliação de Visual Studio.
Consulte também
Conceitos
Estendendo os projetos do SharePoint
Como: adicionar uma propriedade para projetos do SharePoint
Conversão entre tipos de sistema do projeto do SharePoint e outros tipos de projeto de Visual Studio
Salvar dados em extensões do sistema de projeto do SharePoint
A associação de dados personalizados com extensões de ferramentas do SharePoint