C#調(diào)用EXE文件實(shí)現(xiàn)傳參和獲取返回結(jié)果
在項(xiàng)目開發(fā)的過(guò)程中,不可避免的遇到這種情況:主程序由于算法的第三方庫(kù)使用的目標(biāo)平臺(tái)需為X86的,但是在調(diào)用別家公司的程序或者是其他程序驅(qū)動(dòng)不能為X86的(使用x64或者Any cup的沒(méi)問(wèn)題)。
我遇到的連接oracle數(shù)據(jù)庫(kù)報(bào)異常“嘗試加載Oracle客戶端庫(kù)時(shí)引BadImageFormatException。如果在安裝32位Oracle客戶端組件的情況下以64位模式運(yùn)行將出此問(wèn)題”。這就不由的抱怨一句oracle數(shù)據(jù)庫(kù)真的是事多呀,一大堆的問(wèn)題。
出現(xiàn)這種情況該怎么做呢,兩邊的平臺(tái)要求是不一樣的,不能修改。
第一種方法:使用其他的不用區(qū)分目標(biāo)平臺(tái)的庫(kù)進(jìn)行連接;
第二種方法:編寫一個(gè)exe程序,其對(duì)接的操作都在這個(gè)程序中實(shí)現(xiàn),并由主程序調(diào)用。
下面我們就來(lái)說(shuō)一下第二種方法的實(shí)現(xiàn)。
1、新建一個(gè)“控制臺(tái)應(yīng)用程序”-- 在項(xiàng)目啟動(dòng)類文件Program中Main()函數(shù)中接收傳遞來(lái)的參數(shù);代碼如下:
public class Program { public static void Main(string[] args) { if(args.Length > 0 && !string.IsNullOrEmpty(args[0])) { string num = args[0];//獲取傳遞過(guò)來(lái)的參數(shù) //DSCommuncationInfo 自定義的類;GetOracleData:連接Oracle數(shù)據(jù)庫(kù)和獲取數(shù)據(jù)函數(shù) DSCommuncationInfo info = GetOracleData(num); if (info != null) { //序列化成字符串?dāng)?shù)組 string result = SerializedXMLHelper.Serializer(info); //將指定的字符串值(后跟當(dāng)前行終止符)寫入標(biāo)準(zhǔn)輸出流。 Console.WriteLine(result); } } } }
2、主程序調(diào)用exe時(shí),使用進(jìn)程的方式把exe啟動(dòng),調(diào)用代碼如下:
public void StartExternalProgram(string examinerNo) { //這里在dll程序中調(diào)用exe,路徑是獲取dll所在路徑 string exePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string exeName = "CterHisExe.exe"; string fileName = Path.Combine(exePath, exeName); //使用進(jìn)程 Process myProcess = new Process(); myProcess.StartInfo.UseShellExecute = false; myProcess.StartInfo.RedirectStandardOutput = true; myProcess.StartInfo.FileName = fileName; myProcess.StartInfo.CreateNoWindow = true; //傳參,參數(shù)以空格分隔,如果某個(gè)參數(shù)為空,可以傳入“” myProcess.StartInfo.Arguments = examinerNo; p.StartInfo.WorkingDirectory = exePath;//設(shè)置要啟動(dòng)的進(jìn)程的初始目錄 myProcess.Start();//啟動(dòng) myProcess.WaitForExit(15000);//等待exe程序處理完,超時(shí)15秒 string xmldata = myProcess.StandardOutput.ReadToEnd();//讀取exe中內(nèi)存流數(shù)據(jù) if (!string.IsNullOrEmpty(xmldata)) { //自己實(shí)現(xiàn)的序列化 var info = SerializedXMLHelper.Deserializer(xmldata); } }
雖然這種方法比較復(fù)雜,但是也是解決平臺(tái)不兼容的可行方法之一。
Process.Start()無(wú)法啟動(dòng)exe程序的問(wèn)題:
1、可能是參數(shù)不是絕對(duì)路徑,exe的路徑地址不正確。
2、如果在外部直接運(yùn)行exe程序沒(méi)有問(wèn)題,而當(dāng)這個(gè)程序中有配置文件,或在啟動(dòng)的時(shí)候需要讀取其他文件時(shí),需要設(shè)置StartInfo的WorkingDirectory屬性為應(yīng)用程序的目錄。
到此這篇關(guān)于C#調(diào)用EXE文件實(shí)現(xiàn)傳參和獲取返回結(jié)果的文章就介紹到這了,更多相關(guān)C#調(diào)用EXE文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于C#編寫經(jīng)理評(píng)分系統(tǒng)
最近接了這樣一個(gè)項(xiàng)目,要求使用c#編寫經(jīng)理評(píng)分系統(tǒng),需求,要顯示員工信息,實(shí)現(xiàn)項(xiàng)目經(jīng)理給員工評(píng)分功能,今天小編分步驟給大家介紹,需要的的朋友參考下2017-03-03簡(jiǎn)述C#枚舉高級(jí)戰(zhàn)術(shù)
這篇文章主要介紹了簡(jiǎn)述C#枚舉高級(jí)戰(zhàn)術(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10C#面向?qū)ο缶幊讨幸蕾嚪崔D(zhuǎn)原則的示例詳解
在面向?qū)ο缶幊讨?,SOLID?是五個(gè)設(shè)計(jì)原則的首字母縮寫,旨在使軟件設(shè)計(jì)更易于理解、靈活和可維護(hù)。本文將通過(guò)實(shí)例詳細(xì)講講C#面向?qū)ο缶幊讨幸蕾嚪崔D(zhuǎn)原則,需要的可以參考一下2022-07-07C#實(shí)現(xiàn)Winform小數(shù)字鍵盤模擬器
本文主要介紹了C#實(shí)現(xiàn)Winform小數(shù)字鍵盤模擬器,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11C#后臺(tái)調(diào)用WebApi接口的實(shí)現(xiàn)方法
本文主要介紹了C#后臺(tái)調(diào)用WebApi接口的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06