【问题标题】:Best way to communicate between 2 .Net apps?在 2 个 .Net 应用程序之间进行通信的最佳方式?
【发布时间】:2014-07-24 03:50:16
【问题描述】:

如果我控制这两个应用程序,在 VB.Net 中编写的 2 个 exe 之间进行通信的最佳方式是什么。例如,我想从一个应用程序中删除一个 XML 文件,然后将它与另一个应用程序一起提取,但我不想轮询该文件。我听说过命名管道,但我发现它很复杂。最有效的方法是什么?

【问题讨论】:

  • 您确定您的意思是“最有效”而不是“最佳实践”吗?如果您真的想要“最高效”,您可能应该远离任何 XML。
  • “最高效”肯定会以 not 开头,使用两个单独的进程。

标签: vb.net ipc


【解决方案1】:

最简单的方法可能是使用Windows Communication Foundation。这个article 有用 VB.NET 编写的示例代码。

【讨论】:

    【解决方案2】:

    您不必轮询文件。使用FileSystemWatcher

    【讨论】:

    • 我了解到 FileSystemWatcher 并不总是可靠的,有时您可能会丢失一些更改。如果你走这条路,你可能仍想偶尔轮询一下,以确保你没有错过任何东西。来源:stackoverflow.com/questions/239988/…
    • 在 FileSystemWatcher 上构建的东西可能会出现竞争条件问题。它可能仍然是最简单的解决方案,但@ajl 一定要想出办法来避免这种情况。也许在第一个程序仍在编写的 XML 文件上使用“.partial”文件扩展名,而第二个程序可以避免使用该扩展名的文件。
    【解决方案3】:

    一种简单的方法是使用 WCF。接收方应用程序可以托管一个简单的 WCF 服务,而发送方可以将文件发送给它。

    【讨论】:

      【解决方案4】:

      .NET 4 包括对memory-mapped files 的支持。有了这些,您甚至可以避免使用文件系统。但是,如果进程不在同一台机器上运行,则必须使用其他方法(正如其他人所提到的,WCF 会是一个很好的方法)。

      【讨论】:

        【解决方案5】:

        如果你可以编辑 .exe 的文件,这里是最简单的方法:

        在其中一个 .exe 中添加 FileSystemWatcher 对象并将过滤器设置为特定文件,例如“Commands.txt”

        FileSystemWatcher1.Path = Application.StartupPath
        FileSystemWatcher1.NotifyFilter=NotifyFilters.LastWrite
        FileSystemWatcher1.Filter = "Commands.txt"
        FileSystemWatcher1.EnableRaisingEvents = True
        

        要启动/停止监控,请将路径和 EnableRaisingEvents 属性设置为 True 或 False

        这是文件更改时引发的事件:

        Private Sub FileSystemWatcher1_Changed(sender As System.Object, e As System.IO.FileSystemEventArgs) Handles FileSystemWatcher1.Changed
            'Open the file and read the content.
            'you can use your own commands
        End Sub
        

        这样,您只会在文件更改时收到事件,而无需使用计时器或其他任何东西。


        另一个.exe文件,只需要写下你想发送的命令或消息: 此示例每次写入当前日期时间以覆盖文件。

        Dim Timestamp() As Byte = System.Text.Encoding.Default.GetBytes(Now.ToString)
        Dim Fs As System.IO.FileStream
        Fs = New System.IO.FileStream("Commands.txt", FileMode.Create, FileAccess.Write)
        Fs.Write(Timestamp, 0, Timestamp.Length - 1)
        Fs.Close()
        

        完成!

        【讨论】:

          猜你喜欢
          • 2015-09-03
          • 1970-01-01
          • 2012-08-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多