Partilhar via


Instruções: Incorporar tipos de assemblagens geridas no Visual Studio

Se incorporar informações de uma assemblagem gerida com um nome forte, pode acoplar vagamente tipos numa aplicação para alcançar a independência da versão. Ou seja, o programa pode ser escrito para utilizar tipos de qualquer versão de uma biblioteca gerida sem ter de ser recompilado para cada nova versão.

A incorporação de tipos é frequentemente utilizada com a interoperabilidade COM, como uma aplicação que utiliza objetos de automatização do Microsoft Office. As informações do tipo de incorporação permitem que a mesma compilação de um programa funcione com versões diferentes do Microsoft Office em computadores diferentes. No entanto, também pode utilizar a incorporação de tipos com soluções totalmente geridas.

Depois de especificar as interfaces públicas que podem ser incorporadas, cria classes de runtime que implementam essas interfaces. Um programa cliente pode incorporar as informações de tipo para as interfaces no momento da conceção ao referenciar a assemblagem que contém as interfaces públicas e definir a Embed Interop Types propriedade da referência para True. Em seguida, o programa cliente pode carregar instâncias dos objetos de runtime escritos como essas interfaces. Isto é equivalente à utilização do compilador da linha de comandos e à referência da assemblagem através da opção compilador EmbedInteropTypes.

Se criar uma nova versão da sua assemblagem de runtime com o nome forte, o programa cliente não tem de ser recompilado. O programa cliente continua a utilizar a versão da assemblagem de runtime que estiver disponível para o mesmo, utilizando as informações de tipo incorporado para as interfaces públicas.

Nestas instruções, irá:

  1. Crie uma assemblagem com um nome forte com uma interface pública que contenha informações de tipo que podem ser incorporadas.
  2. Crie uma assemblagem de runtime com um nome forte que implemente a interface pública.
  3. Crie um programa cliente que incorpore as informações do tipo a partir da interface pública e crie uma instância da classe a partir da assemblagem de runtime.
  4. Modifique e recrie a assemblagem do runtime.
  5. Execute o programa cliente para ver que utiliza a nova versão da assemblagem de runtime sem ter de ser recompilada.

Nota

O computador pode mostrar nomes ou localizações diferentes para alguns dos elementos da interface de utilizador do Visual Studio nas seguintes instruções. A edição do Visual Studio que tem e as definições que utiliza determinam estes elementos. Para obter mais informações, veja Personalizar o IDE.

Condições e limitações

Pode incorporar informações de tipo de uma assemblagem nas seguintes condições:

  • A assemblagem expõe pelo menos uma interface pública.
  • As interfaces incorporadas são anotadas com ComImport atributos e Guid atributos com GUIDs exclusivos.
  • A assemblagem é anotada com o ImportedFromTypeLib atributo ou o PrimaryInteropAssembly atributo e um atributo ao nível Guid da assemblagem. Os modelos de projeto visual C# e Visual Basic incluem um atributo ao nível Guid da assemblagem por predefinição.

Uma vez que a função principal da incorporação do tipo é suportar assemblagens interop COM, aplicam-se as seguintes limitações quando incorpora informações de tipo numa solução totalmente gerida:

  • Apenas os atributos específicos da interoperabilidade COM são incorporados. Outros atributos são ignorados.
  • Se um tipo utilizar parâmetros genéricos e o tipo do parâmetro genérico for um tipo incorporado, esse tipo não pode ser utilizado através de um limite de assemblagem. Exemplos de cruzamento de um limite de assemblagem incluem chamar um método de outra assemblagem ou derivar um tipo de um tipo definido noutra assemblagem.
  • As constantes não estão incorporadas.
  • A System.Collections.Generic.Dictionary<TKey,TValue> classe não suporta um tipo incorporado como chave. Pode implementar o seu próprio tipo de dicionário para suportar um tipo incorporado como chave.

Criar uma interface

O primeiro passo é criar a assemblagem da interface de equivalência de tipo.

  1. No Visual Studio, selecione Ficheiro>Novo>Projeto.

  2. Na caixa de diálogo Criar um novo projeto , escreva biblioteca de classes na caixa Procurar modelos . Selecione o modelo C# ou Visual Basic Class Library (.NET Framework) na lista e, em seguida, selecione Seguinte.

  3. Na caixa de diálogo Configurar o novo projeto , em Nome do projeto, escreva TypeEquivalenceInterface e, em seguida, selecione Criar. O novo projeto é criado.

  4. No Explorador de Soluções, clique com o botão direito do rato no ficheiro Class1.cs ou Class1.vb, selecione Mudar o Nome e mude o nome do ficheiro de Classe1 para ISampleInterface. Responda Sim ao pedido para também mudar o nome da classe para ISampleInterface. Esta classe representa a interface pública da classe .

  5. No Explorador de Soluções, clique com o botão direito do rato no projeto TypeEquivalenceInterface e, em seguida, selecione Propriedades.

  6. Selecione Compilar no painel esquerdo do ecrã Propriedades e defina o caminho saída para uma localização no seu computador, como C:\TypeEquivalenceSample. Irá utilizar a mesma localização ao longo destas instruções.

  7. Selecione Criar>Nomenclatura Forte no painel esquerdo do ecrã Propriedades e, em seguida, selecione a caixa de verificação Assinar a assemblagem . No ficheiro de chave de nome Forte, selecione Procurar.

  8. Navegue para e selecione o ficheiro key.snk que criou no projeto TypeEquivalenceInterface e, em seguida, selecione OK. Para obter mais informações, consulte Criar um par de chaves público-privado.

  9. Abra o ficheiro de classe ISampleInterface no editor de código e substitua os respetivos conteúdos pelo seguinte código para criar a ISampleInterface interface:

    using System;
    using System.Runtime.InteropServices;
    
    namespace TypeEquivalenceInterface
    {
        [ComImport]
        [Guid("8DA56996-A151-4136-B474-32784559F6DF")]
        public interface ISampleInterface
        {
            void GetUserInput();
            string UserInput { get; }
        }
    }
    
    Imports System.Runtime.InteropServices
    
    <ComImport()>
    <Guid("8DA56996-A151-4136-B474-32784559F6DF")>
    Public Interface ISampleInterface
        Sub GetUserInput()
        ReadOnly Property UserInput As String
    End Interface
    
  10. No menu Ferramentas , selecione Criar Guid e, na caixa de diálogo Criar GUID , selecione Formato do Registo. Selecione Copiar e, em seguida, selecione Sair.

  11. Guid No atributo do seu código, substitua o GUID de exemplo pelo GUID que copiou e remova as chavetas ({ }).

  12. No Explorador de Soluções, expanda a pasta Propriedades e selecione o ficheiro AssemblyInfo.cs ou AssemblyInfo.vb. No editor de código, adicione o seguinte atributo ao ficheiro:

    [assembly: ImportedFromTypeLib("")]
    
    <Assembly: ImportedFromTypeLib("")>
    
  13. SelecioneGuardar Todos os Ficheiros> ou prima Ctrl+Shift+S para guardar os ficheiros e o projeto.

  14. No Explorador de Soluções, clique com o botão direito do rato no projeto TypeEquivalenceInterface e selecione Compilar. O ficheiro DLL da biblioteca de classes é compilado e guardado no caminho de saída da compilação especificado, por exemplo C:\TypeEquivalenceSample.

Criar uma classe de runtime

Em seguida, crie a classe de runtime de equivalência de tipo.

  1. No Visual Studio, selecione Ficheiro>Novo>Projeto.

  2. Na caixa de diálogo Criar um novo projeto , escreva biblioteca de classes na caixa Procurar modelos . Selecione o modelo C# ou Visual Basic Class Library (.NET Framework) na lista e, em seguida, selecione Seguinte.

  3. Na caixa de diálogo Configurar o novo projeto , em Nome do projeto, escreva TypeEquivalenceRuntime e, em seguida, selecione Criar. O novo projeto é criado.

  4. No Explorador de Soluções, clique com o botão direito do rato no ficheiro Class1.cs ou Class1.vb, selecione Mudar o Nome e mude o nome do ficheiro de Classe1 para SampleClass. Responda Sim ao pedido para também mudar o nome da classe para SampleClass. Esta classe implementa a ISampleInterface interface.

  5. No Explorador de Soluções, clique com o botão direito do rato no projeto TypeEquivalenceInterface e selecione Propriedades.

  6. Selecione Compilar no painel esquerdo do ecrã Propriedades e, em seguida, defina o caminho Saída para a mesma localização que utilizou para o projeto TypeEquivalenceInterface , por exemplo C:\TypeEquivalenceSample.

  7. Selecione Criar>Nomenclatura Forte no painel esquerdo do ecrã Propriedades e, em seguida, selecione a caixa de verificação Assinar a assemblagem . No ficheiro de chave de nome Forte, selecione Procurar.

  8. Navegue para e selecione o ficheiro key.snk que criou no projeto TypeEquivalenceInterface e, em seguida, selecione OK. Para obter mais informações, consulte Criar um par de chaves público-privado.

  9. No Explorador de Soluções, clique com o botão direito do rato no projeto TypeEquivalenceRuntime e selecione Adicionar>Referência.

  10. Na caixa de diálogo Gestor de Referência , selecione Procurar e navegue para a pasta de caminho de saída. Selecione o ficheiro TypeEquivalenceInterface.dll , selecione Adicionar e, em seguida, selecione OK.

  11. Em Explorador de Soluções, expanda a pasta Referências e selecione a referência TypeEquivalenceInterface. No painel Propriedades , defina Versão Específica como Falsa se ainda não estiver.

  12. Abra o ficheiro de classe SampleClass no editor de código e substitua os respetivos conteúdos pelo seguinte código para criar a SampleClass classe:

    using System;
    using TypeEquivalenceInterface;
    
    namespace TypeEquivalenceRuntime
    {
        public class SampleClass : ISampleInterface
        {
            private string p_UserInput;
            public string UserInput { get { return p_UserInput; } }
    
            public void GetUserInput()
            {
                Console.WriteLine("Please enter a value:");
                p_UserInput = Console.ReadLine();
            }
        }
    }
    
    Imports TypeEquivalenceInterface
    
    Public Class SampleClass
        Implements ISampleInterface
    
        Private p_UserInput As String
        Public ReadOnly Property UserInput() As String Implements ISampleInterface.UserInput
            Get
                Return p_UserInput
            End Get
        End Property
    
        Public Sub GetUserInput() Implements ISampleInterface.GetUserInput
            Console.WriteLine("Please enter a value:")
            p_UserInput = Console.ReadLine()
        End Sub
    End Class
    
  13. SelecioneGuardar Todos os Ficheiros> ou prima Ctrl+Shift+S para guardar os ficheiros e o projeto.

  14. No Explorador de Soluções, clique com o botão direito do rato no projeto TypeEquivalenceRuntime e selecione Compilar. O ficheiro DLL da biblioteca de classes é compilado e guardado no caminho de saída da compilação especificado.

Criar um projeto de cliente

Por fim, crie um programa de cliente de equivalência de tipo que faça referência à assemblagem da interface.

  1. No Visual Studio, selecione Ficheiro>Novo>Projeto.

  2. Na caixa de diálogo Criar um novo projeto , escreva consola na caixa Procurar modelos . Selecione o modelo C# ou Visual Basic Console App (.NET Framework) na lista e, em seguida, selecione Seguinte.

  3. Na caixa de diálogo Configurar o novo projeto , em Nome do projeto, escreva TypeEquivalenceClient e, em seguida, selecione Criar. O novo projeto é criado.

  4. No Explorador de Soluções, clique com o botão direito do rato no projeto TypeEquivalenceClient e selecione Propriedades.

  5. Selecione Compilar no painel esquerdo do ecrã Propriedades e, em seguida, defina o caminho Saída para a mesma localização que utilizou para o projeto TypeEquivalenceInterface, por exemplo C:\TypeEquivalenceSample.

  6. No Explorador de Soluções, clique com o botão direito do rato no projeto TypeEquivalenceClient e selecione Adicionar>Referência.

  7. Na caixa de diálogo Gestor de Referências , se o ficheiro TypeEquivalenceInterface.dll já estiver listado, selecione-o. Caso contrário, selecione Procurar, navegue para a pasta de caminho de saída, selecione o ficheiro deTypeEquivalenceInterface.dll (não o TypeEquivalenceRuntime.dll) e selecione Adicionar. Selecione OK.

  8. Em Explorador de Soluções, expanda a pasta Referências e selecione a referência TypeEquivalenceInterface. No painel Propriedades , defina Incorporar Tipos de Interoperabilidade como Verdadeiro.

  9. Abra o ficheiro Program.cs ou Module1.vb no editor de código e substitua os respetivos conteúdos pelo seguinte código para criar o programa cliente:

    using System;
    using System.Reflection;
    using TypeEquivalenceInterface;
    
    namespace TypeEquivalenceClient
    {
        class Program
        {
            static void Main(string[] args)
            {
                Assembly sampleAssembly = Assembly.Load("TypeEquivalenceRuntime");
                ISampleInterface sampleClass =
                    (ISampleInterface)sampleAssembly.CreateInstance("TypeEquivalenceRuntime.SampleClass");
                sampleClass.GetUserInput();
                Console.WriteLine(sampleClass.UserInput);
                Console.WriteLine(sampleAssembly.GetName().Version.ToString());
                Console.ReadLine();
            }
        }
    }
    
    Imports System.Reflection
    Imports TypeEquivalenceInterface
    
    Module Module1
    
        Sub Main()
            Dim sampleAssembly = Assembly.Load("TypeEquivalenceRuntime")
            Dim sampleClass As ISampleInterface = CType( _
                sampleAssembly.CreateInstance("TypeEquivalenceRuntime.SampleClass"), ISampleInterface)
            sampleClass.GetUserInput()
            Console.WriteLine(sampleClass.UserInput)
            Console.WriteLine(sampleAssembly.GetName().Version)
            Console.ReadLine()
        End Sub
    
    End Module
    
  10. SelecioneGuardar Todos os Ficheiros> ou prima Ctrl+Shift+S para guardar os ficheiros e o projeto.

  11. Prima Ctrl+F5 para compilar e executar o programa. Tenha em atenção que o resultado da consola devolve a versão de assemblagem 1.0.0.0.

Modificar a interface

Agora, modifique a assemblagem da interface e altere a respetiva versão.

  1. No Visual Studio, selecione Ficheiro>Abrir>Projeto/Solução e abra o projeto TypeEquivalenceInterface .

  2. No Explorador de Soluções, clique com o botão direito do rato no projeto TypeEquivalenceInterface e selecione Propriedades.

  3. Selecione Aplicação no painel esquerdo do ecrã Propriedades e, em seguida, selecione Informações de Assemblagem.

  4. Na caixa de diálogo Informações de Assemblagem , altere os valores versão da Assemblagem e Versão do ficheiro para 2.0.0.0 e, em seguida, selecione OK.

  5. Abra o ficheiro SampleInterface.cs ou SampleInterface.vb e adicione a seguinte linha de código à ISampleInterface interface:

    DateTime GetDate();
    
    Function GetDate() As Date
    
  6. SelecioneGuardar Todos os Ficheiros> ou prima Ctrl+Shift+S para guardar os ficheiros e o projeto.

  7. No Explorador de Soluções, clique com o botão direito do rato no projeto TypeEquivalenceInterface e selecione Compilar. Uma nova versão do ficheiro DLL da biblioteca de classes é compilada e guardada no caminho de saída da compilação.

Modificar a classe runtime

Modifique também a classe runtime e atualize a respetiva versão.

  1. No Visual Studio, selecione Ficheiro>Abrir>Projeto/Solução e abra o projeto TypeEquivalenceRuntime .

  2. No Explorador de Soluções, clique com o botão direito do rato no projeto TypeEquivalenceRuntime e selecione Propriedades.

  3. Selecione Aplicação no painel esquerdo do ecrã Propriedades e, em seguida, selecione Informações de Assemblagem.

  4. Na caixa de diálogo Informações de Assemblagem , altere os valores versão da Assemblagem e Versão do ficheiro para 2.0.0.0 e, em seguida, selecione OK.

  5. Abra o ficheiro SampleClass.cs ou SampleClass.vb e adicione o seguinte código à SampleClass classe :

     public DateTime GetDate()
     {
         return DateTime.Now;
     }
    
    Public Function GetDate() As DateTime Implements ISampleInterface.GetDate
        Return Now
    End Function
    
  6. SelecioneGuardar Todos os Ficheiros> ou prima Ctrl+Shift+S para guardar os ficheiros e o projeto.

  7. No Explorador de Soluções, clique com o botão direito do rato no projeto TypeEquivalenceRuntime e selecione Compilar. Uma nova versão do ficheiro DLL da biblioteca de classes é compilada e guardada no caminho de saída da compilação.

Executar o programa cliente atualizado

Aceda à localização da pasta de saída da compilação e execute TypeEquivalenceClient.exe. Tenha em atenção que o resultado da consola reflete agora a nova versão da TypeEquivalenceRuntime assemblagem, 2.0.0.0, sem que o programa seja recompilado.

Ver também