2011年1月25日 星期二

asp.net_執行Server上的EXE執行檔

依照前篇的敘述,第二個要處理的問題是,如何利用asp.net呼叫Server上的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所在資料夾。

2 則留言:

大小寶 提到...

你好,想問一下,我在開始exe 之後,
exe 讀不到所需要的檔案,這是什麼原因呢.?
我在exe 裡面已經指定檔案名字
開檔的方法如下:
FILE *ptr;
ptr = fopen("./test.xml","r");
我是用c寫的,這個原因是什1呢.?
謝謝

ola的家 提到...

如果你在本機端可以正常以asp.net網頁呼叫EXE檔執行,但放到伺服器上出現錯誤,那就是權限的問題,asp.net執行時是使用asp.net的帳號去執行(IIS版本不同則帳號略有不同),所以要將權限加入該資料夾。

如果你在本機(localhost)以asp.net執行exe就無法抓到檔案,那應該先確認EXE本身是否可以正常運作。

c我不會,如果要判斷exe內有沒有問題,可能就沒辦法幫到你了。

張貼留言