2012-03-27 34 views
0

我的C#應用​​程序被執行並設置了一個變量static「_user」。後綴另一個應用程序在相同的進程下執行,它必須讀取該變量。我無法獲得預期的結果。如何獲取從另一個實例聲明的靜態屬性。 c#

  • 應用1:設置一個_user變量:

    public class Program 
    { 
        public static void Main(string[] args) 
        { 
    
         LoginDialog login = new LoginDialog(); 
         login.RunDialog(); 
        } 
    } 
    
  • 類通過應用稱爲其設置變量_user

    public class LoginDialog 
    { 
        private static string _user; 
    
        public void RunDialog() 
        { 
         _user = "Peter"; 
        } 
    
        public static string User { get { return _user; } } 
    } 
    
  • 應用2:獲取靜態變量聲明:

    public class Program 
    { 
        public static void Main(string[] args) 
        { 
         string s = LoginDialog.User; 
        } 
    } 
    
+2

你是什麼意思的「在同一過程」? – 2012-03-27 14:14:59

+0

你會得到什麼錯誤或意外的行爲? – phoog 2012-03-27 14:16:01

+0

這兩個應用程序都在特定的外部應用程序下運行。 (在那個軟件中,我運行了我自己的應用程序,它們是DLL。)我檢查它們是否在相同的進程中,因爲它們具有相同的pID。 – kmxillo 2012-03-27 14:18:55

回答

1

靜態數據只與application domain(AppDomain)一樣長。當AppDomain被卸載時,其內存被釋放,並且存儲在該內存中的任何數據都將丟失。

如果在您的Main方法中,您首先調用LoginDialog.RunDialog(),則應該獲得預期結果。

如果你真的需要登錄到一個單獨的AppDomain中運行,你需要一些數據持久化到一個衆所周知的位置在磁盤上,或者使用的inter-process communication一些其他的方法。

+0

當我檢查下面的語句「System.Diagnostics.Process.GetProcessesByName(」「)。Id。」我得到相同的ID。這是否意味着它們處於相同的過程?因爲如果它是真的,我不明白使用進程間通信方法的意義。 – kmxillo 2012-03-27 14:37:35

+0

@kmxillo聽起來好像你沒有在同一時間運行程序。如果是這樣的話,他們將不會在同一個過程中。 – phoog 2012-03-27 14:42:34

+0

@kmxillo啓動應用程序也可能爲每個應用程序創建單獨的應用程序域,在這種情況下,它們具有相同的進程ID,但它們仍然會被有效分離。如果是這種情況,請在我的所有評論中將「AppDomain」替換爲「process」。我也編輯了答案。 – phoog 2012-03-27 14:48:41

3

這是不可能的,因爲每個進程都有自己的地址空間,因此它自己的實例爲LoginDialog.User。您需要使用某種類似共享內存或命名管道的進程間通信。

順便說一句:從另一個應用程序啓動一個應用程序不會導致執行這兩個應用程序的一個進程。每個應用程序都有自己的過程。

+0

重點是:當我聲明靜態變量如:private static string _user =「Peter」;它工作完美,但我不能這樣宣佈。 – kmxillo 2012-03-27 14:17:14

+1

@kmxillo:定義「它工作完美」。這聽起來像是你沒有正確描述它,或者你沒有正確地感知結果。 – David 2012-03-27 14:18:45

+0

@David它「工作完美」,因爲靜態變量已初始化。在問題中的示例代碼中,初始化包含在永遠不會調用的方法中。 – phoog 2012-03-27 14:21:12

1

我懷疑無論託管您的應用程序是爲每個應用程序創建一個新的AppDomain。它們將它們隔離開來,就好像它們處於不同的過程中一樣。

我建議你將結果保存到磁盤,而不是嘗試使用靜態變量。

+0

我使用了靜態變量,因爲數據保存在「結構」中如果我將結果保存到磁盤,而不是靜態變量。當數據是像「用戶,密碼」這樣的個人數據時,這是否是一種好的做法?如果不是,哪個是最好的解決方案?我不喜歡使用數據庫(有沒有需要)或RegistryKeys(我不想在我的代碼開銷)。 – kmxillo 2012-03-27 14:53:46

+1

@kmxillo:有多種存儲數據的方式。對於一個簡單的字符串列表,您可以使用「每行一行」。另外,使用LINQ to XML XML很容易。 – 2012-03-27 14:56:39

相關問題