張毅



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的過程。該方法已在多個工程項目中得到成功應用。