在C#中运行应用程序之间共享变量

4

我正在开发两个简单的应用程序,使用C#编写,在同一本地计算机上运行,不需要网络。

第一个应用程序初始化一个DLL(Class1)并设置一个变量。第二个应用程序只是读取之前存储的数据。两个应用程序都实例化相同的Class1。

代码:

  • DLL (Class1):

    public class Class1
    {
    
    private string variableName;
    
    public string MyProperty
     {
        get { return variableName; }
        set { variableName = value; }
      }
    
    }
    
  • Application A:

    class Program
    {
    static void Main(string[] args)
    {
        Class1 class1 = new Class1();
    
        string localReadVariable = Console.ReadLine();
    
        class1.MyProperty = localReadVariable;
    
       }
    }
    
  • Application B:

    class Program
    {
        static void Main(string[] args)
    {
        ClassLibraryA.Class1 localClass = new ClassLibraryA.Class1();
    
        string z = localClass.MyProperty;
    
        Console.WriteLine(z);
    }
    }
    

我的问题是我不知道如何从另一个线程读取变量。

应用程序B必须读取应用程序A设置的“variableName”变量

谢谢


这可能是你正在寻找的内容:https://dev59.com/y3M_5IYBdhLWcg3wfTE0 - Wim Ombelets
希望你知道每个程序都有自己的Class1实例! - Daniel Hilgarth
是的!这就是问题所在,两个应用程序创建了不同的实例,我不知道如何以简单的方式进行通信。我听说过WCF、管道、注册表...但我找不到一个易于实现且确定存在的方法...@Wimbo 我也找到了,但据我所知,那篇文章是关于同一实例中线程之间的通信,对吗?而在我的情况下,我有来自不同实例的不同线程。 - Daniel Camacho
4个回答

4
你需要一些机制来在应用程序之间进行通信。
这可以通过注册表、文件、内存映射文件等方式实现......
如果两个应用程序都要写入,你需要在代码中添加同步逻辑。

我不想使用文件,因为存储在变量中的数据是“密码”。那注册表呢?你能提供一个机制的代码片段示例吗? - Daniel Camacho
我建议使用WCF进行进程间通信,因为您不必担心访问文件或锁定文件:http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication - Slugart
1
@Slugart WCF的开销很大,代码量也很多..正如你所看到的,目的只是一个变量。当程序在本地运行时,我不需要创建跨网络通信的原因。 - Daniel Camacho
WCF并不一定使用“网络”,你的本地网络甚至TCP/IP。你应该使用NetNamedPipeBinding而不是HttpBinding。 - Slugart
@Slugart - 添加了运行时的CPU和内存使用情况。 - Oded
显示剩余2条评论

1

应用程序B想要读取应用程序A创建的数据,并不是一件简单的事情。每个应用程序都有自己的地址空间,因此不知道其他应用程序的存在。

但是,有方法可以实现这一点!

请参考这个问题中的一个方法。


当应用程序在同一进程上运行时会发生什么? - Daniel Camacho
@kmxillo:每个应用程序都在自己的进程中运行,它们不共享进程。 - Skizz

1

我已成功使用了两种方法:

  1. 使用数据库表来包含您的公共数据。如果您在调用它时将其包装在事务中,则还可以保护免受并发问题的影响。

  2. 使用PersistentDictionary存储您的数据,由mutex保护。您必须进行一些进程间锁定,因为只有一个进程可以同时打开PersistentDictionary。


0

您可以使用.net Remoting在两个应用程序之间进行通信。
Remoting还不需要网络地址进行通信。


2
远程调用已经过时很久了。WCF 已经是相当长一段时间以来使用的机制。 - Oded
谢谢更新 - 自2.0以来就没有使用过远程处理,实际上使用了WCF,但不知道它现在也是IPC的推荐方式... - Christoph Fink
2
.NET Remoting可能已经被弃用,但这并不意味着这个答案在技术上是错误的或类似于那样的东西。它是一个合法的选择;只是不是最好的选择。 - Brian Gideon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接