2010-04-10 68 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() 

完成!

相關問題