Demonstra Passo a passo: Criando uma extensão de projeto do SharePoint

Esta explicação passo a passo ilustra 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, por exemplo, um quando um projeto é adicionado, excluído, ou seu nome alterado. Você também pode adicionar propriedades personalizadas ou responder quando um valor de propriedade alterado. Diferentemente de extensões de item de projeto, extensões do projeto não podem ser associadas um determinado tipo de projeto do SharePoint. Quando você cria uma extensão de projeto, a extensão carrega quando qualquer tipo de projeto do SharePoint é aberto no Visual Studio.

Esta explicação passo a passo, você irá criar uma propriedade Boolean personalizada que é adicionada a qualquer projeto do SharePoint criado em Visual Studio. Quando definido como True, a nova propriedade adiciona, ou mapas, uma pasta de recurso de imagens para o seu projeto. Quando definido como False, a pasta de imagens será removida, se ele existir. Para obter mais informações, consulte Como: Adicionar e remover pastas mapeadas.

Essa explicação passo a passo demonstra as seguintes tarefas:

  • Criando um Visual Studio extensão para projetos do SharePoint que faz o seguinte:

    • Adiciona uma propriedade de projeto personalizado para a janela de propriedades. A propriedade se aplica a qualquer projeto do SharePoint.

    • Usa o modelo de objeto de projeto do SharePoint para adicionar uma pasta mapeada para um projeto.

    • Usa o Visual Studio o modelo de objeto de automação (DTE) para excluir uma pasta mapeada a partir do projeto.

  • Criando um Visual Studio pacote de extensão (VSIX) para implantar o assembly de extensão. a propriedade de projeto

  • A propriedade de projeto de teste e depuração.

Pré-requisitos

É necessário que os seguintes componentes no computador de desenvolvimento para concluir este passo a passo:

A criação de projetos

Para concluir este passo a passo, você deve criar dois projetos:

  • Um projeto VSIX para criar o pacote 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 através da criação de projetos.

Para criar o projeto VSIX

  1. Inicie o Visual Studio

  2. No menu File, aponte para New, e em seguida, clique em Project.

  3. No Novo projeto caixa de diálogo caixa, expanda o Visual C# ou Visual Basic nós e em seguida, clique o extensibilidade nó.

    ObservaçãoObservação

    O extensibilidade node está disponível somente se você instalar o SDK do Visual Studio 2010. Para obter mais informações, consulte os pré-requisitos que será a seção anteriormente neste tópico.

  4. Na caixa de combinação na parte superior da caixa de diálogo, selecione .NET Framework 4. As extensões de ferramentas de SharePoint requerem recursos nesta versão do .NET Framework.

  5. Clique o O projeto de VSIX modelo.

  6. No nome , digite ProjectExtensionPackage.

  7. Clique em OK.

    Visual StudioAdiciona o ProjectExtensionPackage de projeto para Solution Explorer.

Para criar o projeto de extensão

  1. Em Solution Explorer, o botão direito do mouse no nó da solução, clique em Adde em seguida, clique em Novo projeto.

    ObservaçãoObservação

    Em Visual Basic o nó de solução de projetos, aparece na Solution Explorer somente quando o Always show solution caixa de seleção estiver marcada na Geral, projetos e soluções, caixa de diálogo Options.

  2. No Novo projeto caixa de diálogo caixa, expanda o Visual C# ou Visual Basic nós e clique Windows.

  3. Na caixa de combinação na parte superior da caixa de diálogo, selecione .NET Framework 4.

  4. Selecione o Biblioteca de classe o modelo de projeto.

  5. No nome , digite ProjectExtension.

  6. Clique em OK.

    Visual StudioAdiciona o ProjectExtension o projeto à solução e abre o arquivo de código padrão Class1.

  7. Exclua o arquivo de código Class1 do projeto.

Configurando o projeto.

Antes de escrever código para criar a extensão de projeto, adicione os arquivos de código e referências de assembly para o projeto de extensão.

Para configurar o projeto.

  1. Adicionar um novo arquivo de código chamado CustomProperty para o projeto ProjectExtension.

  2. No menu Project, escolha Add Reference.

  3. Sobre o .NET guia, pressione CTRL e clique em assemblies seguintes e, em seguida, clique em OK:

    • Microsoft.VisualStudio.SharePoint

    • System.ComponentModel.Composition

    • System.Windows.Forms

    • EnvDTE

  4. Em Solution Explorer, na referências a pasta para o projeto ProjectExtension, clique em EnvDTE.

  5. No Propriedades janela, alterar o Incorporar tipos de interoperabilidade propriedade para False.

Definindo a propriedade do novo projeto do SharePoint

Crie uma classe que define a extensão de projeto e o comportamento da nova propriedade de projeto. Para definir a nova extensão de projeto implementa a classe de ISharePointProjectExtension interface. Implemente essa interface, sempre que você deseja definir uma extensão para um projeto do SharePoint. Além disso, adicionar o ExportAttribute para a classe. Este atributo permite que Visual Studio para descobrir e carregar seu ISharePointProjectExtension de implementação. Passar o ISharePointProjectExtension o tipo para construtor. o atributo

Para definir a nova propriedade de projeto do SharePoint

  1. Clique duas vezes no arquivo de código CustomProperty para editá-lo, se ele já não estiver aberto.

  2. Cole o código a seguir no arquivo.

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

Criação da solução

Em seguida, crie a solução para certificar-se de que ele foi compilado sem erros.

Para criar a solução

  • Sobre o Build menu, clique em Build Solution.

Criando um pacote VSIX para implantar a extensão de propriedade do projeto

Para implantar a extensão de projeto, use o projeto VSIX em sua solução para criar um pacote VSIX. Primeiro, configure o pacote VSIX modificando o arquivo source.extension.vsixmanifest que está incluído no projeto VSIX. Em seguida, crie o pacote VSIX pela criação da solução.

Para configurar e criar o pacote VSIX

  1. Em Solution Explorer, clique duas vezes o source.extension.vsixmanifest arquivo.

    Visual StudioAbre o arquivo no editor de manifesto. Esse editor fornece um UI você pode usar para editar o XML no manifesto. Essas informações exibe posterior a Extension Manager. O arquivo extension.vsixmanifest é exigido por todos os pacotes VSIX. Para obter mais informações sobre este arquivo, consulte VSX Schema for Extensions.

  2. No Nome do produto , digite A propriedade de projeto personalizado.

  3. No Autor , digite Contoso.

  4. No Descrição , digite uma propriedade de projeto do SharePoint personalizada que alterna o mapeamento da pasta de recurso de imagens para o projeto.

  5. No conteúdo seção do editor, clique na Adicionar conteúdo botão.

  6. Selecione MEF componente na Selecione um tipo de conteúdo caixa drop-down.

    ObservaçãoObservação

    Este valor corresponde do MEFComponent elemento no arquivo extension.vsixmanifest. Este elemento Especifica o nome de um assembly de extensão no pacote VSIX. Para obter mais informações, consulte MEFComponent Element (VSX Schema).

  7. No Selecionar uma fonte de seção, clique o projeto opção e selecione ProjextExtension na caixa drop-down.

    Este valor identifica o nome do assembly que você está construindo no projeto.

  8. Quando tiver terminado, clique em OK para fechar a Adicionar conteúdo caixa de diálogo.

  9. Quando tiver terminado, clique em Salvar tudo sobre o arquivo menu e depois em seguida fechar o designer de manifesto.

  10. Sobre o Build menu, clique em Build Solution. Certifique-se de que o projeto é compilado sem erros.

  11. Clique no projeto ProjectExtensionPackage em Solution Explorer, clique na Mostrar todos os arquivos botão e, em seguida, abra a pasta de saída da compilação do projeto ProjectExtensionPackage. Agora, esta pasta deve conter um arquivo chamado ProjectExtensionPackage.vsix.

    Por padrão, a pasta de saída de compilação é a.. pasta \bin\debug na pasta que contém o arquivo de projeto.

A propriedade de projeto de teste.

Agora você está pronto para testar a propriedade de projeto personalizado. É mais fácil de depurar e testar a nova extensão de propriedade do projeto em uma instância experimental de Visual Studio. Esta é a instância de Visual Studio que é criado quando você executa um VSIX ou outros projetos de extensibilidade. Depois que o projeto é depurado, você pode instalar a extensão em seu sistema e continue a depurar e testá-lo em uma instância regular do Visual Studio.

Para depurar e testar a extensão em uma instância experimental de Visual Studio

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

  2. Pressione F5 para iniciar uma compilação de depuração do seu projeto.

    Visual Studioinstala a extensão %UserProfile%\AppData\Local\Microsoft\VisualStudio\10.0Exp\Extensions\Contoso\Custom Property\1.0 de projeto e inicia uma instância experimental do Visual Studio.

  3. Na instância experimental do Visual Studio, crie um novo farm solução SharePoint projeto, como um módulo. Use os valores padrão para os outros valores do assistente.

  4. Clique no nó do projeto no Solution Explorer.

    Uma nova propriedade personalizada Pasta de imagens do mapa consta o Propriedades janela com um valor padrão de False.

  5. Alterar mapear a pasta de imagens para True.

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

  6. Alterar mapear a pasta de imagens para False.

    A pasta de recurso de imagens é excluída do projeto do SharePoint.

  7. Feche a instância experimental do Visual Studio.

Consulte também

Outros recursos

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