热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一个查看类型库(TypeLibrary)详细信息的工具

在用C#操作Excel作报表的时候,你可能遇到这样的困扰(用其他COM时也存在类似的问题):引用的组件是哪个版本的Offic


        在用C#操作Excel作报表的时候,你可能遇到这样的困扰(用其他COM时也存在类似的问题):引用的组件是哪个版本的Office提供的;想使用tlbimp得到excel.dll,却不知道对哪个文件执行tlbimp(Excel9.olb或Excel.exe)。对于前者我自己深有体会:Office XP以后的版本比Office 2000提供的一些方法的参数要多(比如Excel.Workbooks.Open方法),而且引用Office XP以后版本的dll的.NET应用程序在安装Office 2000的系统上可能会出问题(我遇到过由Excel._Worksheet CurSheet = (Excel._Worksheet)WorkBook.Sheets[1];引发的null值问题),另外,不同版本的Excel引发的客户操作也可能是不同的,如果引用Office 2000下的dll后使用Excel.Workbooks[0].Worksheets[0].Delete()方法删除一个sheet时,会弹出以下对话框:

o_typlibregdelsheet.jpg

而引用Office XP以后版本的dll就不会出现这个对话框。 

        我们在C# Project中添加引用时,可以看到下面这个对话框:

o_typelibregnet.jpg

        这个对话框列举了当前系统中所有的COM组件,但是它提供的关于类型库的信息并不详细,而且没有搜索功能,用起来不是很方便。
        其实,类型库的信息存储在注册表的HKEY_CLASSES_ROOT->TypeLib下:

o_typlibreg.jpg

        我们可以使用Microsoft.Win32.RegistryKey类来获取这些信息:

o_typlibregdetailmain.jpg

        搜索:

o_typlibregsearch.jpg

        类型库详细信息:

o_typlibregdetail.jpg

        代码下载:Down 

        下载内容包括:

o_typlibregfiles.jpg

 

        TypeLibs的详细内容:

  1None.gifusing System;
  2None.gif
  3None.gifnamespace TypeLibBrowser
  4ExpandedBlockStart.gifContractedBlock.gifdot.gif{
  5ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//// 
  6InBlock.gif    /// TypeLibs 的摘要说明。
  7ExpandedSubBlockEnd.gif    /// 

  8InBlock.gif    public class TypeLibs : System.Collections.CollectionBase
  9ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 10InBlock.gif        public TypeLibs()
 11ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 12InBlock.gif            //
 13InBlock.gif            // TODO: 在此处添加构造函数逻辑
 14InBlock.gif            //
 15ExpandedSubBlockEnd.gif        }

 16InBlock.gif
 17InBlock.gif        private string Obj2Str(object pObj)
 18ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 19InBlock.gif            if (pObj == null)
 20InBlock.gif                return String.Empty;
 21InBlock.gif            else
 22InBlock.gif                return pObj.ToString();
 23ExpandedSubBlockEnd.gif        }

 24InBlock.gif
 25InBlock.gif        public void GetTL()
 26ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 27InBlock.gif            const string ROOT_TLB = "TypeLib";
 28InBlock.gif
 29InBlock.gif            Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot;
 30InBlock.gif            Microsoft.Win32.RegistryKey regTLibRoot = regKey.OpenSubKey(ROOT_TLB);
 31InBlock.gif
 32InBlock.gif            foreach(string strTypeLib in regTLibRoot.GetSubKeyNames())
 33ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 34InBlock.gif                Microsoft.Win32.RegistryKey regTL = regTLibRoot.OpenSubKey(strTypeLib);
 35InBlock.gif                foreach(string strVersion in regTL.GetSubKeyNames())
 36ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
 37InBlock.gif                    Microsoft.Win32.RegistryKey regVersion = regTL.OpenSubKey(strVersion);
 38InBlock.gif                    TypeLibBrowser.TypeLib typeLib = new TypeLib();
 39InBlock.gif                    typeLib.GUID = strTypeLib;
 40InBlock.gif                    typeLib.Version = strVersion;
 41InBlock.gif                    foreach(string strValueName in regVersion.GetValueNames())
 42ExpandedSubBlockStart.gifContractedSubBlock.gif                    dot.gif{
 43InBlock.gif                        switch (strValueName)
 44ExpandedSubBlockStart.gifContractedSubBlock.gif                        dot.gif{
 45InBlock.gif                            case "PrimaryInteropAssemblyName" :
 46InBlock.gif                                typeLib.PrimaryInteropAssemblyName = this.Obj2Str(regVersion.GetValue(strValueName));
 47InBlock.gif                                break;
 48InBlock.gif                            default :
 49InBlock.gif                                typeLib.FullName = this.Obj2Str(regVersion.GetValue(strValueName));
 50InBlock.gif                                break;
 51ExpandedSubBlockEnd.gif                        }

 52ExpandedSubBlockEnd.gif                    }

 53InBlock.gif                    foreach(string strSubKey in regVersion.GetSubKeyNames())
 54ExpandedSubBlockStart.gifContractedSubBlock.gif                    dot.gif{
 55InBlock.gif                        Microsoft.Win32.RegistryKey regSubKey = regVersion.OpenSubKey(strSubKey);
 56InBlock.gif                        switch (strSubKey)
 57ExpandedSubBlockStart.gifContractedSubBlock.gif                        dot.gif{
 58InBlock.gif                            case "FLAGS" :
 59InBlock.gif                                typeLib.Flags = this.Obj2Str(regSubKey.GetValue(""));
 60InBlock.gif                                break;
 61InBlock.gif                            case "HELPDIR" :
 62InBlock.gif                                typeLib.HelpDir = this.Obj2Str(regSubKey.GetValue(""));
 63InBlock.gif                                break;
 64InBlock.gif                            default :
 65InBlock.gif                                TypeLibBrowser.TLBFiles typeLibFiles = new TLBFiles();
 66InBlock.gif                                foreach(string strPlatform in regSubKey.GetSubKeyNames())
 67ExpandedSubBlockStart.gifContractedSubBlock.gif                                dot.gif{
 68InBlock.gif                                    TypeLibBrowser.TLBFile tlbFile = new TLBFile();
 69InBlock.gif                                    tlbFile.Number = strSubKey;
 70InBlock.gif                                    switch (strPlatform.Trim().ToUpper())
 71ExpandedSubBlockStart.gifContractedSubBlock.gif                                    dot.gif{
 72InBlock.gif                                        case "WIN16" :
 73InBlock.gif                                            tlbFile.Platform = TypeLibBrowser.TypeLibraryPlatformType.Win16;
 74InBlock.gif                                            break;
 75InBlock.gif                                        case "WIN32" :
 76InBlock.gif                                            tlbFile.Platform = TypeLibBrowser.TypeLibraryPlatformType.Win32;
 77InBlock.gif                                            break;
 78InBlock.gif                                        case "WIN64" :
 79InBlock.gif                                            tlbFile.Platform = TypeLibBrowser.TypeLibraryPlatformType.Win64;
 80InBlock.gif                                            break;
 81InBlock.gif                                        default :
 82InBlock.gif                                            tlbFile.Platform = TypeLibBrowser.TypeLibraryPlatformType.未知;
 83InBlock.gif                                            break;
 84ExpandedSubBlockEnd.gif                                    }

 85InBlock.gif                                    tlbFile.File = this.Obj2Str(regSubKey.OpenSubKey(strPlatform).GetValue(""));                    
 86InBlock.gif                                    typeLibFiles.Add(tlbFile);
 87ExpandedSubBlockEnd.gif                                }

 88InBlock.gif                                typeLib.Files = typeLibFiles;
 89InBlock.gif                                break;
 90ExpandedSubBlockEnd.gif                        }

 91ExpandedSubBlockEnd.gif                    }

 92InBlock.gif                    List.Add(typeLib);
 93ExpandedSubBlockEnd.gif                }

 94ExpandedSubBlockEnd.gif            }

 95ExpandedSubBlockEnd.gif        }

 96InBlock.gif
 97ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// 
 98InBlock.gif        /// 根据GUID和Version搜索Type Library
 99InBlock.gif        /// 

100InBlock.gif        /// 
101InBlock.gif        /// 
102ExpandedSubBlockEnd.gif        /// 

103InBlock.gif        public TypeLibBrowser.TypeLib GetTLDetail(string pGUID, string pVersion)
104ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
105InBlock.gif            if (this.InnerList.Count == 0)
106InBlock.gif                this.GetTL();
107InBlock.gif
108InBlock.gif            foreach (TypeLibBrowser.TypeLib t in this.InnerList)
109InBlock.gif                if (pGUID == t.GUID && pVersion == t.Version)
110InBlock.gif                    return t;
111InBlock.gif
112InBlock.gif            return null;
113ExpandedSubBlockEnd.gif        }

114ExpandedSubBlockEnd.gif    }

115ExpandedBlockEnd.gif}

116None.gif

        再回到本文开头提出的两个问题,我们可以发现在“详细信息”中包含了我们想知道的答案。

        BTW:微软为Excel VBA提供的帮助本身就包含两个版本:2000和2002的,2003的应该与2002的相同,需要这个帮助(包括VBA For Access 2000、Excel 2000 、Excel 2002、Outlook 2000、Outlook 2002、Word 2000、Word 2002的资料)的朋友可以留下自己的Email,文件有点大,我无法上传,这些帮助对我们使用C#操作Office大有裨益!
        
        emteeth.gif



推荐阅读
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
author-avatar
allenn2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有