c#调用非托管DLL,是托管执行的?还是....
还有OCX控件,是托管执行的,还是原生执行的....希望高手赐教!谢谢因为开发一个数据实时采集的程序,我用c#开发,因为效率问题,完全不能满足要求,所以改用c/c++,想用这个写成DLL,在C#程序中调用,但是不知道是不是还是托管执行的? 对.net的机制不是很熟悉,谢谢各位,顶着有分,谢谢
还有OCX控件,是托管执行的,还是原生执行的....希望高手赐教!谢谢因为开发一个数据实时采集的程序,我用c#开发,因为效率问题,完全不能满足要求,所以改用c/c++,想用这个写成DLL,在C#程序中调用,但是不知道是不是还是托管执行的? 对.net的机制不是很熟悉,谢谢各位,顶着有分,谢谢
参考
http://topic.csdn.net/u/20091029/08/20b3b82a-83ec-4d4f-997c-cf693f691a0d.html
就像我们用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管的了.所以说非托管的代码其向系统申请的资源一定要注意回收
基本没有,楼主可以自己去试试(除了初始化载入程式UI的时候有些区别)
2.以前虽然知道托管的执行效率较低,但是没什么亲身体会,用到了才感觉到,
托管执行效率肯定比非托管低,但是低不到那里去,.NET本质论就提到过
越高的控制权,执行效率越高,但是开发,维护的成本越高(什么事情都要自己做)
越低的控制权,执行效率越高.但是开发,维护的成本越低(框架把很多事情都做了)
(直接用机器码01001010000,多高的执行效率)
看你如何取舍了