Поделиться через


Практическое руководство. Регистрация и настройка моникера службы

Прежде чем использовать моникер службы Windows Communication Foundation (WCF) в приложении COM с типизированным контрактом, необходимо зарегистрировать необходимые типы атрибутов с помощью COM и настроить приложение COM и моникер с требуемой конфигурацией привязки.

Регистрация необходимых типов атрибутов с помощью COM

  1. Используйте средство служебной программы метаданных ServiceModel (Svcutil.exe), чтобы получить контракт метаданных из службы WCF. Это создает исходный код для клиентской сборки WCF и файла конфигурации клиентского приложения.

  2. Убедитесь, что все типы в сборке имеют пометку ComVisible. Для этого добавьте следующий атрибут в файл AssemblyInfo.cs в проекте Visual Studio.

    [assembly: ComVisible(true)]
    
  3. Скомпилируйте управляемый клиент WCF как сборку с строгим именем. Для этого нужно подписать ее с помощью пары ключей шифрования. Дополнительные сведения см. в разделе Подпись сборки строгим именем.

  4. С помощью средства регистрации сборок (Regasm.exe) с параметром -tlb зарегистрируйте типы сборки в COM.

  5. Чтобы добавить сборку в глобальный кэш сборок, используйте средство глобального кэша сборок (Gacutil.exe).

    Примечание.

    Подписывание сборки и добавление его в глобальный кэш сборок являются необязательными шагами, но они могут упростить процесс загрузки сборки из правильного расположения во время выполнения.

Настройка COM-приложения и моникера с требуемой конфигурацией привязки

  • Поместите определения привязки (созданные средством служебной программы метаданных ServiceModel (Svcutil.exe) в файл конфигурации созданного клиентского приложения. Например, для исполняемого файла Visual Basic 6.0 с именем CallCenterClient.exe конфигурацию необходимо помещать в файл с именем CallCenterConfig.exe.config в том же каталоге, что и исполняемый файл. Теперь клиентское приложение может использовать моникер. Обратите внимание, что конфигурация привязки не требуется, если используется один из стандартных типов привязки, предоставляемых WCF.

    Регистрируется следующий тип.

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

    Доступ к приложению предоставляется через следующую привязку wsHttpBinding. Для заданного типа и конфигурации приложения используются следующие примеры строк моникера.

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

    or

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

    Можно использовать любую из этих строк моникера из приложения Visual Basic 6.0 после добавления ссылки на сборку, содержащую типы IMathService, как показано в следующем образце кода.

    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)
    

    В этом примере определение конфигурации привязки хранится в подходящем именованном файле конфигурации Binding1 для клиентского приложения, например vb6appname.exe.config.

    Примечание.

    Аналогичный код можно использовать в C#, C++ или любом другом языке приложений .NET.

    Примечание.

    Если моникер неправильно сформирован или если служба недоступна, вызов GetObject возвращает ошибку "Недопустимый синтаксис". При получении этой ошибки убедитесь, что используется правильный моникер, а служба доступна.

    Хотя в этом разделе основное внимание уделяется использованию моникера службы из кода Visual Basic 6.0, можно использовать моникер службы на других языках. При использовании моникера из кода C++ сбоку, созданную с помощью средства Svcutil.exe, необходимо импортировать с атрибутом "no_namespace named_guids raw_interfaces_only", как показано в следующем примере кода.

    #import "ComTestProxy.tlb" no_namespace named_guids
    

    При этом изменяются определения импортированного интерфейса, чтобы все методы возвращали HResult. Все остальные возвращаемые значения преобразуются в выходные параметры. Общий процесс выполнения методов остается прежним. Это позволяет определить причину исключения при вызове метода в прокси. Эта функция доступна только в коде C++.

См. также