c#调用非托管DLL,是托管执行的?还是....顶着有分

skkbmpbhg 2010-01-27 11:09:16
c#调用非托管DLL,是托管执行的?还是....
还有OCX控件,是托管执行的,还是原生执行的....

希望高手赐教!谢谢

因为开发一个数据实时采集的程序,我用c#开发,因为效率问题,完全不能满足要求,所以改用c/c++,想用这个写成DLL,在C#程序中调用,但是不知道是不是还是托管执行的? 对.net的机制不是很熟悉,谢谢各位,顶着有分,谢谢
...全文
324 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
楼主搞定了?这么解决的呢
seesea125 2010-01-28
  • 打赏
  • 举报
回复
非托管执行,.NET不是万能的,他自己也是更高一级的封装了很多API,组成了自己的函数库而已
xiaotiantian 2010-01-28
  • 打赏
  • 举报
回复
不知道,帮顶!
duanfengo7 2010-01-28
  • 打赏
  • 举报
回复
接分~
cstester 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuyq11 的回复:]
非托管代码是在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务
http://topic.csdn.net/u/20091029/08/20b3b82a-83ec-4d4f-997c-cf693f691a0d.html
[/Quote]
starlessnt 2010-01-28
  • 打赏
  • 举报
回复
学习一下
wuzhicheng5 2010-01-28
  • 打赏
  • 举报
回复
越高的控制权,执行效率越高,但是开发,维护的成本越高(什么事情都要自己做)
越低的控制权,执行效率越高.但是开发,维护的成本越低(框架把很多事情都做了)



非常正确!
cuike519 2010-01-28
  • 打赏
  • 举报
回复
托管代码通过代理来使用非托管对象或者资源。

所以两者实际上抛开代理来说没有任何关系。效率的差异是显而易见的,效率的差异也带来了快速开发的好处,一般还是可以忍受的。对效率要求非常高的程序必然使用C++来完成,这个貌似没有什么异议吧。
bonylee 2010-01-28
  • 打赏
  • 举报
回复
jf
mcdjxiao 2010-01-28
  • 打赏
  • 举报
回复
非托管 啊 注意一下内存布局要不出现内存溢出的问题
sito_hongta 2010-01-28
  • 打赏
  • 举报
回复
接分~
skkbmpbhg 2010-01-28
  • 打赏
  • 举报
回复
结贴了,谢谢楼上各位!
蒋晟 2010-01-28
  • 打赏
  • 举报
回复
速度当然有区别……多了托管、非托管堆izhijianfuzhishuju和切换上下文的时间,少了GC的内存管理的消耗,再就是JIT的代码和原生代码的效率有区别。
鸭梨山大帝 2010-01-27
  • 打赏
  • 举报
回复
1.既然是非托管的,那在C#程序中调用这些DLL方法的执行速度,和在非托管程序(如VC6写的程序)中调用这些DLL方法,执行效率有区别吗?
基本没有,楼主可以自己去试试(除了初始化载入程式UI的时候有些区别)
2.以前虽然知道托管的执行效率较低,但是没什么亲身体会,用到了才感觉到,
托管执行效率肯定比非托管低,但是低不到那里去,.NET本质论就提到过
越高的控制权,执行效率越高,但是开发,维护的成本越高(什么事情都要自己做)
越低的控制权,执行效率越高.但是开发,维护的成本越低(框架把很多事情都做了)
(直接用机器码01001010000,多高的执行效率)
看你如何取舍了

[Quote=引用 5 楼 skkbmpbhg 的回复:]
谢谢"wknight_IT",我的是winform程序,是非托管执行的啊?那我再试一试,不知道能不能满足要求,以前虽然知道托管的执行效率较低,但是没什么亲身体会,用到了才感觉到,

既然是非托管的,那在C#程序中调用这些DLL方法的执行速度,和在非托管程序(如VC6写的程序)中调用这些DLL方法,执行效率有区别吗?
[/Quote]
验证码识别 2010-01-27
  • 打赏
  • 举报
回复
up
鸭梨山大帝 2010-01-27
  • 打赏
  • 举报
回复
据我所知,调用肯定是CLR,但是执行是非托管执行,其部分资源,GC不管回收,内存优化也不理会.
就像我们用dllimport去调用API一样,其调用MSIL会直接用CALL,但是CALL之后的内容不会翻译成中间代码
举例:
下面一个控制台程式,很简单的调用User32.dll 下 MessgeBox

using 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管的了.所以说非托管的代码其向系统申请的资源一定要注意回收
xiaogug01 2010-01-27
  • 打赏
  • 举报
回复
看了看 还是不懂 只能帮你顶下贴了。
skkbmpbhg 2010-01-27
  • 打赏
  • 举报
回复
谢谢"wknight_IT",我的是winform程序,是非托管执行的啊?那我再试一试,不知道能不能满足要求,以前虽然知道托管的执行效率较低,但是没什么亲身体会,用到了才感觉到,

既然是非托管的,那在C#程序中调用这些DLL方法的执行速度,和在非托管程序(如VC6写的程序)中调用这些DLL方法,执行效率有区别吗?
wuyq11 2010-01-27
  • 打赏
  • 举报
回复
非托管代码是在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务
http://topic.csdn.net/u/20091029/08/20b3b82a-83ec-4d4f-997c-cf693f691a0d.html
hhhglj_hhhglj 2010-01-27
  • 打赏
  • 举报
回复
二楼好像可以的
加载更多回复(2)

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧