Como: registrar e configurar um moniker de serviço

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

Registrar os tipos atribuídos necessários com o 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 do 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 atributo a seguir 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 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 registro de assembly (Regasm.exe) com a opção -tlb de registrar os tipos no assembly com o COM.

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

    Observação

    Assinar o assembly e adicioná-lo ao cache de assembly global são etapas opcionais, mas podem simplificar o processo de carregamento do assembly do local correto no tempo de execução.

Configurar o aplicativo COM e o moniker com a configuração de associação necessária

  • Coloque as definições de associação (geradas pela ferramenta 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 no 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 tipo a seguir é 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 associação wsHttpBinding. Para o tipo e a configuração de aplicativo fornecidos, são usadas as cadeias de caracteres de moniker de exemplo a seguir.

    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 tipos IMathService, 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 da configuração de associação Binding1 é armazenada em um arquivo de configuração nomeado adequadamente para o aplicativo cliente, como vb6appname.exe.config.

    Observação

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

    Observação

    Se o moniker estiver malformado ou se o serviço não estiver disponível, a chamada para GetObject retornará um erro dizendo "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 em usar o moniker de serviço do código do Visual Basic 6.0, você pode usar um moniker de serviço de outras linguagens. Ao usar um moniker do código C++, o assembly gerado Svcutil.exe 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 HResult. Quaisquer outros valores retornados são convertidos em parâmetros externos. A execução geral dos métodos permanece a mesma. Isso permite determinar a causa de uma exceção ao chamar um método no proxy. Esta funcionalidade só é disponibilizada pelo código C++.

Confira também