2012-03-27 6 views
0

My C#アプリケーションが実行され、変数static "_user"が設定されます。その後、別のアプリケーションが同じプロセスで実行され、その変数を読み取る必要があります。私は期待される結果を得ることができません。別のインスタンスから宣言された静的プロパティを取得する方法。 C#

  • アプリケーション1:_user変数の設定:静的変数を宣言なさい::

    変数_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) 
        { 
    
         LoginDialog login = new LoginDialog(); 
         login.RunDialog(); 
        } 
    } 
    
  • クラス

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

「同じプロセスの下で」とはどういう意味ですか? –

+0

あなたはどんなエラーや予期しない動作をしていますか? – phoog

+0

両方のアプリケーションが特定の外部アプリケーションで実行されています。 (そのソフトウェアでは、私はDLLである自分のアプリケーションを走らせました。)同じpIDを持っているので、同じプロセスに入っていることを確認しました。 – kmxillo

答えて

1

スタティックデータは、application domain(AppDomain)の間だけ有効です。 AppDomainがアンロードされると、そのメモリは解放され、そのメモリに格納されているデータはすべて失われます。

メインメソッドで初めてLoginDialog.RunDialog()を呼び出す場合は、予期した結果が得られるはずです。

あなた本当には、ディスク上の既知の場所にいくつかのデータを永続化する必要がある、またはinter-process communicationの他のいくつかの方法を使用します、別々のAppDomainで実行するためのログインが必要な場合。

+0

次のステートメント "System.Diagnostics.Process.GetProcessesByName(" ")。Id"をチェックすると、私は同じIDを取得しています。それは同じプロセスにあることを意味しますか?もしそれが本当であれば、私はInter-Process通信方法の使用の意味を理解していないからです。 – kmxillo

+0

@ kmxilloあなたは同時にプログラムを実行していないようですね。そうであれば、彼らは同じプロセスに参加することはありません。 – phoog

+0

@kmxillo起動アプリケーションがアプリケーションごとに別々のアプリケーションドメインを作成している可能性もあります。その場合、同じプロセスIDを持ちますが、それでも効果的に分離されます。その場合、私のコメントのすべてで「プロセス」の代わりに「AppDomain」を置き換えてください。私は答えも編集しました。 – phoog

3

各プロセスに独自のアドレス空間があり、したがって独自のインスタンスがLoginDialog.Userであるため、これは不可能です。共有メモリや名前付きパイプのような、ある種のプロセス間通信を使用する必要があります。

ところで:他のアプリケーションを起動すると、両方のアプリケーションを実行するプロセスが1つも発生しません。各アプリケーションには独自のプロセスがあります。

+0

ポイントは:私は静的な変数を宣言するとき:private static string _user = "Peter";それは完璧に動作しますが、私はそれをそのように宣言することはできません。 – kmxillo

+1

@ kmxillo:「それは完璧に機能する」と定義します。あなたが正しく記述していないか、結果を正しく認識していないように思えます。 – David

+0

@David静的変数が初期化されるため、 "完璧に機能します"。質問のサンプルコードでは、初期化は決して呼び出されないメソッドに含まれています。 – phoog

1

私はあなたのアプリケーションをホストしているものはどれも、アプリケーションごとに新しいAppDomainを作成していると思います。あたかも彼らが別々のプロセスにあるかのように、それらをお互いから分離します。

静的変数を使用するのではなく、結果をディスクに保存することをお勧めします。

+0

私は静的変数ではなく、ディスクに結果を保存すると、データが "構造体"に保存されるため、静的変数を使用しました。データが「ユーザー、パスワード」のような個人データである場合は、良い習慣でしょうか?そうでない場合は、どちらが最善の解決策ですか?私はむしろDB(必要性はない)またはRegistryKeys(私はコードをオーバーヘッドしたくない)を使用することを好まない。 – kmxillo

+1

@ kmxillo:データを格納する方法はいくつでもあります。文字列の簡単なリストについては、 "値ごとに1行"を使用することができます。また、LINQ to XMLを使用するとXMLが簡単になります。 –

関連する問題