2009-03-31 21 views
12

Mam aplikację Windows Forms, która działa lokalnie na pulpicie użytkownika. Jedynym sposobem uzyskania dostępu do Internetu jest System.Diagnostics.Process.Start (url), aby uruchomić domyślną przeglądarkę użytkownika i skierować ją do różnych adresów URL (aby sprawdzić aktualizacje, skontaktować się z nami itp.). I nic z tego nie dzieje się bez wyraźnego zażądania przez użytkownika przez kliknięcie elementu lub przycisku menu.Co powoduje, że Zapora systemu Windows blokuje aplikację?

Na moim komputerze od czasu do czasu pojawiał się komunikat ostrzegawczy Windows Firewall po uruchomieniu programu, mówiąc, że Zapora systemu Windows "zablokowała niektóre funkcje" programu, aby chronić urządzenie. Też czasami otrzymuję to ostrzeżenie podczas uruchamiania mojego programu w Visual Studio (a okno dialogowe ostrzeżenia mówi, że vshost został zablokowany z sieci). Nie zdarza się to cały czas.

Nie słyszałem od żadnego z moich klientów, że dzieje się to na ich komputerach, ale to nie znaczy, że nie jest. Jest to nieco przerażające ostrzeżenie dla mniej doświadczonego technicznie użytkownika, więc chciałbym dowiedzieć się, jak go wyeliminować, jeśli to możliwe.

Co może zrobić mój program, aby wywołać to ostrzeżenie?

Edycja: Jedyną nieco dziwną rzeczą, którą mój program robi podczas uruchamiania, jest użycie klasy Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase w celu wymuszenia stosowania pojedynczej aplikacji. Wiem, że za kulisami pojawia się jakaś magia, która wykrywa nowe instancje i przekierowuje je. Czy to możliwe, że słucha w sieci z jakiegoś powodu?

Odpowiedz

7

Zapora systemu Windows będzie uruchamiana tylko wtedy, gdy Twój program nasłuchuje na porcie - działając skutecznie jako serwer. System.Diagnostics.Process.Start nie uruchomi Zapory systemu Windows.

Zamiast tego, WindowsFormsApplicationBase prawdopodobnie powoduje ostrzeżenie zapory, ponieważ funkcja WindowsFormsApplicationBase używa zdalnego serwera do wykrywania innych instancji. Korzystanie z reflektora, znalazłem ten kod w WindowsFormsApplicationBase.Run():

TcpChannel channel = this.RegisterChannel(secureChannel); 
RemoteCommunicator communicator = new RemoteCommunicator(this, this.m_MessageRecievedSemaphore); 
string uRI = applicationInstanceID + ".rem"; 
new SecurityPermission(SecurityPermissionFlag.RemotingConfiguration).Assert(); 
RemotingServices.Marshal(communicator, uRI); 
CodeAccessPermission.RevertAssert(); 
string uRL = channel.GetUrlsForUri(uRI)[0]; 
this.WriteUrlToMemoryMappedFile(uRL); 
this.m_FirstInstanceSemaphore.Set(); 
this.DoApplicationModel(); 

Dopóki używasz WindowsFormsApplicationBase jego funkcji SingleInstance, nie wiem o żadnym wokół tego.

+0

To jest rzecz - nie ma niczego, co oczywiście nasłuchuje na każdym porcie. Ostrzeżenie pojawia się zarówno w programie Visual Studio, jak i po uruchomieniu zainstalowanego pliku wykonywalnego. –

+0

Jedną rzeczą, która jest trochę niezwykła jest to, że używam Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase do wymuszania pojedynczej instancji aplikacji. To sprawia, że ​​wątki są za kulisami; Zastanawiam się, czy to może być podsłuchiwanie w sieci dla zdalnych procesów. –

+1

Otwórz wiersz polecenia i uruchom "netstat -b", gdy program jest uruchomiony, aby sprawdzić, czy nasłuchuje na dowolnym porcie. – Greg

Powiązane problemy