如何跨进程使用相同的变量?

时间:2017-10-10 02:24:33

标签: c# winforms

所以我编写了一个完美运行的C#(WindowsForm)应用程序。但我希望能够在添加了args的命令行中使用它。

我的目标是通过命令行参数" 9 4 3 5"执行一些代码并用数据填充变量,然后传递命令"运行试验"并且试验代码来自" 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());

2 个答案:

答案 0 :(得分:3)

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

通常,在进程之间传递数据的最简单方法通常是命名管道,但Windows Forms特别支持将第二个实例的命令行参数传递给已在运行的实例。您可以使用WindowsFormsApplicationBase.StartupNextInstance中所述的emcc -O3 -s WASM=1 -s SIDE_MODULE=1 -o sum.wasm sum.c事件。

答案 1 :(得分:1)

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

first-process 9 4 3 5 | second-process