介绍 这个例子将帮助你理解如何在VB 6.0代码中实现和使用c# DLL。由于c#是一种面向对象的语言,我们可以使用面向对象的特性在c# DLL中创建适当的类。在旧的VB 6.0应用程序中,我们可以使用COM互操作或遵循COM Plus方法来引用这些dll。这就像把我们的业务逻辑委托给这个DLL。在本文中,我试图展示在VB 6.0中引用c# DLL的两种不同方法。本守则随函附上;您可以直接参考它来理解下面的说明,或者尝试根据这些说明创建自己的代码。 创建COM互操作 通过使用COM互操作,我们创建一个DLL,可以是私有的或共享的。这个DLL可以在VB 6.0应用程序中引用。一个VB 6.0应用程序指的是这个DLL的一个类型库。,一个扩展名为.tlb的文件,是使用VS工具工具创建的。要使COM对象的客户端能够访问该对象,客户端需要对该对象的描述、如何定位它以及如何调用它的方法和属性。对于“真正的”非托管COM类,此描述以类型库的形式可用。类型库是COM类支持的guid、类和接口(方法、属性和参数)的二进制描述。 . net程序集不包含类型库兼容格式的信息。因此,程序员有必要运行. net提供的两个实用程序中的一个来将类的程序集描述提取到类型库文件中。tlbexp是一个实用程序。. net类型库导出器。这个命令行实用程序接受要转换为类型库的程序集DLL文件的名称作为输入。程序员还可以指定要创建的类型库文件的名称。 隐藏,复制Code
tlbexp ComInteropExample.DLL /out:ComInteropExample.tlb
一旦创建了类型库,COM客户端就可以引用它来获取COM客户端绑定到COM类的接口并在运行时激活COM类所需的信息。另一个用于从程序集创建类型库的命令行实用程序是regasm。. net程序集注册实用程序。除了创建一个类型库,这个实用程序也创建必要的Windows注册表项,使程序集作为一个COM对象对客户可见,如下所示: 隐藏,复制Code
regasm ComInteropExample.DLL /tlb: ComInteropExample.tlb
请注意,在。net类库DLL的项目属性中还有一个名为“为COM互操作注册”的属性。将此属性设置为True将指示IDE在每次构建COM互操作程序集时自动注册该程序集,因此不必手动执行此步骤。 在Visual Studio 2005项目中创建COM互操作DLL的说明 在VS 2005中创建一个新的类库项目,项目名称:cominteropexample open AssemblyInfo.cs;它在项目的Properties文件夹中。设置Com可见为“True:” 隐藏,复制代码[组装:ComVisible(真正的) 进入Poject属性->构建。检查Com互操作的选项注册到“Selected”。转到类文件,例如,在ComInteropClass.cs中添加: 隐藏,使用System.Runtime.InteropServices复制Codenamespace 注意,没有必要在应用程序引用中添加对InteropServices DLL的引用。接口iInterface: 隐藏,复制代码定义GUID为[GUID ("EC87B398-B775-4e6f-BE2C-997D4594CFAA")] [InterfaceType (ComInterfaceType.InterfaceIsDispatch)) 注意,要创建GUID,请转到tools ->创建GUID→将GUID格式设置为注册表格式,复制GUID并使用语法将其添加到代码中。编写接口方法如下: 隐藏,复制代码[DispId(1)] int perform加法(int a, int b); [DispId(2)] int performdelete (int a, int b) (Guid(“ec87b398 b775 - 4 - e6f be2c - 997 d4594cfaa”)) [InterfaceType (ComInterfaceType.InterfaceIsDispatch)) 公共接口iInterface { [DispId(1)] int perform加法(int a, int b); [DispId(2)] int performdelete (int a, int b) } 对于类ComInteropClass,添加语句: 隐藏,收缩,复制Codeabove类[Guid("5674D47E-6B2A-456e-85C4-CB7AA6AIF24A")] [ClassInterface (ClassInterfaceType.None)) [ProgId(“ComInteropClass”)] 公开课ComInteropClass: iInterface [Guid(“0 c216a19 e1b7 - 4 b05 - 86 - d3 - 4 - c516bddc041”)) [ClassInterface (ClassInterfaceType.None)) [ProgId(“ComInteropClass”)] 这个名称在VB代码中用于后期绑定Dim //对象作为对象设置的对象 公开课ComInteropClass: iInterface { public int perform加法(int a, int b) { //抛出新的异常( “未执行该方法或操作”); 试一试 { 返回a + b; } 抓 { 返回0; } } public int performdelete (int a, int b) { / /抛出新的异常( 方法或策略契约没有得到执行”); 试一试 { 返回一个- b; } 抓 { 返回0; } } # endregion } 使用VS 2005的SDK命令提示符注册程序集。转到项目的发布文件夹: 隐藏,复制co撤消asm ComInteropExample.DLL /tlb: ComInteropExample.tlb 请参考VB中的这个TLB。VB代码随ZIP文件一起提供,请参考。它可以用于后期绑定。如果未分配强键,则程序集将是私有的,因此将程序集复制到要使用它的文件夹中。要使程序集公开,请使用VS 2005的SN工具为程序集分配强键。 创建COM + 隐藏,复制Code
[assembly: ApplicationName("ComPlusExample")] [assembly:Description("ComPlus Assmebly")] [assembly:ApplicationActivation(ActivationOption.Server)] [assembly:ApplicationAccessControl(false)]
在Visual Studio 2005中创建一个新的c# . net类库项目。在VS2005中打开AssemblyInfo.cs文件。设置以下选项: 隐藏,复制代码[组装:ComVisible(真正的) 转到参考文件夹->右击→添加引用(在。net选项卡中)。添加: 隐藏,复制代码引用:System.EnterpriseServices 打开类文件(ComPlusClass.cs),引用企业服务为: 隐藏,复制Codeusing System.EnterpriseServices 在名称空间下面添加以下语句:创建一个接口,例如iInterface: 隐藏,复制代码公共接口iInterface { 执行加法(int a,int b); 执行减法(a, b); } 创建实现接口ServicedComponent和iInterface的类。要跟踪这个类在COM+中的事件,添加以下语句: 隐藏,收缩,复制代码(EventTrackingEnabled(真正的) (描述(“服务组件”)) [EventTrackingEnabled(真正的)) (描述(“接口服务组件”)) 崩溃(EventTrackingEnabled(真正的) (描述(“服务组件”)) [EventTrackingEnabled(真正的)) (描述(“接口服务组件”)) 公共类ComPlusClass: ServicedComponent iInterface { #地区iInterface成员 public int perform加法(int a, int b) { //抛出新的异常( “未执行该方法或操作”); 试一试 { 返回a + b; } 抓 { 返回0; } } public int perform减法(int a, int b) { / /抛出新的异常( “未执行该方法或操作”); 试一试 { 返回一个- b; } 抓 { 返回0; } # endregion } } 构建应用程序。使用VS 2005命令提示符为应用程序分配强键。去开始→程序文件→Visual Studio 2005→Visual Studio工具->SDK命令提示符。 隐藏,复制Codesn -k ComPlusClass.snk 将此强键添加到应用程序属性->签字→强键注册程序集: 使用VS工具注册程序集为: 隐藏,复制Coderegasm ComPlusExample.DLL 使用工具创建一个类型库: 隐藏,复制Codetlbexp ComPlusExample.DLL 在COM+ as中注册: 隐藏,复制Coderegsvcs ComPlusExample.DLL 要查看已注册的COM+,请转到控制面板->管理工具→Compoent服务。在组件服务方面->电脑→我的电脑→Com +应用程序,右键点击它。你可以为它创建MSI。 总结 要在VB6应用程序中使用,请参考Release文件夹中的程序集的TLB。如果你有任何问题,请告诉我。我已经尽力使这篇文章可读性强,我将尽力用您宝贵的建议来改进它。谢谢你! 历史 2007年5月25日-原来的版本张贴 本文转载于:http://www.diyabc.com/frontweb/news2232.html