.Net使用非托管程序
开发过程中我们或多或少都要使用到非托管组件,例如常见的ActiveX(一般是vb写的.ocx组件)或Com组件(一般是c++编写)。我们都知道.Net程序是可以使用托管代码的,常见的方式大概可以分为两种:一使用使用DllImport的方式调用直接调用非托管代码;二使用转化为"Interop"开头后缀为".dll"的包装组件(可以通过vs添加引用[vs会自动生成相应组件放到obj文件夹中]或者使用 Tlbimp.exe工具来实现)。
对于第一种方式主要用于简单的调用并且不想用部署ActivX或Com组件的情况下,难点就是根据非托管类型找到对应的托管类型(但是网上介绍了很多方法,包括一些工具来帮助我们解决这个问题)。而对于第二种方法,通过包装类来解决的优点其实就是使用方便,可是它需要注册Com组件(使用regsvr32工具)。
对于第二种方式一块看一个例子吧(第一种我就不再举例子了,有时间我们再重点看一下):
下面一段代码是检查是否插入Usb Key的,UKey的组件本身是ocx控件,通过添加以用UKEYOTPLib在obj中生成一个Interop.UKEYOTPLib.dll来完成对控件的包装,然后在代码中就像使用一般托管组件一样。
using System; using System.Collections.Generic; using System.Text; using UKEYOTPLib; namespace InvokeUnmanagedCode { class Program { static void Main(string[] args) { OtpUKeyClass ukey = new OtpUKeyClass(); string devicePath=ukey.FindPort(0); if (ukey.LastErr != 0)//说明没有找到UKey { Console.WriteLine("暂未插入UKey!"); } else { Console.WriteLine("已插入Ukey!"); } Console.ReadKey(); } } }
首先我先不注册组件试试,结果如下图提示未找到组件。
接着我注册组件而不插入UKey。
插入UKey后
注意:注册组件一般使用Regsvr32工具,像Ukey这种一般都有安装程序,安装的过程中会自动注册。
以上是常用的调用非托管程序的方法,那么除了这两种方法是不是还有其他方式呢?那就是通过"加载非托管动态链接库"的方式来实现。这个个人用的不太多所以也就不再赘余了。
补充:有时候我们在注册了组件却不知道,或者有重复注册的现象(注意重复注册的话会有可能因为版本不同给你造成困扰)。既然这样如何知道所注册的组件信息呢?答案就是利用window优化大师。执行:系统清理--ActiveX清理--分析,就可以看到所有已注册的Com或ActiveX组件。例如下图我注册的Usb Key组件信息。
在这里再给大家介绍一个小技巧:如果你看到了已注册的信息想要反注册而又怕使用命令行麻烦的话,可以先按照window优化大师给出的组件位置,将其放到别处,然后用windows优化大师修复(因为这是指定的位置不存在相应组件,优化大师就认为这是垃圾信息)就可以将注册信息删除。
.Net使用非托管程序相关推荐
- Windbg 教程-调试非托管程序的基本命令下
前面的文章调试非托管程序的基本命令中讲到如何使用windbg在程序中设置断点,既然断点已经设置好了,下一步就是直接执行程序,程序中断以后,第一件事情就是查看堆栈.在windbg中查看堆栈使用k命令就可 ...
- Windbg教程-调试非托管程序的基本命令中
前面的文章调试非托管程序的基本命令上讲到如何在windbg里面启动一个程序并且加载调试符号文件.一旦符号文件加载完毕以后,就可以进行调试了,例如设置断点,查看堆栈信息等等. 因为是刚刚启动程序(mai ...
- Windbg教程-调试非托管程序的基本命令上
Windbg是跟visual studio差不多的一个调试器,可以用来调试非托管程序(native application),也可以调试托管程序(managed application).它比VS强的 ...
- 托管程序与非托管程序的区别
原始地址:http://www.cnblogs.com/springcsc/archive/2008/12/25/1362515.html 一般一个可执行文件的内部都包含一个PE头,系统根据PE的信息 ...
- 斗地主你什么时候才会托管?(.NET中的托管于非托管)
文章部分引自<.NET4.0面向对象编程漫谈(基础篇)>第1章.NET面向对象编程基础(作者:金旭亮) 无意间看到一位四五岁左右小朋友在玩斗地主,总开始到结束,她一直都在使用"提 ...
- 浅析托管与非托管C++代码(转)
随着Visual Studio .NET 2003在四月24号的发布,许多开发者开始考虑使用一项被成为托管代码的新技术.但是对于C++开发者来说,可以会遇到一些麻烦.因为C++是比较特殊的. 什么是托 ...
- 托管代码与非托管代码之间与托管程序
自.Net问世以后,我们习惯的VC++,VB编程模式有了很大的变换,托管与非托管的概念也不断映入程序员们的眼帘,可以说.NET正逐步成为编程的主流语言和平台之一.今天不与大家讨论谁主沉浮,也不发表慷慨 ...
- 浅析托管与非托管C++代码
随着Visual Studio .NET 2003在四月24号的发布,许多开发者开始考虑使用一项被成为托管 代码 的新技术.但是对于C++开发者来说,可以会 遇到一些麻烦.因为C++是比较特殊的. 什 ...
- 编写高质量代码改善C#程序的157个建议——建议50:在Dispose模式中应区别对待托管资源和非托管资源...
建议50:在Dispose模式中应区别对待托管资源和非托管资源 真正资源释放代码的那个虚方法是带一个bool参数的,带这个参数,是因为我们在资源释放时要区别对待托管资源和非托管资源. 提供给调用者调用 ...
最新文章
- Python爬虫开发:贴吧案例
- 关于“WARN: SQL Error: 1366, SQLState: HY000”错误的解决方案
- Delphi2CS破解 Delphi 转换C#
- Oracle中的包、存储过程、函数被锁定解决方案
- Cache【硬盘缓存工具类(包含内存缓存LruCache和磁盘缓存DiskLruCache)】
- Winform分页控件支持表头全选操作实现之最优方法
- 生成器模式(Builder)
- python线性链表
- 通配符 [概述][Java]
- win7系统盘瘦身四大招:
- Python Signal 信号
- 基于加密短信验证码的蓝牙智能锁设计
- A*/AStar规划算法(C++版本)
- Google Instant Apps
- 配置Discuz论坛教程
- TestDirector笔记
- android修改默认遥控器键值,RK3128平台android系统修改添加遥控器键值码值
- 【 文学欣赏 | 中英文对照 】Invictus 不可征服-曼德拉 【 不可征服的灵魂 】
- 银行客户业务系统(JAVA,JSP,SQLSERVER)
- pb调用精伦电子sdtapi.dll读卡函数的心得
热门文章
- Java整合rabbitmqFailed to declare queue:[springCloudBus.anonymous.iAletE1kTIC_khZhwMmfdA]
- 基于Revit三维地质建模
- 深入浅出学习透析Nginx服务器的基本原理和配置指南「负载均衡篇」
- iOS逆向 微信62数据介绍
- 小学三年级计算机基础知识教案,小学三年级信息技术教案画图.doc
- 围剿Viking、专杀工具的较量——继初遇Worm.Viking.dy
- Abaqus CAE在多物理模拟中的5个使用案例
- sklearn聚类算法之Kmeans
- 光伏、风电、储能并网仿真原理图
- tp6 实现佣金排行榜