c#调用非托管DLL,是托管执行的?还是....
还有OCX控件,是托管执行的,还是原生执行的....希望高手赐教!谢谢因为开发一个数据实时采集的程序,我用c#开发,因为效率问题,完全不能满足要求,所以改用c/c++,想用这个写成DLL,在C#程序中调用,但是不知道是不是还是托管执行的? 对.net的机制不是很熟悉,谢谢各位,顶着有分,谢谢

解决方案 »

  1.   

    是非托管的. 动态连接库(Dynamic Link Library)是Microsoft Windows最重要的组成部分之一,动态连接库不能直接被执行,也不能接受任何信息,它是一个独立的文件,其中包含了能被程序或其他DLL调用的函数(或者叫方法),这些函数并不是执行程序本身的一部分,而是根据需要进行载入调用的。

    参考
      

  2.   

    http://blog.csdn.net/ZOLoveGD/archive/2009/04/03/4046845.aspxocx控件 在页面用JS或vbs脚本语言调用即可。
      

  3.   

    非托管代码是在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务
    http://topic.csdn.net/u/20091029/08/20b3b82a-83ec-4d4f-997c-cf693f691a0d.html
      

  4.   

    谢谢"wknight_IT",我的是winform程序,是非托管执行的啊?那我再试一试,不知道能不能满足要求,以前虽然知道托管的执行效率较低,但是没什么亲身体会,用到了才感觉到,既然是非托管的,那在C#程序中调用这些DLL方法的执行速度,和在非托管程序(如VC6写的程序)中调用这些DLL方法,执行效率有区别吗?
      

  5.   

    据我所知,调用肯定是CLR,但是执行是非托管执行,其部分资源,GC不管回收,内存优化也不理会.
    就像我们用dllimport去调用API一样,其调用MSIL会直接用CALL,但是CALL之后的内容不会翻译成中间代码
    举例:
    下面一个控制台程式,很简单的调用User32.dll 下 MessgeBoxusing System;
    using System.Runtime.InteropServices ;
    namespace ChangeIPAddress
    {
        class Program
        {
            [DllImport("user32.dll", EntryPoint = "MessageBox")]
            public static extern int MessageBox(int hWnd, String strMessage, String strCaption, uint uiType);
            static void Main()
            {
                MessageBox(0, "测试", "表头", 0);
            }
        }
    }那么我们用ILDASM查看其中间语言代码:
    Manifest:.module extern user32.dll这个是MessageBox方法的声明.method public hidebysig static pinvokeimpl("user32.dll" winapi) 
            int32  MessageBox(int32 hWnd,
                              string strMessage,
                              string strCaption,
                              unsigned int32 uiType) cil managed preservesig
    {
    }
    而以下是调用:.method private hidebysig static void  Main() cil managed
    {
      .entrypoint
      // 代码大小       20 (0x14)
      .maxstack  8
      IL_0000:  nop
      IL_0001:  ldc.i4.0
      IL_0002:  ldstr      bytearray (4B 6D D5 8B )                                     // Km..
      IL_0007:  ldstr      bytearray (68 88 34 59 )                                     // h.4Y
      IL_000c:  ldc.i4.0
      IL_000d:  call       int32 ChangeIPAddress.Program::MessageBox(int32,
                                                                     string,
                                                                     string,
                                                                     unsigned int32) //<--这里
      IL_0012:  pop
      IL_0013:  ret
    } // end of method Program::Main所以至于CALL方法之后,方法是去申请内存,还是创建线程,都是不CLR管的了.所以说非托管的代码其向系统申请的资源一定要注意回收
      

  6.   

    1.既然是非托管的,那在C#程序中调用这些DLL方法的执行速度,和在非托管程序(如VC6写的程序)中调用这些DLL方法,执行效率有区别吗?
    基本没有,楼主可以自己去试试(除了初始化载入程式UI的时候有些区别)
    2.以前虽然知道托管的执行效率较低,但是没什么亲身体会,用到了才感觉到,
    托管执行效率肯定比非托管低,但是低不到那里去,.NET本质论就提到过
    越高的控制权,执行效率越高,但是开发,维护的成本越高(什么事情都要自己做)
    越低的控制权,执行效率越高.但是开发,维护的成本越低(框架把很多事情都做了)
    (直接用机器码01001010000,多高的执行效率)
    看你如何取舍了
      

  7.   

    非托管执行,.NET不是万能的,他自己也是更高一级的封装了很多API,组成了自己的函数库而已
      

  8.   

    速度当然有区别……多了托管、非托管堆izhijianfuzhishuju和切换上下文的时间,少了GC的内存管理的消耗,再就是JIT的代码和原生代码的效率有区别。