Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.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#_Winforms - Fatal编程技术网

C# 如何跨流程使用相同的变量?

C# 如何跨流程使用相同的变量?,c#,winforms,C#,Winforms,所以我写了一个C#(WindowsForm)应用程序,它运行得非常好。但是我希望能够在添加了args的命令行中使用它 我的目标是说,通过“9 4 3 5”的命令行参数执行一些代码并用数据填充变量,然后通过命令“run trial”并从“9 4 3 5”命令行填充的变量中提取试用代码 我把所有东西都标记为静态,但它仍然不工作。我的假设是,正在从命令行调用一个新的.exe进程,并使用新的变量值等启动一个新进程 如何保留旧流程,或者让变量保留所有流程的值 像内存映射文件这样的东西是我唯一的选择吗?我想

所以我写了一个C#(WindowsForm)应用程序,它运行得非常好。但是我希望能够在添加了args的命令行中使用它

我的目标是说,通过“9 4 3 5”的命令行参数执行一些代码并用数据填充变量,然后通过命令“run trial”并从“9 4 3 5”命令行填充的变量中提取试用代码

我把所有东西都标记为静态,但它仍然不工作。我的假设是,正在从命令行调用一个新的.exe进程,并使用新的变量值等启动一个新进程

如何保留旧流程,或者让变量保留所有流程的值

像内存映射文件这样的东西是我唯一的选择吗?我想我必须将数据写入磁盘,然后每次都提取数据

我还需要通过参数从命令行更改
NotifyIcon
图标,因此我认为写入磁盘不会有帮助。将工作负载放入DLL帮助中,或者放入它自己的单独类中,然后从每个实例访问该类,可以吗

谢谢大家

编辑:添加信息

感谢lehiester让我开始

我现在有了这个代码:

class AppBase : WindowsFormsApplicationBase
    {
        internal AppBase() : base()
        {
            this.IsSingleInstance = true;
            this.MainForm = new TrayIcon();
        }
    }

    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            //Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new TrayIcon());
            AppBase mBase = new AppBase();
            mBase.StartupNextInstance += MBase_StartupNextInstance;
            mBase.Run(Environment.GetCommandLineArgs());
        }

        private static void MBase_StartupNextInstance(object sender, StartupNextInstanceEventArgs e)
        {
            if(e.CommandLine[1].Equals("toggle"))
            {
                TrayIcon.toggleIcon();
            }
        }
    }

我目前的问题是,它仍然显示第二个
NotifyIcon
,并在鼠标悬停时将其删除。。我应该在哪里调用
mBase.Run(Environment.GetCommandLineArgs())

您的假设是正确的——静态变量不起作用,因为它们属于流程(严格来说,实际上是AppDomain),并且新实例是在不同的流程中启动的。多个.NET程序不能共享一个静态变量,除非在非常特殊的情况下,它们托管在同一进程中,这在这种情况下可能是不可能的


通常,在进程之间传递数据的最简单方法通常是命名为管道,但Windows窗体特别支持将第二个实例的命令行参数传递给已经运行的实例。您可以使用
WindowsFormsApplicationBase.StartupNextInstance
事件,如中所述。

您的假设是正确的——静态变量不起作用,因为它们属于流程(严格地说,实际上是AppDomain),新实例在单独的流程中启动。多个.NET程序不能共享一个静态变量,除非在非常特殊的情况下,它们托管在同一进程中,这在这种情况下可能是不可能的


通常,在进程之间传递数据的最简单方法通常是命名为管道,但Windows窗体特别支持将第二个实例的命令行参数传递给已经运行的实例。您可以使用
WindowsFormsApplicationBase.StartupNextInstance事件,如中所述。

我当然建议保持简单。考虑将计算结果发射到标准外,然后将管道输送到第二个参数,如:

first-process 9 4 3 5 | second-process  

我当然会建议保持简单。考虑将计算结果发射到标准外,然后将管道输送到第二个参数,如:

first-process 9 4 3 5 | second-process  

还有呢?还有?这就是我要找的。。为我的问题添加了更多细节,感谢您让我走上正确的轨道@Lehiestri我通过“WindowsFormsApplicationBase”的
启动
方法找到了它这就是我要找的。。为我的问题添加了更多细节,感谢您让我走上了正确的轨道@Lehiestri我通过`WindowsFormsApplicationBase的
启动
方法获得了它`