none
Process.Start ( invalidoperationexception) RRS feed

  • 問題

  • 前輩好

    目前使用WebForm開發時使用Process.Start遇到了invalidoperationexception 

    以下是我的程式碼:

    try {

      ProcessStartInfo procStartIfo = new ProcessStartInfo();
                    procStartIfo.FileName = @"C:\tmp\DemoSeal.exe";

                    procStartIfo.Arguments = @"C:\ImageTest\srcimage\test1\A1.jpg C:\ImageTest\srcimage\test1\B1.bmp r";
                    procStartIfo.UseShellExecute = false;
                    procStartIfo.CreateNoWindow = false;
                    procStartIfo.RedirectStandardOutput = true;

                    var process = new Process();

                    process.StartInfo = procStartIfo;
                    process.Start();
                    process.WaitForExit();

    } catch (Exception ex) { this.WriteLog("DemoCompare.OpenSealComparisonProcess.Exception:" + ex.InnerException); this.WriteLog("DemoCompare.OpenSealComparisonProcess.Exception:" + ex.Message); }

    procStartIfo.Arguments 我也有+過 - ,例如

    procStartIfo.Arguments = @"-C:\ImageTest\srcimage\test1\A1.jpg -C:\ImageTest\srcimage\test1\B1.bmp -r";

    但是還是會跳出invalidoperationexception

    invalidoperationexception 並不是在Exception產生出的,

    而是點下按鈕時,會跳出Visual Studio Just In Time偵錯工具上面寫的

    另外此參數我有用過WinForm開,是可以成功的

    資料夾的權限我也有開到最大,也有在IIS設定權限

    並且啟動32位元應用程式有設為true

    不知道是哪裡有問題..

    還希望前輩能指點方向,謝謝

    2018年1月19日 上午 01:28

解答

  • 你這是 ASP.NET Web Form 沒錯吧?

    如果是的話:

    (1) 即時啟動成功, 它也是啟動 IIS (也就是伺服器端) 所在的 "C:\tmp\DemoSeal.exe" . 如果你的目的是要啟動瀏覽器端的程式,那這招是沒效的。

    (2) 假設你要啟動的是 IIS 端好了, Windows 系統在啟動 IIS 的帳號權限在預設的狀況下,跟你登入 Windows 時的帳號是不一樣的,而且預設這個帳號的權限很受限;也就是說在沒有任何更動的狀況下,啟動 IIS 的這個帳號應該是看不到  "C:\tmp\DemoSeal.exe" 的。既然看不到,執行不了很正常。

    (3) 其中一種解法是在 ProcessStartInfo 內加入對該執行檔與目錄有權限的帳號密碼,比方你可以設定一個使用者可以存取這個目錄,然後加入到 ProcessStartInfo 中;關於這個,請參考以下兩個屬性。

    ProcessStartInfo.UserName 屬性
    ProcessStartInfo.Password 屬性

    我沒有實際測試,不過建議你可以這麼試試看。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2018年1月20日 下午 05:37
    版主

所有回覆

  • 在網頁程式中呼叫Process.Start顯示圖片 加上RedirectStandardOutput , 又WaitForExit, 這樣很怪, 為什麼不直接顯示在網頁, 或是Response.Write圖片內容就好
    2018年1月19日 上午 06:09
  • 前輩好,

    RedirectStandardOutput 已經拿掉了

    至於 WaitForExit 我是想等我開啟的應用程式執行完以後,再讓主程式往下跑

    不知道是不是我理解錯了

    為什麼不直接顯示在網頁, 或是Response.Write圖片內容就好

    我的目的是想要透過2張圖的路徑當參數,透過Process.Start開啟應用程式(WinForm),

    這隻應用程式會比較A圖和B圖的差異,我不是單純的想顯示圖。

    是我的寫法有問題讓前輩誤會了,我會更努力去了解這些功能的用法,謝謝。

    2018年1月19日 上午 10:09
  • 你用 ASP.NET 跑的時候,有試過將 web.config 設定帳號,用你 WinForm 能跑的帳號跑嗎?

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2018年1月19日 下午 12:06
  • 如果要比較兩張圖, 直接製作Windows Form專案即可, Web Form專案是網頁, 使用者瀏覽網頁, 就算能啟動圖片進行比較, 使用者也看不到, 因為圖片會顯示在Server端
    2018年1月20日 上午 12:48
  • 前輩好,不是很懂您的意思

    想開啟的那隻WinForm那隻程式(怕混淆,這邊稱為ImageCompareProgram)並不用輸入帳號密碼,可以直接開啟


    我之前是透過Asp.Net開啟不了ImageCompareProgram後,

    寫了一隻WinForm測試程式,去開啟 ImageCompareProgram,帶相同的參數卻可以正常開啟,

    因此很納悶是不是我權限或是什麼沒有修改

    2018年1月20日 下午 02:12
  • 前輩好,可能沒辦法改用Windows Form去開發 QQ

    因為那是公司網頁的其中一個功能,

    我只是個工作經驗不到一年的菜鳥RD,所以也不太可能說服PM去跟客戶說此功能要額外透過Windows Form程式去完成..

    目前有讓使用者點選"比較按鈕" 後 將兩張圖由Server端下載至Client端

    所以使用者電腦上兩張圖都會有,我也能知道路徑

    接下來會呼叫使用者電腦上的那隻WinForm(圖片比較程式),將2張圖片的路徑參數帶進去,

    使用者就可以於 WinForm(圖片比較程式) 中看到比較結果

    如果有其他方法,我願意花時間去研究

    非常謝謝前輩

    2018年1月20日 下午 02:26
  • 你這是 ASP.NET Web Form 沒錯吧?

    如果是的話:

    (1) 即時啟動成功, 它也是啟動 IIS (也就是伺服器端) 所在的 "C:\tmp\DemoSeal.exe" . 如果你的目的是要啟動瀏覽器端的程式,那這招是沒效的。

    (2) 假設你要啟動的是 IIS 端好了, Windows 系統在啟動 IIS 的帳號權限在預設的狀況下,跟你登入 Windows 時的帳號是不一樣的,而且預設這個帳號的權限很受限;也就是說在沒有任何更動的狀況下,啟動 IIS 的這個帳號應該是看不到  "C:\tmp\DemoSeal.exe" 的。既然看不到,執行不了很正常。

    (3) 其中一種解法是在 ProcessStartInfo 內加入對該執行檔與目錄有權限的帳號密碼,比方你可以設定一個使用者可以存取這個目錄,然後加入到 ProcessStartInfo 中;關於這個,請參考以下兩個屬性。

    ProcessStartInfo.UserName 屬性
    ProcessStartInfo.Password 屬性

    我沒有實際測試,不過建議你可以這麼試試看。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2018年1月20日 下午 05:37
    版主
  • 如果是WebForm網頁想要比較兩張圖片是否相同, 可以參考這個範例的做法:

    Compare two Images in Asp.Net

    2018年1月21日 上午 12:51
  • WaitForExit() 如果程式跑太久會讓 ASP.NET 時間 timeout 一樣沒用。

    最好的方法就是用一個 queue + 類似 SignalR (因為 Web Form 沒有) 的 long polling 機制去偵測工作已完成沒 (當然這個 long polling 是用 ajax 寫)。

    一樣,如果你是要啟動 "用戶端" 的程式,基本上無解。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2018年1月21日 上午 12:52
    版主
  • 前輩您好,

    我覺得我應該是狀況1

    (3)的部分昨晚有照建議試過了,雖然不會跳出Just In Time偵錯工具,但也不會有後續動作,程式就這樣繼續跑完結束了

    有設定 ProcessStartInfo.WorkingDirectory

    這部分會跟PM討論該怎麼做比較好,

    之後如果有解,會把解決方法PO上來分享的,謝謝前輩

    2018年1月22日 上午 02:18
  • To this前輩

    這支程式帶入的圖是兩張不同的圖,

    主要是要判斷這兩張圖的某項物品是否可能為相同的物品,

    還有部分客製的部分,

    這問題會先跟PM討論該如何做比較好了,謝謝前輩

    2018年1月22日 上午 02:29
  • To 小朱前輩

    受教了,我會去試著實作測試您說的方法

    開用戶端程式這部分,會跟PM討論該怎麼用別的方法解決。

    謝謝前輩們


    2018年1月22日 上午 02:52
  • 你執行的時候沒看到畫面彈出來對吧?

    這有可能是 session isolate 的原因,因為目前的 session 不是該 user session,

    所以你要觀察有沒有執行要開 "工作管理員" ,看看該程序有沒有出現在工作管理員。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2018年1月22日 上午 05:10
    版主
  • To Bill前輩

    開啟工作管理員後,也沒有看到程式在執行

    不論是應用程式或處理程序中都沒有

    用Debug模式跑,很順的跑完沒發生任何事情

    UserName,Password,WorkingDirectory 應該是沒設錯

    因為故意設錯會有Exception,

    非常感謝前輩的幫忙

    2018年1月22日 上午 11:42
  • 作完成

    上來分享一下做法

    1. 我先透過advanced installer將Winform程式變成安裝檔,安裝路徑不讓User選擇,為固定位置

    2. 透過advanced installer設定機碼(機碼的設定網路上有教學)

    3. 完成上面設定以後,就可以像打網頁一樣打機碼上的名稱,而機碼因為有設定程式路徑 

    4. 成功呼叫!

    原理其實我也不是很清楚,但透過此方法完成了使用aspx.net開啟了安裝於Client端的Winform程式

    2018年3月2日 上午 12:39
  • 你用的可能是這個方法:

    https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa767914(v%3dvs.85)

    不過這個作法要注意安全性...


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2018年3月2日 下午 01:17
    版主