如何调用非托管dll,托管与非托管
内容导航:
一、如何使用C调用非托管DLL函数
引用: 用C#来捕获屏幕的源程序代码()#region C#捕获当前屏幕的例子using System ; using ; using ns ; using
Model ; using ; using ; using ; public class Form1 : Form { private Button
button1 ; private components = null ; public Form1 ( ) { //初始化窗体中的各个组件
InitializeComponent ( ) ; } // 清除程序中使用过的资源 protected override void Dispose (
bool disposing ) { if ( disposing ) { if ( components != null ) { ( ) ; } } (
disposing ) ; } private void InitializeComponent ( ) { button1 = new Button (
); SuspendLayout ( ) ; = new ( 64 , 40 ) ; = “button1” ; = new ( 80 , 32 ) ; =
0 ; = “捕获” ; += new ler ( button1_Click ) ; AutoScaleBaseSize = new ( 6 , 14 )
; ClientSize = new ( 216 , 125 ) ; ( button1 ) ; MaximizeBox = false ;
MinimizeBox = false ; Name = “Form1” ; Text = “C#捕获当前屏幕!” ; ResumeLayout (
false ) ; } //声明一个API函数 [ Attribute ( “” ) ] private static extern bool BitBlt
( IntPtr hdcDest , // 目标 DC的句柄 int nXDest , int nYDest , int nWidth , int
nHeight , IntPtr hdcSrc , // 源DC的句柄 int nXSrc , int nYSrc , 32 dwRop //
光栅的处理数值 ) ; static void Main ( ) { ( new Form1 ( ) ) ; } private void
button1_Click ( object sender , e ) { //获得当前屏幕的大小 Rectangle rect = new
Rectangle ( ) ; rect = gArea ( this ) ; //创建一个以当前屏幕为模板的图象 Graphics g1 = phics
( ) ; //创建以屏幕大小为标准的位图 Image MyImage = new Bitmap ( , , g1 ) ; Graphics g2 = (
MyImage ) ; //得到屏幕的DC IntPtr dc1 = ( ) ; //得到Bitmap的DC IntPtr dc2 = ( ) ;
//调用此API函数,实现屏幕捕获 BitBlt ( dc2 , 0 , 0 , , , dc1 , 0 , 0 , ) ; //释放掉屏幕的DC c (
dc1 ) ; //释放掉Bitmap的DC c ( dc2 ) ; //以JPG文件格式来保存 ( @”c:\” , ); (
“当前屏幕已经保存为C盘的文件!” ) ; } }#endregion上面的例子中,应用C#调用非托管DLL的函数如下://声明一个API函数 [
Attribute ( “” ) ] private static extern bool BitBlt ( IntPtr hdcDest , // 目标
DC的句柄 int nXDest , int nYDest , int nWidth , int nHeight , IntPtr hdcSrc , //
源DC的句柄 int nXSrc , int nYSrc , 32 dwRop // 光栅的处理数值 ) ;在上面这段代码中,我将以分别介绍
DllImportAttribute属性、extern关键字 、IntPtr类型 这三个方面,向大家介绍如何应用C#调用非托管DLL函数。C# 如何使用
DllImport Attribute(属性) 标识 DLL 和函数Attribute从托管代码中访问非托管 DLL 函数之前,需要知道该函数的名称以及该
DLL 的名称,然后为 DLL 的非托管函数 编写 托管定义。它将用到 static 和 extern 修饰符,此类型的公共静态成员对于多线程操作是安全的。
二、怎样在非托管环境里调用托管DLL解决办法
1、打开腾讯电脑管家找到工具箱;2、打开工具箱找到“电脑诊所”3、打开电脑诊所后在右上角的搜索内输入dlL找到需要修复的文件后点击一键修复或者可以点击详情查看原因并点击立即修复。
楼主别试了。
对于非托管代码,非托管的和托管的都可以访问的。
就象这个库一样,loadlibrary或者dllimport分别在两种地方就可以直接调用了。
但对于托管代码,非托管代码是无法调用的。
理由,托管代码是运行在dotnetfx的解释容器里的。
这点有点象java的东西是运行在java虚拟机里一样。
而调用方如果是非托管的话,怎么能搞这个他怎么没办法读得懂,看得懂的东西呢? 其实你mfc可以弄成托管的代码的。
呵呵
三、C#中提到的非托管的dll和托管的dll,两者有什么不同吗
答:托管DLL,说白了,就是完全由.NET托管代码实现的DLL,完全依赖于.NET平台的CLR运行。托管DLL,受.NETCLR管控,支持内存自动回收等的,对于.NET平台是安全DLL非托管DLL,是指完全或者部分不是用.NET代码实现,不依赖于.NET平台即可运行,例如COM方式的DLL,不支持自动回收内存,对于.NET平台而言,也是非安全可控的。
四、DllImport 引用非托管dll
非托管的是 不利用.net 生成的dll引用 是针对托管的你dll 必须有这个方法才行static extern int abc();
表示声明一个外部实现方法
abc你的abc方法必须在dll中存在还有dll不必须注册,注册就是让系统知道它在哪里以及一些信息,你自己指明位置跟注册一个效果DLLimport支持的是非.net框架下面的dll
如C++ 这类编写的 用.net框架编写出来的dll 就可以直接引用啦
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/102364.html