在使用类型化协定的 COM 应用程序中使用 Windows Communication Foundation (WCF) 服务名字对象之前,必须向 COM 注册所需的属性类型,并使用所需的绑定配置配置 COM 应用程序和名字对象。
向 COM 注册所需的属性类型
使用 ServiceModel 元数据实用工具工具(Svcutil.exe) 工具从 WCF 服务检索元数据协定。 这会生成 WCF 客户端程序集和客户端应用程序配置文件的源代码。
确保程序集中的类型被标记为
ComVisible。 为此,请将以下属性添加到 Visual Studio 项目中 AssemblyInfo.cs 文件。[assembly: ComVisible(true)]将托管 WCF 客户端编译为强名称程序集。 这需要用密码学密钥对进行签名。 有关详细信息,请参阅 使用强名称为程序集签名。
使用程序集注册工具 (Regasm.exe) 并结合
-tlb选项,将程序集中的类型注册到 COM。使用全局程序集缓存(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++代码。