2009-09-01 93 views
3

我們收到了一個新的代碼庫,它在整個地方使用了環境變量。它們指向項目根,資產,不同工具等等。不是最理想的情況,但它有效。但是,當試圖運行我們的自動化構建時,它會變成巨大的痛苦。啓動後在C#中重新加載環境變量

Windows似乎在創建進程時實例化環境變量,並且不會再次刷新這些值。我們希望能夠讓我們的自動構建系統運行一系列項目並逐一構建每個項目。這需要調用改變這些值的項目切換器。完成此操作後,更改不會反映在當前正在運行的構建過程中。

有沒有人知道任何C#命令/功能/等可以用來強制環境變量重新加載後,項目切換器的調用已經作出?

回答

1

如果您要打開命令提示符(cmd.exe),然後更改環境變量,則該cmd.exe實例將不會看到這些更改。如果要打開cmd.exe的新實例,那麼將會看到新的更改。 (如果您更改了用戶環境變量而不是系統環境變量)。

我不知道如何在.NET中模仿它。你可以嘗試的是創建一個新的AppDomain,看看是否可行。

如果沒有,您可以嘗試看看會發生什麼,如果通過啓動新流程來創建裝配的新實例。在你的情況下,這可能意味着你必須改變自動構建系統來將新項目的構建作爲一個新過程進行構建。

我知道這些不是直接的答案,但也許他們會給你一個關於如何進行的想法。

7

有跡象表明,檢索System.Environment.GetEnvironmentVariableSystem.Environment.GetEnvironmentVariable重載:

...一個環境變量從當前進程或從當前用戶或本地計算機 Windows操作系統的註冊表鍵值。

如果您的更改影響指定區域的註冊表,這可能適用於您。

+0

這解決我的問題。我改變環境變量但即使在重新啓動應用程序之後,舊值也會返回,我使用了'EnvironmentVariableTarget.Machine',它解決了這個問題,顯然'EnvironmentVariableTarget.Process'是默認值。 – zmechanic 2016-08-19 16:01:25

1

這不是刷新環境變量的問題。每個流程都有自己的環境,在流程創建時,它是其父級環境的副本。

更改正在運行的進程環境的唯一方法是進程自己更改它。必須在兩個正在運行的進程之間傳遞的任何信息必須通過某種形式的IPC完成。

例如,從文件或數據庫中而不是從環境中讀取相關變量可能會更好。數據庫當然更容易,因爲它使事務和同步更容易。

4

根據MSDN

「創建進程中改變一個子進程的環境變量是一個進程可以直接改變另一個進程的環境變量的唯一途徑的處理不能直接改變的環境變量。另一個不是該過程的孩子的過程。「

如果項目切換器是不是太複雜,你可以簡單地設置在當前進程的環境變量(例如,使用Environment.SetEnvironmentVariable或ProcessStartInfo.EnvironmentVariables)。