如何注册和配置服务标识符

在使用类型化协定的 COM 应用程序中使用 Windows Communication Foundation (WCF) 服务名字对象之前,必须向 COM 注册所需的属性类型,并使用所需的绑定配置配置 COM 应用程序和名字对象。

向 COM 注册所需的属性类型

  1. 使用 ServiceModel 元数据实用工具工具(Svcutil.exe) 工具从 WCF 服务检索元数据协定。 这会生成 WCF 客户端程序集和客户端应用程序配置文件的源代码。

  2. 确保程序集中的类型被标记为 ComVisible。 为此,请将以下属性添加到 Visual Studio 项目中 AssemblyInfo.cs 文件。

    [assembly: ComVisible(true)]
    
  3. 将托管 WCF 客户端编译为强名称程序集。 这需要用密码学密钥对进行签名。 有关详细信息,请参阅 使用强名称为程序集签名

  4. 使用程序集注册工具 (Regasm.exe) 并结合 -tlb 选项,将程序集中的类型注册到 COM。

  5. 使用全局程序集缓存(Gacutil.exe)工具将程序集添加到全局程序集缓存。

    注释

    对程序集进行签名并将其添加到全局程序集缓存是可选的步骤,但它们可以简化从运行时正确位置加载程序集的过程。

使用所需的绑定配置来配置 COM 应用程序和标识符对象

  • 将由 ServiceModel 元数据实用工具 (Svcutil.exe) 生成的绑定定义放置在客户端应用程序的配置文件中。 例如,对于名为 CallCenterClient.exe的 Visual Basic 6.0 可执行文件,配置应放置在与可执行文件位于同一目录中名为 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
    

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

    在添加对包含 IMathService 类型的程序集的引用后,可以从 Visual Basic 6.0 应用程序中使用这些名字对象字符串中的任一,如以下示例代码所示。

    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++代码中使用名字对象时,应使用“no_namespace named_guids raw_interfaces_only”导入 Svcutil.exe 生成的程序集,如以下代码所示。

    #import "ComTestProxy.tlb" no_namespace named_guids
    

    这会修改导入的接口定义,以便所有方法返回一个 HResult。 任何其他返回值都转换为 out 参数。 方法的总体执行保持不变。 这样就可以确定在代理上调用方法时出现异常的原因。 此功能仅适用于C++代码。

另请参阅