VS2005中引用Microsoft Office COM组件

测试环境:Visual Studio 2005 + Microsoft Office 2003(完全安装,当然包括Microsoft Visual Studio 2005 Tools for the Microsoft Office System 可再发行组件包,如果没有完全安装Office的话则需要安装这个东东。)

可能网络就是用来转贴的吧,看到的绝大部分文章都说将非受管代码COM组件(如MSWORD.OLB)转换成受管代码的类库(Word.dll)的方法是:
首先把COM组件"EXCEL9.OLB"拷贝到C盘的根目录下,然后输入命令:
 
TlbImp WORD9.OLB (据说因为Office 2000以后的版本中没有了WORD9.OLB啦)
 
就会在C盘的根目录下面就产生三个DLL文件:"Word.dll"、"Office.dll"、"VBIDE.dll"。(文章作者的环境可能是VS 2003+Office 2000或者Office XP)
 
其实应该是将C:\Program Files\Microsoft Office\OFFICE11里的MSWORD.OLB和XL5CHS32.OLB组件拷贝到C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin,因为在Bin目录下才有TlbImp.exe,然后利用.NET SDK命令提示工具下执行TlbImp MSWORD.OLB和TlbImp XL5CHS32.OLB ,得到Word.dll和Excel.dll;
 
还有一种方法是直接将Word.exe或者Excel.exe拷贝到Bin目录下,执行TlbImp Word.exe和TlbImp Excel.exe,也可以得到Word.dll和Excel.dll;这种方法的好处就是不用因为你的Office是2000,XP或者2003的不同要去找不同的*.OLB文件.
 
但是两种方法都只能得到Word.dll和Excel.dll,并没有Office.dll和BDIDE.dll两个文件。
 
其中有个奇怪的现象是两种方法得到的Word.dll的版本是一样的,都是8.3.0.0,而得到的Excel.dll的版本却不一样,TlbImp XL5CHS32.OLB得到的Excel.dll版本是1.0.0.0,TlbImp Excel.exe得到的是Excel.dll版本是1.5.0.0。
 
经本人验证,显然在VS 2005项目里添加1.5.0.0版本的Excel.dll引用之后的代码要简单许多,而且其属性更全面。最后终于搞明白了为什么这样,因为提供的XL5CHS32.OLB组件是Excel 5.0,而Office 2003是11.0,不过还是让我费解MS为什么这样做??
 
其实VS2005里面可以直接打开“添加引用”对话框点击“COM”选项卡,然后选择Microsoft Excel 11.0 Object Library的:)

使用 Tlbimp.exe 生成主互操作程序集
  • 在命令提示处,键入:

    tlbimp tlbfile /primary /keyfile: filename /out: assemblyname

    在这个命令中,tlbfile 是包含 COM 类型库的文件,filename 是包含密钥对的容器或文件的名称,assemblyname 是要使用强名称签名的程序集的名称。

主互操作程序集只能引用其他主互操作程序集。如果您的程序集引用第三方 COM 类型库中的类型,必须先从发行者获取一个主互操作程序集,才能生成您的主互操作程序集。如果您是发行者,必须先为相关类型库生成一个主互操作程序集,才能生成引用这些类型库的主互操作程序集。

如果相关主互操作程序集的版本号与原类型库的版本号不同,即使安装在当前目录中也无法发现该程序集。必须在 Windows 注册表中注册该相关主互操作程序集或使用 /reference 选项,确保 Tlbimp.exe 能找到该相关 DLL。

示例

下面的示例导入 COM 类型库 LibUtil.tlb 并使用密钥文件 CompanyA.snk 为程序集 LibUtil.dll 签署强名称。通过省略特定命名空间名称,此示例生成默认命名空间 LibUtil

tlbimp LibUtil.tlb /primary /keyfile:CompanyA.snk /out:LibUtil.dll

为使名称更具有说明性,(使用 VendorName.LibraryName 命名指导原则),下面的示例将重写程序集文件名和命名空间名称。

tlbimp LibUtil.tlb /primary /keyfile:CompanyA.snk /namespace:CompanyA.LibUtil /out:CompanyA.LibUtil.dll

下面的示例导入 MyLib.tlb(它引用 CompanyA.LibUtil.dll)并使用密钥文件 CompanyB.snk 为程序集 CompanyB.MyLib.dll 签署强名称。命名空间 CompanyB.MyLib 会重写默认命名空间名称。

tlbimp MyLib.tlb /primary /keyfile:CompanyB.snk /namespace:CompanyB.MyLib /reference:CompanyA.LibUtil.dll /out:CompanyB.MyLib.dll

posted @ 2008-06-14 09:42  sig556  阅读(4281)  评论(0编辑  收藏  举报