Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取从另一个实例声明的静态属性。c#_C#_Variables_Static - Fatal编程技术网

如何获取从另一个实例声明的静态属性。c#

如何获取从另一个实例声明的静态属性。c#,c#,variables,static,C#,Variables,Static,我的C#应用程序被执行并设置一个变量static“_user”。之后,另一个应用程序在同一进程下执行,它必须读取该变量。我无法获得预期的结果 应用程序1:设置_用户变量: public class Program { public static void Main(string[] args) { LoginDialog login = new LoginDialog(); login.RunDialog(); } } 由设置变量_

我的C#应用程序被执行并设置一个变量static“_user”。之后,另一个应用程序在同一进程下执行,它必须读取该变量。我无法获得预期的结果

  • 应用程序1:设置_用户变量:

    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;
        }
    }
    

这是不可能的,因为每个进程都有自己的地址空间,因此也有自己的
LoginDialog.User
实例。您需要使用某种进程间通信,如共享内存或命名管道


顺便说一句:从一个应用程序启动另一个应用程序不会导致一个进程同时执行两个应用程序。每个应用程序都有自己的进程。

这是不可能的,因为每个进程都有自己的地址空间,因此也有自己的
LoginDialog.User
实例。您需要使用某种进程间通信,如共享内存或命名管道


顺便说一句:从一个应用程序启动另一个应用程序不会导致一个进程同时执行两个应用程序。每个应用程序都有自己的进程。

静态数据的寿命仅与(AppDomain)相同。卸载AppDomain时,其内存将被释放,存储在该内存中的任何数据都将丢失

如果在Main方法中首先调用
LoginDialog.RunDialog()
,应该会得到预期的结果


如果您确实需要在单独的AppDomain中运行登录,则需要将一些数据持久保存到磁盘上的已知位置,或者使用其他方法。静态数据只在(AppDomain)存在的时间内存在。卸载AppDomain时,其内存将被释放,存储在该内存中的任何数据都将丢失

如果在Main方法中首先调用
LoginDialog.RunDialog()
,应该会得到预期的结果


如果您确实需要在单独的AppDomain中运行登录,则需要将一些数据持久保存到磁盘上的已知位置,或使用其他方法进行登录。

我怀疑承载您的应用程序的任何东西都会为每个应用程序创建一个新的
AppDomain
。这将它们彼此隔离开来,就好像它们处于不同的过程中一样


我建议您将结果保存到磁盘,而不是尝试使用静态变量。

我怀疑任何托管您的应用程序的东西都会为每个应用程序创建一个新的
AppDomain
。这将它们彼此隔离开来,就好像它们处于不同的过程中一样



我建议您将结果保存到磁盘,而不是尝试使用静态变量。

您所说的“在同一进程下”是什么意思?您会遇到什么错误或意外行为?两个应用程序都在特定的外部应用程序下运行。(在该软件中,我运行自己的DLL应用程序。)我已检查它们是否处于相同的进程中,因为它们具有相同的pID。@phoog string s=LoginDialog.User;我得到的字符串s为空。当我声明私有静态字符串_user=“Peter”时,它工作得很好,但这不是我的目标。所以我很确定我能找到解决我的“小问题”的方法problem@kmxillo请在“另一个应用程序”下显示用于启动这些应用程序的代码。您所说的“在同一进程下”是什么意思?您遇到了什么错误或意外行为?两个应用程序都在特定的外部应用程序下运行。(在该软件中,我运行自己的DLL应用程序。)我已检查它们是否处于相同的进程中,因为它们具有相同的pID。@phoog string s=LoginDialog.User;我得到的字符串s为空。当我声明私有静态字符串_user=“Peter”时,它工作得很好,但这不是我的目标。所以我很确定我能找到解决我的“小问题”的方法problem@kmxillo请在“另一个应用程序”下显示用于启动这些应用程序的代码。重点是:当我声明静态变量时,如:private static string\u user=“Peter”;它工作正常,但我不能这样声明。@kmxillo:Define“It works perfect”。听起来你要么没有正确描述它,要么没有正确感知结果。@David It“works perfect”,因为静态变量已初始化。在问题的示例代码中,初始化包含在一个从未调用过的方法中。@kmxillo根据您编辑的问题,RunDialog是在一个单独的程序中调用的。在读取
User
属性的程序中从未调用该方法。问题是:当我声明静态变量时,比如:private static string\u User=“Peter”;它工作正常,但我不能这样声明。@kmxillo:Define“It works perfect”。听起来你要么没有正确描述它,要么没有正确感知结果。@David It“works perfect”,因为静态变量已初始化。在问题的示例代码中,初始化包含在一个从未调用过的方法中。@kmxillo根据您编辑的问题,RunDialog是在一个单独的程序中调用的。当我使用以下语句“System.Diagnostics.Process.GetProcessByName(“”.Id)”进行检查时,在读取
User
属性的程序中从未调用该方法。我得到的是相同的Id。这是否意味着它们处于相同的进程中?因为如果这是真的,我不理解使用进程间通信方法的意义。@kmxillo听起来你好像没有同时运行这些程序。如果是这种情况,它们将不在同一进程中。@kmxillo也可能是启动应用程序正在为每个应用程序创建单独的应用程序域,在这种情况下,它们将具有相同的进程ID,但实际上仍然是分开的。如果是这样的话,在我的所有评论中用“AppDomain”代替“process”。我也编辑了答案