非托管DLL调用.NETCOMDLL实现方法
2018-10-20张毅
张毅
Abstract: To complete the hardware driver call,writing a .NET COM DLL in C# language,writing an unmanaged DLL in Delphi,the unmanaged DLL calls the .NET DLL through the Windows COM interface. Based on the above, this article puts forward a complete solution.
引言
Windows COM(组件对象模型)提供了一种在不同应用程序和语言之间共享二进制代码的规范,通过COM接口,多个动态链接库(DLL)组件可以互相通讯。
Microsoft .NET Framework是用于Windows的新托管代码编程模型,.NET托管DLL代码模块从.Net FrameWork运行库中获得垃圾回收、类型检查、安全支持等服务。与托管DLL不同,非托管DLL是在运行库之外运行的代码模块,且必须自行构建服务。例如COM 组件、ActiveX 接口和 Win32 API 函數都是非托管代码的示例。
随着.Net FrameWork普及,很多硬件驱动程序采用C#开发成托管DLL供其它应用程序调用。本文以Delphi 7 为例,探讨Delphi 7 开发EXE应用程序调用C# 定制的COM DLL,再将EXE代码封装为Windows非托管DLL模块,实现非托管DLL通过COM接口调用.NET托管DLL的过程。
英国Solartron数字量传感器Orbit3,其底层驱动调用函数全部封装在名为OrbitLibrary.dll的动态链接库中,并与硬件驱动程序获得同步自动安装。该组件采用C#语言开发,支持平台为.Net FrameWork 4.0,通过VS2010和Delphi7编写程序能够实现对OrbitLibrary.dll的调用,从而满足硬件通讯要求。
本文研究采用的开发模式是混合编程。首先通过C# 2010调试EXE应用程序实现对OrbitLibrary.dll调用,当EXE调用驱动成功后,将EXE代码改写为.NET COM接口组件,并导出tlb文件。在Delphi 7中,通过引用方式在EXE中加载Windows COM组件,实现对OrbitLibrary.dll调用,调试成功再将Delphi EXE代码改写为Windows非托管DLL,而后转入非托管DLL通过COM接口调用.NET COM DLL的过程。该方法已在多个工程项目中得到成功应用。