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