2010-04-10 82 views
3

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

+1

您确定您的意思是'最高效'而不是'最佳实践'吗?如果你真的想'最高效',你应该远离任何XML。 – 2010-04-10 21:50:44

+1

'最高效'肯定会以*不*使用两个独立的进程开始。 – 2010-04-10 21:58:00

回答

4

您不必轮询文件。使用FileSystemWatcher

+0

+1 - 击败我吧! – 2010-04-10 21:43:55

+2

我读过FileSystemWatcher并不总是可靠的,你有时可能会失去一些改变。如果你走这条路线,你可能仍然需要不时地进行轮询,以确保你没有遗漏任何东西。资料来源:http://stackoverflow.com/questions/239988/filesystemwatcher-vs-polling-to-watch-for-changes – 2010-04-10 21:47:24

+0

构建在FileSystemWatcher上的东西可能会遇到竞争条件问题。它可能仍然是最简单的解决方案,但@ajl一定要想出一些办法来避免这种情况。也许在仍然由第一个程序编写的XML文件上使用“.partial”文件扩展名,第二个程序可以避免使用该扩展名的文件。 – 2010-04-10 21:53:38

3

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

1

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

0

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

添加FileSystemWatcher的对象的.exe文件之一,一个过滤器设置为如特定文件“commands.txt中”

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

主演/停止监视,设置路径和EnableRaisingEvents属性为真或假

这是引发事件时,该文件的变化:

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() 

完成!

相关问题