【问题标题】:How to use the same variable across processes?如何跨进程使用相同的变量?
【发布时间】:2017-10-10 02:24:32
【问题描述】:

所以我编写了一个完美运行的 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());

【问题讨论】:

标签: c# winforms


【解决方案1】:

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

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

【讨论】:

  • 这就是我要找的......为我的问题添加了更多细节,感谢你让我走上正确的轨道@lehiester
  • 我是用`WindowsFormsApplicationBase`的Startup方法得到的
【解决方案2】:

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

first-process 9 4 3 5 | second-process  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-18
    • 2016-12-13
    • 2013-03-16
    • 2020-12-15
    • 1970-01-01
    • 2020-09-22
    • 2011-08-01
    • 2019-08-21
    相关资源
    最近更新 更多