COM和.NET的互操作

C#调用COM组件

 

Daven172

C#调用C++类(以COM组件的形式)

如果想用C#调用C/C++写的函数,可以先将C/C++的函数写成dll文件,由C#用DllImport的方式来调用,但是这种方法无法调用C++写的类,如果想调用C++类,可以先把C++类封装成COM组件,再由C#来调用。方法如下(以VS2008英文版为例说明)

一、新建一个Visual C++项目,类型为ATL Project,假设项目名为ComProject,直接点Finish即可。

二、在Solution Explorer的ComProject项目名上右击,选择Add->Class,选择ATL Simple Object,在Short name里填上类名(假设为Hello),点Next,按需求进行选择,然后点Finish。

三、切换到Class View视图,在IHello上右击,选择Add->Method,为IHello接口添加一个方法,方法名为SayHello。打开Hello.cpp文件,在SayHello函数里加上MessageBox(NULL, _T("Hello"), _T("Hello"), MB_OK);,主要作测试用。

四、新建一个Visual C#项目,类型为Console Application,假设项目名为ComTest。在ComTest项目名上右击,选择Add Reference->Browse,在ComProject/Debug下找到ComProject.tlb这个文件,选中并点OK。

五、打开Program.cs,把代码改成

using System;
using ComProjectLib;
namespace ComTest
{
    class Program
    {
        static void Main(string[] args)
        {
            HelloClass hello = new HelloClass();
            hello.SayHello();
        }
    }
}

六、在ComTest项目名上右击,选择Set as StartUp Project,把此项目设为启动项目,然后按Ctrl+F5运行即可,如果出现Hello这个消息框,说明调用COM组件成功。

 

 

 

 

.Net提供三种途径供我们导入一个COM组件:
    1、通过Visual Studio .Net提从的“添加引用”功能
    2、通过命令行方式——TLBIMP.EXE

          TestObj.dll /out:interop.TestObjLib.dll。这样,执行后将会产生一个名为interop.TestObjLib.dll的COM Interop。
    3、使用System.Runtime.InteropServices.TypeLibConverter类编程实现导入功能

 

 

 

Com与.Net互操作

一、.Net调用Com组件

.Net调用Com组件主要分为两类:静态调用及动态调用。

所谓静态调用:指通过通过tlbimp.exe命名产生Com组件在.Net环境下的包装类,然后通过这个包装类来访问Com组件。

所谓动态调用:是指不通过Com组件的包装类来进行Com组件调用,而是在远行时通过反射来进行Com组件调用。

下面将分别详细的讨论这两种实现方法:

静态调用

1、  编写Com组件MyComponent.dll

2、 产生可访问Com组件的包装类:

tlbimp /out:Interop.MyComponent.dll MyComponent.dll

3、  在.Net代码中访问

只要在项目添加Com包装类,就可以像访问.Net的装配件一样访问Com组件。

 

当然上面的三个步骤也可以在VS中直接添加对Com组件的引用,让VS自动完成第二步。

注意:

1、 如果引用Com组件的.Net项目为结果为强命名组件,这个时候要求Com组件的包装类也必须为强命名组件,所以这个时候必须手动进行第二步操作,并且在产生包装类的时候设置snk文件名称,具体操作方法为:

tblimp /keyfile:filename.snk /out:Interop.MyComponent.dll MyComponent.dll

2、  要想有更多的设置请参考tlbimp的使用方法。

 

动态调用略

 

 

用TlbImp.exe生成程序可调用的Dll

在很多项目当中需要安装某些程序并调用接口...虽然配置服务器上也安装了程序,但是发布的程序却不能直接调用...后来发现在VS里调试重新引用一下Dll就没有问题了.但是不可能每安装一次就重新调试一下...因为需要配置的机器未必会安装Visual Studio...

有个办法可以解决配置的问题...主角就是:TlbImp.exe,它是Visual Studio自带的类型库导入程序,路径位于\v2.0\Bin 目录中

用法:首先在开发时先找到要引用的程序(exe,tlb或8li)的文件夹,在里面添加一个批处理文件.内容就写

\v2.0\Bin\TlbImp.exe XXX.tlb /out:myTest.dll

pause

如果执行成功,则会在这个目录下生成一个myTest.dll.然后复制到项目的文件夹下,再引用,就可以了.

当然其实也可以先引用COM,然后编译,让VS生成一个Interop.XXX.dll后,把它随着程序一起发布,并且移除原来的COM引用,改为直接引用新生成的Interop.XXX.dll.

 

 

 

 

COM和.NET的互操作

 

.NET支持运行时通过COM、COM+、本地WinAPI调用与未管制代码的双向互操作性,BCL为此提供了一套类和属性,包括受管制对象生存期的精确控制等。要实现互操作性,必须首先引入.NET Framework的 System.Runtime.InteropServices命名空间。C#的语法为: 

using System.Runtime.InteropServices; 


1、.NET访问API 

.NET允许C#访问未管制的DLL的函数。如要调用Windows User32.dll的MessageBox函数: 

int MessageBox(HWND hwnd,LPCTSTR lpText, LPCTSTR lpCaption,UINT uType) 

可以声明一个具有DLLImport属性的static extern方法: 

using System.Runtime.InteropServices; 

[DllImport(“user32.dll”)] 

static ertern int MessageBox(int hwnd,string text,string caption,int type); 

然后在代码里面直接调用就可以了。这里要注意在调用返回字符串的API中使用StringBuilder对象。 

2、.NET访问COM组件 

从.NET调用COM组件比较容易,只要使用tlbimp.exe产生COM的装配形式的WarpClass,然后在.NET项目中调用即可。

注意COM的类型信息通过Type Library文件描述,.NET装配件是自描述的。Tlbimp的作用是从COM组件及其类型信息中产生自描述的装配件。由于VB是进行COM组件开发最简单的语言,所以我们以一个简单的VB COM组件来说明。 

3、将.NET组件转化为COM组件 

 

 

 

你可能感兴趣的:(COM和.NET的互操作)