2010-06-14 78 views
0

我正在研究一些具有自動更新功能的應用程序。實現的想法很簡單,如下所示:
- 有一些「啓動器」應用程序安裝到「Program Files/whatever/...」。這是打算由用戶啓動的應用程序。
- 每次執行「啓動器」應用程序時,它都會檢查服務器的更新並將其下載到「%APPDATA%/ some/...」。然後它從該文件夾啓動一些應用程序。如何診斷和修復dotnet應用程序的這種「現場」崩潰?

上述方法正在我的開發機器(運行Vista)和XP下的其他一些機器上工作,但在一些不同的機器(運行Windows 7)下它不工作。當「啓動器」執行真正的應用程序時,它會崩潰並出現一些未知問題(Signature = System.UnauthorizedAccess)。當從%APPDATA%/ some /文件夾手動執行實際應用程序時,一切工作正常。我試圖在ProcessStartInfo中設置相同的工作目錄,因此「starter」也會在該文件夾中執行真正的應用程序,但這對我沒有幫助。

如何診斷和/或解決該問題?

更新
更多關於如何我運行的主進程的詳細信息,從首發:

 private static readonly string _ROOT = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "MyApp"); 
... 
     private static void Run() 
     { 
      string startPath = Path.Combine(_ROOT, "MyApp.exe"); 
      ProcessStartInfo startInfo = new ProcessStartInfo(); 
      startInfo.FileName = startPath; 
      startInfo.WorkingDirectory = _ROOT; 
      Process.Start(startPath); 
     } 

這無疑啓動了正確的過程,因爲應用程序窗口中可以看到,但有些磁盤或網絡操作可能被Windows拒絕並且啓動過程崩潰。
更新
該跟蹤顯示工作目錄不正確,並指出我的代碼中不正確的Process.Start(字符串)方法調用。正確的行:

Process.Start(startInfo); 
+0

創建與有限的權限你的盒子另一個帳戶。查看當權限有限的帳戶在Program Files中試圖搞砸時會發生什麼情況。 – overslacked 2010-06-14 19:28:34

回答

2

至於你的問題,我認爲崩潰是來自缺少資源或依賴項或其權限問題。您是否嘗試過使用管理員權限運行應用程序?一般來說,自Xp以來,Windows的每個版本都受到越來越多的限制,而.NET運行時尤其如此。您是否依賴第三方庫或DLL?

至於診斷問題,假設您無法訪問遠程計算機上的調試器,最好的辦法就是充分使用System.Diagnostics.Trace。您可以從app.config配置跟蹤,並將跟蹤重定向到本地文件。另外請確保檢查事件查看器是否有任何應用程序級別的異常。

隨着時間和足夠的跟蹤語句,您應該快速找到問題。

啓用跟蹤與將以下內容添加到app.config中一樣簡單。

<system.diagnostics> 
    <trace autoflush="true" indentsize="3"> 
     <listeners> 
     <add name="fileOutListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\Path.to\File\debug.log" /> 
     </listeners> 
    </trace> 
    </system.diagnostics> 

然後在你的代碼添加:

System.Diagnostics.Trace.Writeline(System.DateTime.ToString() + " :: I am currently at XX location doing YY"); 
+0

可能是Trace.WriteLine? – okutane 2010-06-14 19:35:07

+0

Typo。哎呀。現在修復。 – Serapth 2010-06-14 19:49:55

+0

謝謝,跟蹤幫助了我。 – okutane 2010-06-14 20:32:28

2

Windows 7更改了一些應用程序數據位置和權限。確保在.Net中使用Environment類的「SpecialFolders」枚舉,而不是系統中的環境變量。

我也可能嘗試使用ClickOnce或其他預構建的更新系統,而不是滾動我自己的。這可能比第一眼看起來要難得多,而現在這個問題只是其中一個原因。

+0

不幸的是,由於客戶的意願決定不使用ClickOnce部署。我也更新了我的問題,詳細介紹了我如何運行這個過程。 – okutane 2010-06-14 19:33:13