張毅
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(組件對象模型)提供了一種在不同應(yīng)用程序和語言之間共享二進(jìn)制代碼的規(guī)范,通過COM接口,多個動態(tài)鏈接庫(DLL)組件可以互相通訊。
Microsoft .NET Framework是用于Windows的新托管代碼編程模型,.NET托管DLL代碼模塊從.Net FrameWork運(yùn)行庫中獲得垃圾回收、類型檢查、安全支持等服務(wù)。與托管DLL不同,非托管DLL是在運(yùn)行庫之外運(yùn)行的代碼模塊,且必須自行構(gòu)建服務(wù)。例如COM 組件、ActiveX 接口和 Win32 API 函數(shù)都是非托管代碼的示例。
隨著.Net FrameWork普及,很多硬件驅(qū)動程序采用C#開發(fā)成托管DLL供其它應(yīng)用程序調(diào)用。本文以Delphi 7 為例,探討Delphi 7 開發(fā)EXE應(yīng)用程序調(diào)用C# 定制的COM DLL,再將EXE代碼封裝為Windows非托管DLL模塊,實現(xiàn)非托管DLL通過COM接口調(diào)用.NET托管DLL的過程。
英國Solartron數(shù)字量傳感器Orbit3,其底層驅(qū)動調(diào)用函數(shù)全部封裝在名為OrbitLibrary.dll的動態(tài)鏈接庫中,并與硬件驅(qū)動程序獲得同步自動安裝。該組件采用C#語言開發(fā),支持平臺為.Net FrameWork 4.0,通過VS2010和Delphi7編寫程序能夠?qū)崿F(xiàn)對OrbitLibrary.dll的調(diào)用,從而滿足硬件通訊要求。
本文研究采用的開發(fā)模式是混合編程。首先通過C# 2010調(diào)試EXE應(yīng)用程序?qū)崿F(xiàn)對OrbitLibrary.dll調(diào)用,當(dāng)EXE調(diào)用驅(qū)動成功后,將EXE代碼改寫為.NET COM接口組件,并導(dǎo)出tlb文件。在Delphi 7中,通過引用方式在EXE中加載Windows COM組件,實現(xiàn)對OrbitLibrary.dll調(diào)用,調(diào)試成功再將Delphi EXE代碼改寫為Windows非托管DLL,而后轉(zhuǎn)入非托管DLL通過COM接口調(diào)用.NET COM DLL的過程。該方法已在多個工程項目中得到成功應(yīng)用。