COM组件转换成.NET组件

利用类型库导入器(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文件夹下即可

from: http://www.newasp.net/tech/net/12619.html

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

更新:2007 年 11 月

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

本主题演示如何通过托管代码 类型库导入程序 (Tlbimp.exe) 工具使用 COM 对象。如果给定一个 COM 类型库(或包含 COM 组件和类型库的 DLL),此 .NET Framework 工具会生成可由任何 .NET 语言使用的托管互操作程序集。但是,不建议 Visual C++ 程序员使用此技术(特别是处理大型和/或复杂的 COM 类型库时)。

下面的示例包含使用 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();
}

 from: http://msdn.microsoft.com/zh-cn/netframework/8989aw26.aspx

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

更新:2007 年 11 月

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

 使用 TLBIMP

Windows 软件开发工具包 (SDK) 类型库导入程序 (Tlbimp.exe) 是一个可将 COM 类型库公开为称作互操作程序集的一种程序集的工具。此程序集为给定类型库中的各个 COM 接口定义托管等效项(或包装)。

当调用互操作程序集的方法时,将执行从托管到非托管的转换并且将控件传递给 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) 重新汇编 MSIL。此过程易于出错并且要求具备 MSIL、非托管类型和 .NET 类型的知识。而且,如果更新了 COM 接口,必须重新执行此过程。

 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 一起使用 中演示如何使用 Visual C++ 包装 COM 接口。

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

 From: http://msdn.microsoft.com/zh-cn/netframework/zeaxheha.aspx

使用示例

首先将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的各种操作函数了。

from:http://www.bloghome.cn/posts/68543.html

posted @ 2008-10-29 22:14  emanlee  阅读(3450)  评论(0编辑  收藏  举报