標籤:
宿主進程 [*.vshost.exe] & [*.vshost.exe.config]
問題緣起:
Release 模式下編譯發布WPF項目,會產生[*.vshost.exe] & [*.vshost.exe.config]檔案。當需要臨時手動修改[*.config]中的一些配置資訊時,[*.vshost.exe.config] & [*.exe.config]是否都要修改?[*.vshost.exe] & [*.vshost.exe.config]是否可以刪除?
宿主進程 [*.vshost.exe] & [*.vshost.exe.config]
[*.vshost.exe] 也叫宿主進程,是VS2005/2008/2010中的一項功能,能提高調試效能,支援部分信任調試並支援設計時錶達式計算。宿主進程檔案的檔案名稱中包含 vshost, 並位於項目的輸出檔案夾中。
託管程式是通過[*.vshost.exe]啟動的,而[*.vshost.exe]是一個固定的程式,在每次啟動調試過程前,VS會把[*.vshost.exe]拷貝到被調試進程的同一目錄裡面,然後在後台幫你啟動[*.vshost.exe]以便節省調試時間,直到你關閉VS或者關閉當前的VS解決方案(.sln檔案),VS才會終止[*.vshost.exe].
[*.vshost.exe]負責建立應用程式定義域並將調試器和自身關聯起來,因為在你調試你的.NET工程的時候,[*.vshost.exe]只啟動一次,因此避免了每一次調試.NET可執行檔時準備調試環境的過程,然後[*.vshost.exe]使用AppDomain.ExecuteAssembly函數來執行我們的可執行檔。
宿主進程檔案 (.vshost.exe) 由 VS使用,不應通過應用程式直接運行或部署。
提高調試效能
宿主進程建立一個應用程式定義域並將調試器與應用程式關聯起來。執行這些任務會導致在開始調試和開始運行應用程式之間有很明顯的延遲。通過在後台建立應用程式定義域和關聯調試器,並在運行應用程式之間儲存應用程式定義域和調試器狀態,宿主進程使效能得到提高。
部分信任調試
在“專案設計工具”的安全頁中,可將應用程式指定為部分信任應用程式。調試部分信任應用程式需要對應用程式定義域進行特殊的初始化。此初始化由宿主進程處理。
設計時錶達式計算
設計時錶達式計算使您可以從“即時”視窗進行代碼測試,而不必運行應用程式。宿主進程在設計時錶達式計算期間執行此代碼。
這個只會影響到Class Library工程, [*.vshost.exe]將.dll可執行檔載入到應用程式定義域裡面,然後跟Visual Studio互動,擷取運算式的值。如果將[*.vshost.exe]禁用,那麼你不能在類型庫項目中使用設計時錶達式計算這個功能。但是你仍然可以使用可執行檔的設計時錶達式功能,這是因為Visual Studio通過直接啟動你的可執行.exe檔案來完成的。
調試與宿主進程
Visual Studio 宿主進程提高了調試器效能,並啟用了新的調試器功能,如部分信任調試和設計時錶達式計算。如果需要,您可以禁用宿主進程。
用宿主進程和不用宿主進程進行調試的一些差異
1) 部分信任調試和 Click-Once 安全
部分信任調試需要宿主進程。如果禁用宿主進程,部分信任調試將不工作,即使在“項目屬性”的“安全”頁上啟用了部分信任安全。
2) 設計時錶達式計算
設計時錶達式始終使用宿主進程。如果在“項目屬性”中禁用宿主進程,則禁用了類庫項目的設計時錶達式計算。對於其他項目類型,不禁用設計時錶達式計算。相反,Visual Studio 啟動實際可執行檔,並將它用於不用宿主進程的設計時計算。這種差異可能產生不同的結果。
3) AppDomain.CurrentDomain.FriendlyName 差異
AppDomain.CurrentDomain.FriendlyName 依據是否啟用宿主進程返回不同的結果。如果啟用宿主進程時調用 AppDomain.CurrentDomain.FriendlyName,它將返回 app_name.vhost.exe。如果禁用宿主進程時調用它,它將返回 app_name.exe。
4) Assembly.GetCallingAssembly().FullName 差異
Assembly.GetCallingAssembly().FullName 依據是否啟用宿主進程返回不同的結果。如果啟用宿主進程時調用 Assembly.GetCallingAssembly().FullName,它將返回 mscorlib。如果禁用宿主進程時調用 Assembly.GetCallingAssembly().FullName,它將返回該應用程式名稱。
禁用宿主進程
1) 項目 屬性
2) 去掉圖中勾選項即可
禁用宿主進程之後將出現下列情況:
1) 開始調試 .NET Framework 應用程式所需的時間增加
2) 設計時錶達式計算不可用
3) 部分信任調試不可用
詳情參考:vshost.exe調試宿主(VS Debug Host Process)進程詳解的分析過程
問題結論:
基於前面的相關資訊,宿主進程[*.vshost.exe] & [*.vshost.exe.config] 只會在調試或設計時相關階段用到。在Release下編譯WPF項目會產生[*.vshost.exe] & [*.vshost.exe.config]也應該是為調試等相關動作備用。發布之後理論上是可以刪除的。
測試結果:
刪除宿主進程相關檔案, [*.vshost.exe] & [*.vshost.exe.config]. 測試專案功能。沒有發現異常。可見宿主進程的相關檔案[*.vshost.exe] & [*.vshost.exe.config]在發布之後是可以刪除的,不會影響到程式功能。
測試軟體環境:
VS2010 + Sql Server2005 + WPF
參考資料列表:
http://blog.csdn.net/donjuan/article/details/3849508
http://topic.csdn.net/u/20080512/10/a1af6fe8-ac18-414a-bee7-aa1b64c98006.html
.net VHost的作用