2010-04-10 3 views
3

두 응용 프로그램을 모두 제어하는 ​​경우 VB.Net로 작성된 두 개의 exe 사이에서 통신하는 가장 좋은 방법은 무엇입니까? 예를 들어 하나의 앱에서 XML 파일을 삭제하고 다른 파일과 함께 가져 오려고하지만 파일에 대한 폴링을 원하지 않습니다. 명명 된 파이프에 대해 들어 봤지만 복잡했다. 가장 효과적인 방법은 무엇입니까?2 .Net 앱간에 통신하는 가장 좋은 방법은 무엇입니까?

+1

'모범 사례'보다는 '가장 효율적'을 의미합니까? '가장 효율적'을 원한다면 XML을 사용하지 않아야합니다. –

+1

'가장 효율적'이라는 말은 분명히 두 개의 개별 프로세스를 사용하여 * 시작하지 않을 것입니다. –

답변

4

파일을 폴링 할 필요가 없습니다. FileSystemWatcher을 사용하십시오.

+0

+1 - 나를 때려 눕히세요! –

+2

필자는 FileSystemWatcher가 항상 신뢰할만한 것은 아니며 일부 변경 사항을 잃을 수도 있음을 읽었습니다. 이 길로 가면 가끔씩 투표하여 무언가를 놓치지 않았 음을 확인하십시오. 출처 : http://stackoverflow.com/questions/239988/filesystemwatcher-vs-polling-to-watch-for-changes –

+0

FileSystemWatcher에 구축 된 것이 경쟁 조건에 문제가있을 수 있습니다. 그것은 여전히 ​​가장 간단한 해결책 일지 모르지만 @ajl은 이것을 피하기 위해 뭔가를 생각해 내야합니다. 아마도 첫 번째 프로그램에서 작성한 XML 파일에 "부분적"파일 확장명을 사용하고 두 번째 프로그램은 해당 확장명을 가진 파일을 피할 수 있습니다. –

3

한 가지 간단한 방법은 WCF를 사용하는 것입니다. 수신자 응용 프로그램은 간단한 WCF 서비스를 호스팅 할 수 있으며 보낸 사람이 파일을 보낼 수 있습니다.

1

.NET 4는 memory-mapped files을 지원합니다. 이것들을 사용하면 파일 시스템 사용의 필요성을 피할 수 있습니다. 그러나 프로세스가 동일한 시스템에서 실행되고 있지 않으면 다른 접근 방법을 사용해야합니다 (다른 사람들이 언급 한 것처럼 WCF는 좋은 방법입니다).

0

여기에 한 .exe의 파일을 편집 할 수있는 가장 쉬운 방법입니다 수있는 경우 :

한 .exe 중 하나에 FileSystemWatcher 구성 객체를 추가하고, 예를 들어 특정 파일에 필터를 설정 "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() 

완료!

관련 문제