Практическое руководство. Регистрация и настройка моникера службы
Прежде чем использовать моникер службы Windows Communication Foundation (WCF) в приложении COM с типизированным контрактом, необходимо зарегистрировать необходимые типы атрибутов с помощью COM и настроить приложение COM и моникер с требуемой конфигурацией привязки.
Регистрация необходимых типов атрибутов с помощью COM
Используйте средство служебной программы метаданных ServiceModel (Svcutil.exe), чтобы получить контракт метаданных из службы WCF. Это создает исходный код для клиентской сборки WCF и файла конфигурации клиентского приложения.
Убедитесь, что все типы в сборке имеют пометку
ComVisible
. Для этого добавьте следующий атрибут в файл AssemblyInfo.cs в проекте Visual Studio.[assembly: ComVisible(true)]
Скомпилируйте управляемый клиент WCF как сборку с строгим именем. Для этого нужно подписать ее с помощью пары ключей шифрования. Дополнительные сведения см. в разделе Подпись сборки строгим именем.
С помощью средства регистрации сборок (Regasm.exe) с параметром
-tlb
зарегистрируйте типы сборки в COM.Чтобы добавить сборку в глобальный кэш сборок, используйте средство глобального кэша сборок (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++.