日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C#調用EXE文件實現傳參和獲取返回結果_C#教程

作者:^@^lemon?tea^@^ ? 更新時間: 2023-02-18 編程語言

在項目開發的過程中,不可避免的遇到這種情況:主程序由于算法的第三方庫使用的目標平臺需為X86的,但是在調用別家公司的程序或者是其他程序驅動不能為X86的(使用x64或者Any cup的沒問題)。

我遇到的連接oracle數據庫報異常“嘗試加載Oracle客戶端庫時引BadImageFormatException。如果在安裝32位Oracle客戶端組件的情況下以64位模式運行將出此問題”。這就不由的抱怨一句oracle數據庫真的是事多呀,一大堆的問題。

出現這種情況該怎么做呢,兩邊的平臺要求是不一樣的,不能修改。

第一種方法:使用其他的不用區分目標平臺的庫進行連接;

第二種方法:編寫一個exe程序,其對接的操作都在這個程序中實現,并由主程序調用。

下面我們就來說一下第二種方法的實現。

1、新建一個“控制臺應用程序”-- 在項目啟動類文件Program中Main()函數中接收傳遞來的參數;代碼如下:

public class Program
{
    public static void Main(string[] args)
    {
        if(args.Length > 0 && !string.IsNullOrEmpty(args[0]))
        {
            string num = args[0];//獲取傳遞過來的參數
            //DSCommuncationInfo 自定義的類;GetOracleData:連接Oracle數據庫和獲取數據函數
            DSCommuncationInfo info = GetOracleData(num);
            if (info != null)
            {
                //序列化成字符串數組
                string result = SerializedXMLHelper.Serializer(info);
                //將指定的字符串值(后跟當前行終止符)寫入標準輸出流。
                Console.WriteLine(result);
            }
        }
    }
}

2、主程序調用exe時,使用進程的方式把exe啟動,調用代碼如下:

public void StartExternalProgram(string examinerNo)
{
    //這里在dll程序中調用exe,路徑是獲取dll所在路徑
    string exePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    string exeName = "CterHisExe.exe";
    string fileName = Path.Combine(exePath, exeName);
    //使用進程
    Process myProcess = new Process();
    myProcess.StartInfo.UseShellExecute = false;
    myProcess.StartInfo.RedirectStandardOutput = true;
    myProcess.StartInfo.FileName = fileName;
    myProcess.StartInfo.CreateNoWindow = true;
    //傳參,參數以空格分隔,如果某個參數為空,可以傳入“”
    myProcess.StartInfo.Arguments = examinerNo;
    p.StartInfo.WorkingDirectory = exePath;//設置要啟動的進程的初始目錄
    myProcess.Start();//啟動
    myProcess.WaitForExit(15000);//等待exe程序處理完,超時15秒
    string xmldata = myProcess.StandardOutput.ReadToEnd();//讀取exe中內存流數據
    if (!string.IsNullOrEmpty(xmldata))
    {
        //自己實現的序列化
        var info = SerializedXMLHelper.Deserializer(xmldata);
    }
}

雖然這種方法比較復雜,但是也是解決平臺不兼容的可行方法之一。

Process.Start()無法啟動exe程序的問題:

1、可能是參數不是絕對路徑,exe的路徑地址不正確。
2、如果在外部直接運行exe程序沒有問題,而當這個程序中有配置文件,或在啟動的時候需要讀取其他文件時,需要設置StartInfo的WorkingDirectory屬性為應用程序的目錄。

原文鏈接:https://blog.csdn.net/BYH371256/article/details/126314868

欄目分類
最近更新