代码之家  ›  专栏  ›  技术社区  ›  Nifle Hassan Syed

两个单独的C.NET应用程序在同一台计算机上进行对话的最简单方法是什么?

  •  5
  • Nifle Hassan Syed  · 技术社区  · 16 年前

    我希望我的两个应用程序能够互相发送字符串,并且取决于字符串。” 做某事 “。

    这是给A的 概念模型的预验证 这样就不需要任何安全预防措施,而且效率也不高。

    那么,我该如何做到这一点,同时尽可能少地完成我的工作呢?

    (你是我亲爱的朋友,所以用户可以在这个问题上尽你所能地努力工作)

    7 回复  |  直到 9 年前
        1
  •  2
  •   Jon Skeet    16 年前

    他们在多大程度上 真的,真的吗? 需要不同的应用程序?

    你能在不同的线程上有两个从第三个项目启动的独立项目吗?

    static void Main()
    {
        new Thread(Project1.Program.Main).Start();
        new Thread(Project2.Program.Main).Start();
    }
    

    在这一点上,您可以使用静态变量(在第四个项目中,由前两个项目中的两个项目引用)在两个项目之间建立共享的通信通道。你可以要两个 producer/consumer queues (看下半页),例如,每个方向一个。(您希望使队列只使用字符串,或者生成一个通用的字符串,然后使用 ProducerConsumer<string> 例如。如果可以使用.NET 4.0测试版,则可以使用 BlockingCollection<string> )

    那将是 非常古怪 -而且没有孤立甚至不同 AppDomain 从两个“应用程序”访问的静态变量方面,您可以看到一些有趣的效果,但实际上这正是您想要实现的。

    你不应该接受这种实现思想 在任何地方 接近生产代码——但对于您所描述的情况,听起来“易于实现”是最重要的一点。

    为了防止项目层次结构不合理,这里有一个图形表示

            Launcher
           /        \
          /          \
       App 1       App 2
          \          /
           \        /
            \      /
          Shared stuff
    

    (使) 更简单 实际上,您可以只使用一个项目,并使其主要方法使用同一项目中的方法启动两个不同的线程。不管怎么说,它是两个应用的想法都是烟雾和镜子。另一方面,这可能使 认为 通过分离项目来了解不同的应用程序。)

        2
  •  6
  •   Foredecker    16 年前

    有几种机制可以做到这一点——可能最容易使用的是命名管道。我还没有使用它,但我理解Windows通信基金会(WCF)也很容易使用。

    有很多 articles on CodePoject 关于WCF:)

    使用WCF的一个优点是它可以让您的进程轻松地移动到不同的系统。(这对于您的场景是否可行)。

        3
  •  2
  •   Mehrdad Afshari    16 年前

    一种方法是使用.NET远程处理 IpcChannel 类在同一台计算机上跨不同进程进行通信。

        4
  •  2
  •   blowdart    16 年前

    WCF是一种很好的方法,即使一旦你开始钻研它,它也会变得复杂。

    您将定义一个接受字符串的简单契约,然后在每个应用程序中实现该契约,在字符串到达时执行您想要的任何操作。在应用程序中,您可以 self host 服务,这意味着应用程序本身承载服务——所以您不需要IIS。在已知端口上承载它们,在每个解决方案中添加一个Web服务引用,然后离开。

        5
  •  1
  •   JaredPar    16 年前

    应用程序有很多非常简单的通信方式。我想最简单的方法是

    • 命名管道
    • 本地插座
    • 共享内存
        6
  •  1
  •   weiqure    16 年前

    我能想到的最简单的方法是创建另一个进程检查的文件。

    更“高级”和“合理”的方法是使用socket和localhost。

    如果我真的想实现它,我会尝试学习适当的IPC。

        7
  •  -1
  •   Geo    16 年前

    我要带插座去。