开发过程中我们或多或少都要使用到非托管组件,例如常见的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使用非托管程序相关推荐

  1. Windbg 教程-调试非托管程序的基本命令下

    前面的文章调试非托管程序的基本命令中讲到如何使用windbg在程序中设置断点,既然断点已经设置好了,下一步就是直接执行程序,程序中断以后,第一件事情就是查看堆栈.在windbg中查看堆栈使用k命令就可 ...

  2. Windbg教程-调试非托管程序的基本命令中

    前面的文章调试非托管程序的基本命令上讲到如何在windbg里面启动一个程序并且加载调试符号文件.一旦符号文件加载完毕以后,就可以进行调试了,例如设置断点,查看堆栈信息等等. 因为是刚刚启动程序(mai ...

  3. Windbg教程-调试非托管程序的基本命令上

    Windbg是跟visual studio差不多的一个调试器,可以用来调试非托管程序(native application),也可以调试托管程序(managed application).它比VS强的 ...

  4. 托管程序与非托管程序的区别

    原始地址:http://www.cnblogs.com/springcsc/archive/2008/12/25/1362515.html 一般一个可执行文件的内部都包含一个PE头,系统根据PE的信息 ...

  5. 斗地主你什么时候才会托管?(.NET中的托管于非托管)

    文章部分引自<.NET4.0面向对象编程漫谈(基础篇)>第1章.NET面向对象编程基础(作者:金旭亮) 无意间看到一位四五岁左右小朋友在玩斗地主,总开始到结束,她一直都在使用"提 ...

  6. 浅析托管与非托管C++代码(转)

    随着Visual Studio .NET 2003在四月24号的发布,许多开发者开始考虑使用一项被成为托管代码的新技术.但是对于C++开发者来说,可以会遇到一些麻烦.因为C++是比较特殊的. 什么是托 ...

  7. 托管代码与非托管代码之间与托管程序

    自.Net问世以后,我们习惯的VC++,VB编程模式有了很大的变换,托管与非托管的概念也不断映入程序员们的眼帘,可以说.NET正逐步成为编程的主流语言和平台之一.今天不与大家讨论谁主沉浮,也不发表慷慨 ...

  8. 浅析托管与非托管C++代码

    随着Visual Studio .NET 2003在四月24号的发布,许多开发者开始考虑使用一项被成为托管 代码 的新技术.但是对于C++开发者来说,可以会 遇到一些麻烦.因为C++是比较特殊的. 什 ...

  9. 编写高质量代码改善C#程序的157个建议——建议50:在Dispose模式中应区别对待托管资源和非托管资源...

    建议50:在Dispose模式中应区别对待托管资源和非托管资源 真正资源释放代码的那个虚方法是带一个bool参数的,带这个参数,是因为我们在资源释放时要区别对待托管资源和非托管资源. 提供给调用者调用 ...

最新文章

  1. Python爬虫开发:贴吧案例
  2. 关于“WARN: SQL Error: 1366, SQLState: HY000”错误的解决方案
  3. Delphi2CS破解 Delphi 转换C#
  4. Oracle中的包、存储过程、函数被锁定解决方案
  5. Cache【硬盘缓存工具类(包含内存缓存LruCache和磁盘缓存DiskLruCache)】
  6. Winform分页控件支持表头全选操作实现之最优方法
  7. 生成器模式(Builder)
  8. python线性链表
  9. 通配符 [概述][Java]
  10. win7系统盘瘦身四大招:
  11. Python Signal 信号
  12. 基于加密短信验证码的蓝牙智能锁设计
  13. A*/AStar规划算法(C++版本)
  14. Google Instant Apps
  15. 配置Discuz论坛教程
  16. TestDirector笔记
  17. android修改默认遥控器键值,RK3128平台android系统修改添加遥控器键值码值
  18. 【 文学欣赏 | 中英文对照 】Invictus 不可征服-曼德拉 【 不可征服的灵魂 】
  19. 银行客户业务系统(JAVA,JSP,SQLSERVER)
  20. pb调用精伦电子sdtapi.dll读卡函数的心得

热门文章

  1. Java整合rabbitmqFailed to declare queue:[springCloudBus.anonymous.iAletE1kTIC_khZhwMmfdA]
  2. 基于Revit三维地质建模
  3. 深入浅出学习透析Nginx服务器的基本原理和配置指南「负载均衡篇」
  4. iOS逆向 微信62数据介绍
  5. 小学三年级计算机基础知识教案,小学三年级信息技术教案画图.doc
  6. 围剿Viking、专杀工具的较量——继初遇Worm.Viking.dy
  7. Abaqus CAE在多物理模拟中的5个使用案例
  8. sklearn聚类算法之Kmeans
  9. 光伏、风电、储能并网仿真原理图
  10. tp6 实现佣金排行榜