在COM应用中使用.NET组件

转载 2008年09月30日 19:52:00

转载:原文地址:http://blogs.msdn.com/silverlightshanghai/archive/2008/07/23/com-net.aspx


上一博中,我们用Visual Studio.NET组件(托管组件)变成了COM服务器。本博继续这个话题,看看如何使用.NET工具包来完成相应的功能。

首先我们来看看今天的主题和CLR Interop的关系,在我们组里,interop这个术语包含了四个范畴,即P/Invoke, Reverse P/Invoke, COM InteropReverse COM Interop。前二个概念通过动态连接库(DLL)native世界和.NET世界中实现互通性;后两个概念顾名思义,就是和COM打交道了。其中,COM interop是在.NET应用中使用COM组件;Reverse COM Interop指的是在COM应用中使用.NET组件。概念有些绕口令,看官先别急着抛转,看看下图。

f0.jpg

可能有人会问, COM技术已经历史悠久了,.NET程序员为什么需要和它打交道呢?问题的答案就在于组件一词。举个例子,若干年前一个牛人写了个程序,扩展性极佳,他用了COM把插件的接口定义的明明白白,而我们想用.NET来做这个插件。。。

COM写一个.NET组件,可以参照以下三部曲

1.       定义.NET接口,撰写.NET class

2.       部署.NET组件

3.       撰写COM客户端

第一步骤对经常从事.NET的开发朋友来说非常熟悉,这里给出例子,不再赘述。

csc /target:library a.cs

第二,要部署.NET组件,这里包括两个方面:

regasm a.dll /tlb

1.       把类型库(type library)导出。对于COM应用来说,它只懂得类型库,是为COM组件遵循的二进制标准/tlb选项告诉regasm,导出类型库。我们可以用oleview察看tlb的内容,如下图所示,此前定义的.NET接口和类都在其中。

f2.JPG

 

2.       把步骤2中生成的dll放到注册表中。COM并不懂得诸如GAC的概念,而是通过注册表来查询HKEY_CLASSES_ROOT/CLS_ID/00000000-0000-0000-FFFF-000000000004,观察这个注册表项,InprocServer32中把COM的动态链接库指向了mscoree.dll,这就是传说中的垫片(shim),它会负责加载公共语言运行时,并找到真正的.NET组件----a.dll

 f1.jpg

有了以上两步,我们就可以在COM应用中使用.NET组件了。如何撰写COM组件超出了本文的范畴,有兴趣的读者可以参考代码中的注释。

cl client.cs

  1. // client.cs
  2. #define _WIN32_COM
  3. #include <stdio.h>
  4. #include <wtypes.h>
  5.  
  6. #import "a.tlb" no_namespace named_guids raw_interfaces_only
  7. // a.tlb是第二步中导出的
  8. int main()
  9. {
  10.       IUnknown *pUnk = NULL;
  11.       IA *pIA = NULL;
  12.       HRESULT hresult;
  13.  
  14.       // 0. 初始化COM组件
  15.       hresult = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  16.       if (FAILED(hresult))
  17.       {
  18.             printf("ERROR: cannot initialze COM: 0x%x/n", hresult);
  19.             return -1;
  20.       }
  21.  
  22.       // 1. 获取IUnknown接口
  23.       hresult = CoCreateInstance(CLSID_A, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnk);
  24.       if (FAILED(hresult))
  25.       {
  26.             printf("ERROR: cannot Get the IUnkown interface: 0x%x/n", hresult);
  27.             return -1;
  28.       }
  29.  
  30.       // 2. 获得IA接口
  31.       hresult = pUnk->QueryInterface(IID_IA, (void **)&pIA);
  32.       if (FAILED(hresult))
  33.       {
  34.             printf("ERROR: cannot Convert to IDispatch interface: 0x%x/n", hresult);
  35.             pUnk->Release();
  36.             return -1;
  37.       }
  38.      
  39.  
  40.       pUnk->Release();
  41.  
  42.       // 3. 调用.NET组件
  43.       hresult = pIA->Hello();
  44.       if (FAILED(hresult))
  45.       {
  46.             printf("ERROR: Invoke failed: 0x%x/n", hresult);
  47.       }
  48.  
  49.       // 4. 清理
  50.       pIA->Release();
  51.       CoUninitialize();
  52.       return 0;
  53. }

在COM应用中使用.NET组件

上一博中,我们用Visual Studio把.NET组件(托管组件)变成了COM服务器。本博继续这个话题,看看如何使用.NET工具包来完成相应的功能。首先我们来看看今天的主题和CLR Interop的...
  • SilverlightShanghai
  • SilverlightShanghai
  • 2008年07月24日 13:01
  • 1089

在ASP.NET中使用COM组件创建编辑Microsoft Word(2003)[配置篇]

在ASP.NET中使用COM组件创建编辑Microsoft Word(2003)[配置篇]        这两天接到一个任务,其中有一部分功能就是能够利用表单生成一个统一格式的Word文档,并将其保存...
  • rbmnet
  • rbmnet
  • 2004年09月19日 13:38
  • 6935

NET组件和COM组件之间的相互操作

NET组件和COM组件之间的相互操作 .NET组件和COM组件之间的相互操作日期:2001-10-18 19:29:00出处:技术巅峰 作者:技术巅峰...
  • aiwtu
  • aiwtu
  • 2006年11月22日 11:15
  • 1293

.NET调用Com组件事例

在程序设计中,往往通过键盘的某个按键来完成相关操作!  下面就来说明如何实现: 1.引入名称空间;using System.Runtime.InteropServices;(由于使用到API(user...
  • shizhiyingnj
  • shizhiyingnj
  • 2007年02月11日 23:23
  • 7261

NET中如何引用COM组件

如果您是初次学习.NET,说不定会尝试着去学习怎样使用COM组件,为了让您少走弯路,我把我所遇到的问题写下来,与大家共享。同时也希望与您一起交流,共同提高。联系方式:电话:0571-88021712 ...
  • lvboliang
  • lvboliang
  • 2007年06月05日 21:15
  • 1239

COM组件与.Net组件的比较

1、COM组件与.Net组件的比较        COM技术要早于.Net技术。COM定义了一个组件模型,在该模型中,组件可以使用不同的编程语言进行编写,其可以在本地进程中使用,也可以跨进程使用或...
  • Chinamming
  • Chinamming
  • 2013年11月21日 13:47
  • 3517

C#开发COM组件

1.    概述       Microsoft在解决和以往的COM和SDK开发技术之间的互操作性(Interoperability)方面做了很多的工作,其中包括COM和.NET对象之间的相互调用以及...
  • soudog
  • soudog
  • 2007年04月30日 15:18
  • 10529

从OLE到COM,再到ActiveX,再到.NET

微软从OLE到COM,再到ActiveX,再到.NET的发展历史的简介
  • just0kk
  • just0kk
  • 2016年03月02日 21:31
  • 834

.Net调用Office Com组件的原理及问题检索com类工厂组件检索 COM 类工厂中 CLSID 为 {XXX} 的组件失败

.net调用office组件进行Excel、Word、ppt的一些操作,需要做一下操作: 1、正确全面的安装office 2、DCOM配置权限(64位系统要添加32位组件【mmc -32】...
  • DonetRen
  • DonetRen
  • 2017年12月09日 09:58
  • 271

将.net组件注册为com组件

切换到MS-DOS命令行下面,运行:C:/>regasm ClassLibrary1.DLL /regfile:ClassLibrary1.reg 上面的命令行是注册我们的.NET组件,并且产生了一个...
  • y97523szb
  • y97523szb
  • 2004年11月09日 10:20
  • 1858
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在COM应用中使用.NET组件
举报原因:
原因补充:

(最多只允许输入30个字)