鄭州鐵路職業(yè)技術學院 軟件學院 李海勝 朱紋玉
.NET環(huán)境下C#與IDL集成開發(fā)方法研究
鄭州鐵路職業(yè)技術學院 軟件學院 李海勝 朱紋玉
目前,應用程序開發(fā)商有著眾多的編程語言可供選擇。這些編程語言面向不同的應用,并擁有不同的特點。綜合不同編程語言的特點,實現(xiàn)高效的應用程序開發(fā)是現(xiàn)代軟件開發(fā)的一個重要方向。C#是微軟公司為.NET環(huán)境精心設計并開發(fā)的下一代編程語言,它具有支持快速開發(fā),面向對象和組件等諸多優(yōu)點。C#語言可以很方便地利用Windows的系統(tǒng)資源以及.NET平臺提供的大量基礎類庫,通過C#能夠在.NET環(huán)境上快速開發(fā)出種類豐富的應用程序。C#語言與IDL(接口描過語言)的集成開發(fā)可以方便快捷地開發(fā)出功能強大的各種應用程序。IDL是集科學數(shù)據(jù)分析可視化表達與跨平臺應用開發(fā)等功能為一體的第4代可視化編程語言。它面向矩陣,可以對數(shù)組直接進行操作,具有快速分析超大規(guī)模數(shù)據(jù)庫的能力,速度相比C、C++也有很大的提高?;贑#語言與IDL的優(yōu)點,本文,筆者介紹了在C#語言中調用IDL進行應用程序開發(fā)的4種方式。
1..NET環(huán)境。.NET環(huán)境是微軟公司最近推出的一個全新概念,它支持下一代Internet可編程結構。.NET是一個革命性的新平臺,它建立在開放的Internet協(xié)議之上,采用了許多新的工具和服務。簡而言之,.NET環(huán)境是1種面向網(wǎng)絡度支持各種用戶終端的開發(fā)平臺環(huán)境。C#語言是微軟公司于2000年7月發(fā)布的一款專門為.NET環(huán)境而開發(fā)的編程語言。作為.NET環(huán)境的通用開發(fā)語言,它能夠建造所有的.NET應用。它是一個高效、安全和靈活的現(xiàn)代化程序設計語言?;贑#語言上述優(yōu)點,本文,筆者選擇C#語言作為.NET的開發(fā)語言。.NET環(huán)境采用統(tǒng)一的集成開發(fā)環(huán)境Visual Studio,本文,筆者的開發(fā)環(huán)境即為Visual Studio2005。在進行.NET應用程序開發(fā)時,可以方便地引用他人提供的外部程序集。從而,可以方便地實現(xiàn)程序的調用。
2.IDL。IDL是美國ITT公司推出的一種可視化語言,它具有較強的數(shù)據(jù)分析和可視化能力。在IDL語言中往往只需要幾條語句就能執(zhí)行大量、復雜的數(shù)據(jù)處理或者實現(xiàn)二維、三維圖形的繪制,而這在其他語言中需要上百條語句才能實現(xiàn)。通過IDL鏈接外部程序、或者將IDL作為其他語言的外部程序或圖形引擎,IDL可以成為現(xiàn)有開發(fā)工具強有力的補充。在應用程序開發(fā)中實現(xiàn)IDL與其他語言的相互調用,使得語言之間可以得到優(yōu)勢互補,從而大大加快程序的開發(fā)進程。此外,IDL還可以方便地調用ENVI函數(shù),實現(xiàn)復雜的圖像處理功能,大大節(jié)省了系統(tǒng)的開發(fā)時間。
1.圖形顯示模式。IDLDrawWidget(只用于Windows平臺)是IDL提供的可被嵌套在任何ActiveX語言控件的程序。IDLDrawWidget提供了其他語言調用IDL語言的機制。.NET環(huán)境支持新的組件標準Assembly,Assembly兼容ActiveX的機制,可以通過封裝ActiveX來實現(xiàn)。基于這種機制,就使得在.NET環(huán)境中集成IDL成為可能。在這里,需要注意的是,IDLDrawWidget在IDL6.4以后的版本中已經被ITT公司所放棄,并不再更新,所以一些新的IDL功能在IDLDrawWidget將無法調用。調用的方法:首先,在應用程序添加IDLDrawWidget。其次,初始化IDLDrawWidget。最后,通過IDLDrawWidget調用IDL。具體程序如下:
IDLdw.IdlPath="C∶\ITT\IDL71\bin\bin.x86";
int n=IDLdw.InitIDL((int)Handle);
if(n==0)return;IDLdw.Retain=2;
IDLdw.GraphicsLevel=2;
int drawWidget=IDLdw.CreateDrawWidget();
if(drawWidget<0) return;
IDLdw.SetOutputWnd((int)logInfoText.Handle);
在IDLDrawWidget控件初始化完畢后,就可以利用ExecuteStr方法來執(zhí)行IDL命令了。IDL命令可以是IDL語句也可以是IDL代碼文件或者是已經編譯好的.SAV文件。具體程序如下:
IDL dw.Execute Str(".Compile T1.pro");
IDLdw.ExecuteStr("T1");
IDLdw.ExecuteStr("restore,T1.sav");
IDL與C#之間的數(shù)據(jù)通信是系統(tǒng)開發(fā)的關鍵。IDLDrawWidget提供了IDL與外部應用環(huán)境之間的數(shù)據(jù)傳輸機制,使得IDL與外部程序之間的數(shù)據(jù)傳輸變得十分簡單。IDLDrawWidget與C#數(shù)據(jù)傳遞方式如下所示:首先,通過SetNamedData在C#下進行IDL中變量的創(chuàng)建。GetNamedData在C#下進行IDL變量讀取的具體程序如下:
int v1=100;
IDLdw.SetNamedData("v1",v1.ToString());
string v2=(string)IDLdw.GetNamedData("v1");
其次,通過SetNamedArray在C#語言中進行IDL中變量數(shù)組的創(chuàng)建,通過CopyNamedArray在C#語言進行IDL中變量數(shù)組的讀取。具體程序如下所示:
int a1={1,2};
IDLdw.SetNamedArray("a1",a1,true);
int a2=(int)IDLdw.CopyNamedArray("a1");
最后,使用ExecuteStr方法執(zhí)行命令行,同時傳遞數(shù)據(jù)。具體程序如下:
int v1=100;
IDLdw.SetNamedData("v1",v1);
IDLdw.ExecuteStr(".compile SNF.pro");
IDLdw.ExecuteStr("total=sumNumFun(v1=v1)");
int dd=(int)IDLdw.GetNamedData("total");
在.NET環(huán)境中,IDLDrawWidget通過“自動事件”屬性獨占IDLDrawWidget所產生的事件。此時,C#語言無法獲取IDLDrawWidget上所產生的事件。IDLDrawWidget的“自動事件”屬性包括OnInit、OnExpose、OnButtonPress等內容。若需IDLDrawWidget響應事件時,需指定“自動事件”屬性的IDL過程或函數(shù)。若需要C#語言對事件做出響應,可通過設置IDLDrawWidget的RegisterForEvents方法來屏蔽IDLDrawWidget的“自動事件”屬性,IDLDrawWidget便可在其控件區(qū)域響應.NET的標準事件,如Mouse Up、Mouse Down和Mouse Move等件。
2.功能調用模式。若系統(tǒng)開發(fā)無需IDLDrawWidget程序提供的可視化窗口,C#語言可直接使用IDL提供的COM組件IDLDRAW3Lib來調用IDL。COM組件是微軟公司為了計算機工業(yè)的軟件生產更加符合人類行為方式而開發(fā)的一種軟件開發(fā)技術。在COM組件下,人們可以開發(fā)出各種各樣且功能專一的組件,然后將它們按照需要組合起來,構成復雜的應用系統(tǒng)。IDLDRAW3Lib組件的用法與圖形顯示模式基本相同:首先,在應用程序中添加IDLDRAW3Lib組件。其次,初始化IDLDRAW3Lib組件。最后,通過IDLDRAW3Lib組件調用IDL功能。IDLDRAW3Lib組件的數(shù)據(jù)傳遞方式與IDLDrawWidget程序的傳遞方法相同,在此就不再贅述了。
3.COM_IDL_Connect組件。COM_IDL_Connect組件是IDL提供的另一種COM組件。COM_IDL_Connect組件提供了對ENVI/IDL現(xiàn)有功能調用的支持。COM_IDL_Connect組件的數(shù)據(jù)傳遞方式與IDLDRAW3Lib的數(shù)據(jù)傳遞方式相似。COM_IDL_Connect組件的用法亦與IDLDRAW3Lib的圖形顯示模式相同。首先,在應用程序中添加COM_IDL_Connect組件。其次,初始化COM_IDL_Connect組件。最后,通過COM_IDL_Connect組件調用IDL功能。
4.輸出COM組件。IDL是1個COM組件,利用COM技術可以將IDL圖形功能嵌入到C#、VB、VC等編寫的Window程序中。借助IDL的對象輸出向導功能可以在其他軟件程序中很容易地使用IDL的可視化和分析功能,且無需進行跨平臺整合所需的編程工作。IDL對象輸出向導可輸出對象、方法和參數(shù),然后自動包裝指定的IDL對象,它可以很容易地將其導入到本地COM客戶端應用程序,縮短了接口開發(fā)的時間。使用IDL輸出向導導出COM的步驟如下:
(1)定義IDL對象并將類定義文件的路徑添加到IDL路徑中。
(2)將C#語言編譯器路徑添加到電腦環(huán)境變量path中。
(3)將類定義文件加載到輸出向導中,并選擇工程類型為“輸出COM”。
(4)設置輸出對象的參數(shù)、過程與函數(shù)。
(5)編譯輸出對象。
(6)生成*.DLL和*.TLB文件。
(7)在CMD環(huán)境中使用regsvr32對*.DLL文件進行注冊。
.DLL文件的用法與COM_IDL_Connect組件相似。首先,在應用程序中添加已輸出的COM組件。其次,初始化COM組件。最后,通過COM組件調用IDL。具體程序如下所示:
sumnumsClassplusNum=new sumnumsClass();
plusNum.CreateObject(0,0,0);
float total=plusNum.FuncADD(33,56);
圖形顯示模式和功能調用模式形象直觀,調用過程簡單,方便程序調試。而輸出COM組件模式則需編寫IDL對象,打包輸出COM組件,并在.NET環(huán)境下調用COM組件。在.NET環(huán)境下調用COM出錯時,需不斷重復上述整個過程從而導致程序調試過程繁瑣,提高了程序的開發(fā)難度。圖形顯示模式與輸出COM組件模式可以在.NET環(huán)境下創(chuàng)建IDL的DRAW顯示組件,在實現(xiàn)可視化的同時也提供了ENVI/IDL的功能調用。但功能調用模式只提供了ENVI/IDL的功能調用,并未提供可視化組件的調用。
本文,筆者采用IDLdrawWidget程序來實現(xiàn)圖像3D顯示、波譜曲線瀏覽建庫、蝕變礦物信息提取等功能,快速地完成了ImageInfor系統(tǒng)的開發(fā)工作。ImageInfor程序主界面如圖1所示。
本文,筆者總結介紹了.NET環(huán)境下C#語言與IDL相結合的4種開發(fā)方式。這些開發(fā)方式綜合了C#與IDL的優(yōu)點。C#語言支持快速開發(fā),其GUI(圖形用戶界面)設計方便且IDL數(shù)據(jù)分析功能強大。此外,IDL借助ENVI的二次開發(fā)函數(shù)庫可以實現(xiàn)更為強大的圖像處理功能。綜合利用編程語言的這些優(yōu)點,實現(xiàn)不同語言的集成開發(fā)在一定程度上加快了應用程序的開發(fā)速度,但是集成開發(fā)需要編程人員對不同語言都要具有一定深度的理解,這使得集成開發(fā)具有較大的技術難度。