C#調(diào)用EXE文件實(shí)現(xiàn)傳參和獲取返回結(jié)果
在項(xiàng)目開發(fā)的過程中,不可避免的遇到這種情況:主程序由于算法的第三方庫使用的目標(biāo)平臺(tái)需為X86的,但是在調(diào)用別家公司的程序或者是其他程序驅(qū)動(dòng)不能為X86的(使用x64或者Any cup的沒問題)。
我遇到的連接oracle數(shù)據(jù)庫報(bào)異常“嘗試加載Oracle客戶端庫時(shí)引BadImageFormatException。如果在安裝32位Oracle客戶端組件的情況下以64位模式運(yùn)行將出此問題”。這就不由的抱怨一句oracle數(shù)據(jù)庫真的是事多呀,一大堆的問題。
出現(xiàn)這種情況該怎么做呢,兩邊的平臺(tái)要求是不一樣的,不能修改。
第一種方法:使用其他的不用區(qū)分目標(biāo)平臺(tái)的庫進(jìn)行連接;
第二種方法:編寫一個(gè)exe程序,其對(duì)接的操作都在這個(gè)程序中實(shí)現(xiàn),并由主程序調(diào)用。
下面我們就來說一下第二種方法的實(shí)現(xiàn)。
1、新建一個(gè)“控制臺(tái)應(yīng)用程序”-- 在項(xiàng)目啟動(dòng)類文件Program中Main()函數(shù)中接收傳遞來的參數(shù);代碼如下:
public class Program
{
public static void Main(string[] args)
{
if(args.Length > 0 && !string.IsNullOrEmpty(args[0]))
{
string num = args[0];//獲取傳遞過來的參數(shù)
//DSCommuncationInfo 自定義的類;GetOracleData:連接Oracle數(shù)據(jù)庫和獲取數(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()無法啟動(dòng)exe程序的問題:
1、可能是參數(shù)不是絕對(duì)路徑,exe的路徑地址不正確。
2、如果在外部直接運(yùn)行exe程序沒有問題,而當(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)文章
automation服務(wù)器不能創(chuàng)建對(duì)象 解決方法
本文主要介紹如何解決“automation服務(wù)器不能創(chuàng)建對(duì)象”錯(cuò)誤,從而解決Visual Studio.Net不能正常使用的問題,需要的朋友可以參考下。2016-06-06
WPF自定義TreeView控件樣式實(shí)現(xiàn)QQ聯(lián)系人列表效果
TreeView控件在項(xiàng)目中使用比較頻繁,下面這篇文章主要給大家介紹了關(guān)于WPF自定義TreeView控件樣式實(shí)現(xiàn)QQ聯(lián)系人列表效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2018-04-04
C# double和decimal數(shù)據(jù)類型以截?cái)嗟姆绞奖A糁付ǖ男?shù)位數(shù)
從事ASP.NET in C#開發(fā)快一年了,今天才知道,C#中保留小數(shù)位數(shù)時(shí)沒有使用截?cái)嗟姆绞?/div> 2012-05-05
基于C#實(shí)現(xiàn)手機(jī)號(hào)碼歸屬地接口調(diào)用
這篇文章主要介紹了基于C#實(shí)現(xiàn)手機(jī)號(hào)碼歸屬地接口調(diào)用的相關(guān)資料,需要的朋友可以參考下2016-02-02
C#實(shí)現(xiàn)閃動(dòng)托盤圖標(biāo)效果的方法
這篇文章主要介紹了C#實(shí)現(xiàn)閃動(dòng)托盤圖標(biāo)效果的方法,涉及C# ImageList控件的使用技巧,需要的朋友可以參考下2016-06-06最新評(píng)論

