我已經成功開發並部署了註冊關聯文件擴展名的ClickOnce應用程序,例如*.abc
。當我點擊名爲x.abc
的文件時,或者如果從命令提示符鍵入x.abc
,ClickOnce應用程序將啓動,並且可以通過專用API檢索文件。我還可以通過編程用下面的代碼啓動應用程序:ClickOnce應用程序不是通過Process.Start(「x.abc」)啓動的,並且* .abc與ClickOnce應用程序關聯
System.Diagnostics.Process.Start ("x.abc");
一切正常,在我的Windows Vista的鑽頭箱。但是,如果我嘗試在Windows 7(也是64 位)上執行完全相同的操作,則會出現一個非常奇怪的問題。這裏是我觀察到的:
- 手動啓動
x.abc
通過雙擊它從資源管理器工程。 - 手動啓動
x.abc
從命令提示符起作用。 Process.Start("x.abc")
不啓動應用程序;但是,返回的過程對象顯示沒有錯誤,並且ClickOnce應用程序立即退出。但即使在ClickOnce應用程序的最初階段,也不會達到Trace
。- 陌生人,但
Process.Start("x.bat")
與文件x.bat
包含單行x.abc
也不啓動ClickOnce應用程序!相同的x.bat
從資源管理器開始工作(當然)。
試圖分析ProcMon
會發生什麼並不是很有用,因爲從我的角度來看,啓動應用程序的ClickOnce過程非常難以遵循。我觀察到rundll32
開始工作,但沒有任何失敗的證據。
正在做Process.Start
的程序是一個完全沒有任何花哨的完全信任控制檯應用程序。
我無法看到在Windows 7上如何處理ClickOnce應用程序以及爲什麼Process.Start
與從Explorer啓動文件不同。值得一提的是,使用Start
方法的更高級版本與ProcessStartInfo
並且設置UseShellExecute
到true
也沒有幫助。
從cmd
開始Process.Start
然後嘗試啓動x.abc
顯示完全相同的問題。如果我將環境設置與手動啓動的cmd
進行比較,我會看到ProgramFiles
的定義差異(第一個指向C:\Program Files (x86)
,而第二個指向C:\Program Files
)。從我的.NET應用程序啓動的應用程序在32位仿真層(SysWoW64)上啓動。
通過啓動32位版本的命令提示符(即%windir%\SysWoW64\cmd.exe
),然後在提示符處輸入x.abc
,我能夠重現x.abc
的啓動失敗。我還發現了一個醜陋的解決方法,即通過啓動%windir%\Sysnative\cmd.exe /C x.abc
而不是x.abc
從32位環境啓動64位命令提示符。
但我寧願使用乾淨的方式來做到這一點(或者有一位微軟代表告訴我這確實是Windows 7和/或ClickOncce的一個問題,而且它很快就會被修復)。
好像很多啊想看到一個答案這裏。如果有人深入調查問題並找到答案,那將會很好。 – 2009-12-12 15:19:05
知道這是一件好事,至少,我不是唯一遇到這個問題的人! – 2009-12-12 22:18:17