COM组件转换成.NET组件
  TnD0WQEygW8e 2023年11月09日 7 0

利用类型库导入器(Type Library Importer)可以将其包装成一个.NET组件,然后就可以像使用.NET组件一样使用它了。
.NET框架只是提供了一个包装,并没有真正改变原有的对象
1.找到要转换的.dll文件
2.在命令提示符窗口中输入.dll文件的文件路径,转到.dll文件所在的文件夹下。
3.输入 tlbimp jmail.dll /out:jmail_new.dll然后回车,就会在当前的文件夹下生成一个DLL文件 jmail_new.dll

4.将转换后的文件jmail_new.dll复制到应用程序的bin文件夹下即可

 如何:将本机 COM 服务器用于 TLBIMP

更新:2007 年 11 月

与其他 .NET 语言不同,Visual C++ 提供允许直接使用非托管函数(包括 COM 接口)的 Interop 功能。利用这一点,开发人员可以避免 Tlbimp.exe 及其缺点。有关更多信息,请参见使用 .NET 中的本机 COM 服务器

本主题演示如何通过托管代码 类型库导入程序 (Tlbimp.exe)

下面的示例包含使用 Quartz.dll 中定义的 COM 接口时所需的步骤和代码,Quartz.dll 安装在 Windows XP 的 Windows/System32 目录中。这些接口封装了 DirectShow 功能,允许播放 AVI 文件。若要从命令行执行 Tlbimp.exe,需要通过执行 C:"Program Files"Microsoft.NET"SDK"v2.0"Bin 目录中的 Sdkvars.bat 将 .NET Framework 工具添加到系统路径中。[注:Sdkvars.bat位于目录C:"Program Files"Microsoft Visual Studio 8"SDK"v2.0"Bin]【Tlbimp.exe位于目录C:"Program Files"Microsoft Visual Studio 8"SDK"v2.0"Bin】

生成互操作程序集

  1. 在命令提示窗口中,在 c:"windows"system32 目录中执行 tlbimp quartz.dll 命令。(得到的互操作程序集名称以 COM 类型库的名称为基础;在此示例中,得到的文件为 QuartzTypeLib.dll。)
  2. 将互操作程序集移动到特定的目录中,使用该互操作程序集的应用程序将在此执行。

 示例


下面的代码定义一个控制台应用程序,该应用程序使用前面生成的互操作程序集显示一个 AVI 文件。

使用有效的 AVI 文件名称执行得到的 .exe 文件,该文件将在窗口中呈现。



// AVIPlayer.cpp      

        // compile with: /clr 

        #using <QuartzTypeLib.dll>  

        using namespace QuartzTypeLib;

        using namespace System;

        void DisplayUsage() {

        Console::WriteLine("AVIPlayer: Plays AVI files."); 

        Console::WriteLine("Usage: AVIPlayer.EXE <filename>"); 

        }

        int main() { 

        array<String^>^ args = Environment::GetCommandLineArgs();

        if (args->Length != 2) {

        DisplayUsage();      

        return 0;       

        } 


        String^ filename = args[1]; 

        if (filename->Equals("/?")) { 

        DisplayUsage();

        return 0;

        }

        FilgraphManager^ graphManager = gcnew FilgraphManager();

        IMediaControl^ mc = dynamic_cast<IMediaControl^>(graphManager);

        mc->RenderFile(filename);

        mc->Run();

        Console::WriteLine("press any key");

        Console::ReadLine();

        }

使用 .NET 中的本机 COM 服务器

更新:2007 年 11 月

本节介绍用于从 .NET 应用程序使用现有 COM 组件的可用选项,并概括了各种方法的优点和缺点。通常,推荐的方法是 C++ Interop。

 使用 TLBIMP


Windows 软件开发工具包 (SDK) 类型库导入程序 (Tlbimp.exe)

当调用互操作程序集的方法时,将执行从托管到非托管的转换并且将控件传递给 COM 组件。同样地,当非托管 COM 函数返回时,将执行从非托管到托管的转换。默认情况下,检查 COM HRESULT 以查看是否失败,如果 HRESULT 没有指示成功,将引发异常。类似地,COM 组件初始化和接口查询是由互操作程序集执行的,因此从调用代码隐藏。

互操作程序集不替代它们代表的 COM 组件;在 COM 组件中保留非托管 COM 函数,因此必须在目标计算机上安装并注册此组件,否则调用互操作程序集将失败。

使用 Tlbimp 是从托管代码使用 COM 组件的最简单方法,但存在一些严重的缺点,特别是对于大型和/或复杂的 COM 接口。这些缺点是:

  • Tlbimp 为类型库中的每个 COM 接口生成托管接口。此行为无法取消,因此结果程序集会变得非常大。(例如,Tlbimp 为 Mshtml.dll 生成的互操作程序集超过 8 MB。) 也无法隐藏只打算在 COM 组件内部使用的接口。
  • Tlbimp 支持有限的几个数据类型。通常,不受支持的类型作为泛型、非类型安全的 IntPtr 类型导入到托管世界中,并需要编写易于出错且冗长的封送代码以使用程序集,但有时 Tlbimp.exe 根本无法公开接口的成员。
  • Tlbimp 生成一个单独的互操作程序集,它必须与最终应用程序一起部署。

如果这些缺点是可接受的,请参见如何:将本机 COM 服务器用于 TLBIMP

 修改 MSIL


Tlbimp 的缺点可在一定程度上得到减轻,方法是使用 MSIL 反汇编程序 (Ildasm.exe) 反汇编互操作程序集,编辑 MSIL 以移除不必要的接口定义并替换参数类型,然后用 MSIL 汇编程序 (Ilasm.exe)

 C++ Interop


在 Visual C++ 中,可以完全避免 Tlbimp 和编辑 MSIL 的缺点,因为与 Visual Basic 和 C# 不同,Visual C++ 可以通过常用的 COM 机制(例如 CoCreateInstanceQueryInterface)直接使用 COM 对象。这是可能的,因为 C++ Interop 的功能可导致编译器自动插入转换代码以在托管和非托管函数之间移动。

使用 C++ Interop,可以像通常那样使用 COM 组件,也可以将其包装到 C++ 类中。这些包装类称为自定义运行时可调用包装(或 CRCW),与在应用程序代码中直接使用 COM 相比,它们有两大优点:

  • 结果类可从 Visual C++ 之外的语言中使用。
  • COM 接口的细节可从托管客户端代码中隐藏。.NET 数据类型可用于替换本机类型,并且数据封送的细节可在 CRCW 内部透明地执行。

如何:将本机 COM 服务器与 CRCW 一起使用

无论是直接使用 COM 还是通过 CRCW 使用 COM,必须封送参数类型(简单的、可直接复制到本机结构中的类型除外)。有关数据封送的信息,请参见使用 C++ Interop(隐式 PInvoke)

使用示例

首先将excel.exe copy 到 .."Microsoft Visual Studio .NET 2003"SDK"v1.1"Bin目录下
利用.net 中带的工具在命令提示符下执行tlbimp excel.exe.这样就不会因为你的Excel是xp或2000的不同要去找不同的*.olb文件,还有一点就是因为在2000以后的版本中没有了excel9.olb这个文件了。
通过执行tlbimp excel.exe后我们会得到excel.dll文件。
只要有了这个Excel.dll,现在我们就能使用Excel的各种操作函数了。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月09日 0

暂无评论

推荐阅读
TnD0WQEygW8e