Partilhar via


Como: Registrar e configurar um moniker de serviço

Antes de usar o moniker de serviço WCF (Windows Communication Foundation) em um aplicativo COM com um contrato tipado, você deve registrar os tipos atribuídos necessários com COM e configurar o aplicativo COM e o moniker com a configuração de vinculação necessária.

Registre os tipos atribuídos necessários com COM

  1. Use a ferramenta ServiceModel Metadata Utility Tool (Svcutil.exe) para recuperar o contrato de metadados do serviço WCF. Isso gera o código-fonte para um assembly de cliente WCF e um arquivo de configuração de aplicativo cliente.

  2. Verifique se os tipos no assembly estão marcados como ComVisible. Para fazer isso, adicione o seguinte atributo ao arquivo AssemblyInfo.cs em seu projeto do Visual Studio.

    [assembly: ComVisible(true)]
    
  3. Compile o cliente WCF gerenciado como um assembly de nome forte. Isso requer a assinatura com um par de chaves criptográficas. Para obter mais informações, consulte Assinando um assembly com um nome forte.

  4. Use a ferramenta Assembly Registration (Regasm.exe) com a -tlb opção de registrar os tipos no assembly com COM.

  5. Use a ferramenta Global Assembly Cache (Gacutil.exe) para adicionar o assembly ao cache de assembly global.

    Nota

    Assinar o assembly e adicioná-lo ao Global Assembly Cache são etapas opcionais, mas podem simplificar o processo de carregamento do assembly do local correto em tempo de execução.

Configure o aplicativo COM e o moniker com a configuração de vinculação necessária

  • Coloque as definições de vinculação (geradas pela ServiceModel Metadata Utility Tool (Svcutil.exe) no arquivo de configuração do aplicativo cliente gerado) no arquivo de configuração do aplicativo cliente. Por exemplo, para um executável do Visual Basic 6.0 chamado CallCenterClient.exe, a configuração deve ser colocada em um arquivo chamado CallCenterConfig.exe.config dentro do mesmo diretório que o executável. O aplicativo cliente agora pode usar o moniker. Observe que a configuração de associação não é necessária se estiver usando um dos tipos de associação padrão fornecidos pelo WCF.

    O seguinte tipo é registrado.

    using System.ServiceModel;
    
    [ServiceContract]
    public interface IMathService
    {
        [OperationContract]
        public int Add(int x, int y);
        [OperationContract]
        public int Subtract(int x, int y);
    }
    

    O aplicativo é exposto usando uma wsHttpBinding ligação. Para o tipo e a configuração do aplicativo fornecidos, as cadeias de caracteres de moniker de exemplo a seguir são usadas.

    service4:address=http://localhost/MathService, binding=wsHttpBinding, bindingConfiguration=Binding1
    

    ou

    service4:address=http://localhost/MathService, binding=wsHttpBinding, bindingConfiguration=Binding1, contract={36ADAD5A-A944-4d5c-9B7C-967E4F00A090}
    

    Você pode usar qualquer uma dessas cadeias de caracteres de moniker de dentro de um aplicativo Visual Basic 6.0, depois de adicionar uma referência ao assembly que contém os IMathService tipos, conforme mostrado no código de exemplo a seguir.

    Dim mathProxy As IMathService
    Dim result As Integer
    
    Set mathProxy = GetObject( _
            "service4:address=http://localhost/MathService, _
            binding=wsHttpBinding, _
            bindingConfiguration=Binding1")
    
    result = mathProxy.Add(3, 5)
    

    Neste exemplo, a definição para a configuração Binding1 de associação é armazenada em um arquivo de configuração com nome adequado para o aplicativo cliente, como vb6appname.exe.config.

    Nota

    Você pode usar código semelhante em um C#, um C++ ou qualquer outro aplicativo de linguagem .NET.

    Nota

    Se o moniker estiver malformado ou se o serviço não estiver disponível, a chamada para GetObject retornará um erro de "Sintaxe inválida". Se você receber esse erro, verifique se o moniker que você está usando está correto e se o serviço está disponível.

    Embora este tópico se concentre no uso do moniker de serviço do código do Visual Basic 6.0, você pode usar um moniker de serviço de outros idiomas. Ao usar um moniker do código C++, o assembly Svcutil.exe gerado deve ser importado com "no_namespace named_guids raw_interfaces_only", conforme mostrado no código a seguir.

    #import "ComTestProxy.tlb" no_namespace named_guids
    

    Isso modifica as definições de interface importadas para que todos os métodos retornem um HResultarquivo . Quaisquer outros valores de retorno são convertidos em parâmetros de saída. A execução geral dos métodos permanece a mesma. Isso permite que você determine a causa de uma exceção ao chamar um método no proxy. Esta funcionalidade só está disponível a partir do código C++.

Consulte também