http://www.dotblogs.com.tw/orozcohsu/archive/2011/04/15/22764.aspx
http://www.dotblogs.com.tw/orozcohsu/archive/2011/04/16/22825.aspx
http://dotnetmis91.blogspot.com/2011/04/aspnet-web.html
http://wangshifuola.blogspot.com/2011/01/aspnetserverexe.html
*****************************************************************************************************************
asp.net_執行Server上的EXE執行檔
依照前篇的敘述,第二個要處理的問題是,如何利用asp.net呼叫Server上的exe執行。
如果查網路資料,會查到很多一模一樣的文章,基本上有兩種方式:
1. 利用ShellExecute來處理。
引用:
宣告:
程式碼:
比較需要注意的地方是,如果你跟我一樣需要傳入參數,就在ShellExecute的第四個參數傳入;又如果傳入的參數是檔案路徑,就要看你所執行的EXE檔是怎麼抓的,像我必須傳入完整路徑,所以參數的部分採組合字串的方式。
2. 利用System.Diagnostics.Process來處理。
引用:
程式碼:
也是一樣注意傳入參數的部份,如果是檔案位置,請確認路徑是否正確。而在我的規劃中,我必須等待呼叫的執行檔將輸出檔產出後,才讀取新產出的輸出檔內容,再回傳到頁面上,所以另外一個需要注意的地方是最後的判斷式process.WaitForExit(1000*15),用處是:在process完成或15秒後往下執行,如果15秒還未執行完,則殺掉這個執行緒。
*在測試的時候,建議先在本機測試,可以正確執行後,在移至伺服器上。以確認出錯時到底是程式問題還是aspnet的權限問題。若權限問題,則將aspnet帳號加入EXE所在資料夾。
***************************************************************************************************************** 如果查網路資料,會查到很多一模一樣的文章,基本上有兩種方式:
1. 利用ShellExecute來處理。
引用:
using System.Runtime.InteropServices;
宣告:
[DllImport("shell32.dll")]
private static extern IntPtr ShellExecute(IntPtr hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, Int32 nShowCmd);
程式碼:
string Dir = page.Server.MapPath("~/");
string CmdStr = Dir + "geoidint.exe";
ShellExecute(IntPtr.Zero, "open", CmdStr, "-I" + Dir + "input.txt -G" + Dir + "output.txt", null, 1);
比較需要注意的地方是,如果你跟我一樣需要傳入參數,就在ShellExecute的第四個參數傳入;又如果傳入的參數是檔案路徑,就要看你所執行的EXE檔是怎麼抓的,像我必須傳入完整路徑,所以參數的部分採組合字串的方式。
2. 利用System.Diagnostics.Process來處理。
引用:
using System.Diagnostics;
程式碼:
Process process = new Process();
process.StartInfo.FileName = Dir + "geoidint.exe";
process.StartInfo.Arguments = "-I" + Dir + "input.txt -G" + Dir + "output.txt";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.CreateNoWindow = false;
process.Start();
if (!process.WaitForExit(1000*15))
{
process.Kill();
}
也是一樣注意傳入參數的部份,如果是檔案位置,請確認路徑是否正確。而在我的規劃中,我必須等待呼叫的執行檔將輸出檔產出後,才讀取新產出的輸出檔內容,再回傳到頁面上,所以另外一個需要注意的地方是最後的判斷式process.WaitForExit(1000*15),用處是:在process完成或15秒後往下執行,如果15秒還未執行完,則殺掉這個執行緒。
*在測試的時候,建議先在本機測試,可以正確執行後,在移至伺服器上。以確認出錯時到底是程式問題還是aspnet的權限問題。若權限問題,則將aspnet帳號加入EXE所在資料夾。
目的: 呼叫本機端 C:\PE_Excel\PE_Excel.exe 程式, 有兩種方法可以參考
第一: 利用同步模式, 也就是說, 一定要先執行完該程(PE_Excel.exe)式之後, 才能繼續其他的程式
System.Diagnostics.Process os = new System.Diagnostics.Process();
os.StartInfo.FileName = @"C:\PE_Excel\PE_Excel.exe";
os.Start();
os.WaitForExit();
os.Close();
os.StartInfo.FileName = @"C:\PE_Excel\PE_Excel.exe";
os.Start();
os.WaitForExit();
os.Close();
第二: 非同步模式, 也就是說, 不用等待該程式(PE_Excel.exe)執行完畢, 即繼續執行其他程式
Process.Start(@"C:\PE_Excel\PE_Excel.exe");
沒有留言:
張貼留言