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的使用方法。

     

    动态调用略

     

     

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

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

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

    <SDK>\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组件 

     

     

     

    • 0
      点赞
    • 1
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值