C# 如何用c语言在所有应用程序域中定义一个公共变量#

C# 如何用c语言在所有应用程序域中定义一个公共变量#,c#,locking,static-variables,applicationdomain,C#,Locking,Static Variables,Applicationdomain,假设我想分别运行APP.exe 2次。我需要定义一个在所有应用程序域中共享的变量。例如,我的代码中有一个整数X,我在app.exe(1)中更改了它(表示应用程序的第一次运行) 然后想在app.exe(2)中使用它(同一应用程序的第二次运行)。但是每次变量初始化和每个运行应用程序都有X。我知道如果我为X设置Static,在web应用程序中不会发生这种情况,但是对于WPF和Winform,应用程序域不同,X也不同。 实际上,我真正的问题是锁定实体模型。我想阻止应用程序的每个实例访问模型。我知道SQL

假设我想分别运行APP.exe 2次。我需要定义一个在所有应用程序域中共享的变量。例如,我的代码中有一个整数X,我在app.exe(1)中更改了它(表示应用程序的第一次运行) 然后想在app.exe(2)中使用它(同一应用程序的第二次运行)。但是每次变量初始化和每个运行应用程序都有X。我知道如果我为X设置Static,在web应用程序中不会发生这种情况,但是对于WPF和Winform,应用程序域不同,X也不同。 实际上,我真正的问题是锁定实体模型。我想阻止应用程序的每个实例访问模型。我知道SQL可以实现这一点,但我想在C#中锁定一个公共共享变量

已编辑

我使用了互斥,但问题仍然存在。请看我的例子

private static Mutex mut = new Mutex();

public void Dopessimistic(int id , string name)
{       
    mut.WaitOne();
    {
        MessageBox.Show("nm1");
    }
}
我运行app.exe两次。我希望消息只显示一次,因为我没有释放互斥锁,但每次运行app.exe时,它都会工作并显示消息。实际上,互斥锁似乎不是在所有应用程序之间共享的,每次运行都有自己的互斥锁

您应该使用:

私有静态互斥量mut=新互斥量(false,“MyAppMutex”)

public void dopessimitic(int-id,字符串名) {

        mut.WaitOne();
        {
            MessageBox.Show("nm1");

        }

    }
通过这种方式,您将创建一个系统范围的
互斥体

如果您创建了一个未命名的应用程序(就像您在代码中所做的那样),它将是应用程序的本地应用程序

注意:如果一个应用拥有
互斥体的所有权,并且在未释放它的情况下关闭了该
互斥体,则该
互斥体将被“放弃”,等待该
互斥体的下一个线程将获得所有权。

在您的测试中,这意味着App.exe的第二个实例也会显示其文本,但只有在第一个实例关闭后才能显示。

您可以通过多种方式执行此操作。您可以将变量作为表单参数传递-

private void button1_Click(object sender, EventArgs e)
{
        int X=5;
        Form2 frm2 = new Form2(X);
        frm2.Show();    
}
在第二种形式中,只需获取值-

 public Form2(int X)
    {
        InitializeComponent();
        textBox1.Text = X.ToString();

    }

请看,请看我的已编辑,尚未解决!谢谢
但每次运行app.exe它都会工作并显示消息。
当你这么说的时候,你是说两个app.exe实例同时运行吗?为什么你不想在SQL中这样做?没错!两个实例,我只是好奇它是否可能,并学习新的方法。实际上,我想要o在实体框架上锁定实体模型做悲观的并发!!!问题由下面的答案大大解决。不,我不想打开和关闭应用程序,考虑你有两个客户端应用程序,他们都想要访问实体模型,我想锁定实体模型,但是每个锁对象都属于每个实例,就像你一样。Oned,messagebox只是一个简单的例子。当两个实例已经运行时,只有一个messagebox可以显示,这是我想要的,谢谢大家。OP不是指不同的表单,而是指同一应用程序并排运行的不同实例。我们需要两个实例而不是两个表单,问题已经解决,请参阅答案a嗯,但请你再解释一下。它实际上是如何发生的?互斥不是在本地创建的吗?那么为什么它是共享的?它实际上位于哪里?另一个问题是它只在同一台PC上工作还是跨网络工作?如果我想跨网络使用这种方法,解决方案是什么?我看到了一些关于使用WCF同步的解决方案,对吗?命名互斥是系统范围的,由操作系统维护。等待和重新实现互斥是(底层)通过调用操作系统实现。如果您想要一个跨网络工作的解决方案,我建议采用客户机-服务器方法,通过API公开EF模型和数据库访问。如果您确实想要分布式访问数据库,则需要在应用程序实例之间实现一些通信以同步访问,但这将这不是小事。也许有“网络共享互斥”之类的东西,但我不知道。