Partilhar via


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:

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

  1. Inicie o Visual Studio

  2. Em a barra de menu, escolha Arquivo, Novo, Projeto.

  3. 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çãoObservaçã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.

  4. 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 .

  5. 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

  1. 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çãoObservaçã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.

  2. 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.

  3. 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 .

  4. 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.

  5. 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

  1. Adicione um arquivo de código que é chamado CustomProperty ao projeto de ProjectExtension.

  2. Abra o menu de atalho para o projeto de ProjectExtension , e então escolha Adicionar Referência.

  3. 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.

  4. 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 .

  5. Em Gerenciador de Soluções, na pasta de Referências para o projeto de ProjectExtension , escolha EnvDTE.

  6. 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

  1. 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.

  2. Em a caixa de Nome do produto , entre em Propriedade de projeto personalizado.

  3. Em a caixa de Autor , entre em Contoso.

  4. 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.

  5. 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.

  6. Em a lista de Tipo , escolha Microsoft.VisualStudio.MefComponent.

    ObservaçãoObservaçã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.

  7. Em a lista de Origem , escolha o botão de opção de Um projeto na solução atual .

  8. Em a lista de Projeto , escolha ProjectExtension.

    Esse valor identifica o nome do assembly que você está criando no projeto.

  9. Escolha OK para fechar a caixa de diálogo de adicionar o novo recurso .

  10. Em a barra de menu, escolha Arquivo, Salvar Tudo quando você terminar, e então feche o designer manifesto.

  11. Em a barra de menu, escolha Compilar, Compilar solução, e então certifique-se de que o projeto compila sem erros.

  12. 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 .

  13. 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

  1. Reinicie Visual Studio com credenciais administrativas, e abra a solução de ProjectExtensionPackage.

  2. 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.

  3. 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.

    1. Em a barra de menu, escolha Arquivo, Novo, Projeto.

    2. 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.

    3. 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 .

    4. Escolha o modelo de Projeto do SharePoint 2010 , e digite em ModuleTest como o nome do seu projeto.

  4. 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.

  5. Altere o valor da propriedade a True.

    Uma pasta de recursos de imagens é adicionada ao projeto do SharePoint.

  6. 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.

  7. 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