2009-03-31 10 views
12

Tengo una aplicación de Windows Forms que se ejecuta localmente en el escritorio del usuario. La única forma en que accede a Internet es haciendo System.Diagnostics.Process.Start (url) para iniciar el navegador predeterminado del usuario y señalarlo a varias URL (para buscar actualizaciones, contactarnos, etc.). Y nada de esto sucede sin que el usuario lo solicite explícitamente al hacer clic en un elemento o botón de menú.¿Qué hace que Windows Firewall bloquee una aplicación?

En mi máquina he estado recibiendo ocasionalmente un mensaje de advertencia de Windows Firewall al iniciar el programa, diciendo que Windows Firewall ha "bloqueado algunas funciones" del programa para proteger la máquina. También recibo ocasionalmente esta advertencia cuando ejecuto mi programa dentro de Visual Studio (y el cuadro de diálogo de advertencia dice que vshost se ha bloqueado de la red). No sucede todo el tiempo.

No he tenido noticias de ninguno de mis clientes de que esto haya estado sucediendo en sus PC, pero eso no significa que no lo sea. Y es una advertencia algo aterradora para un usuario menos experto en tecnología, así que me gustaría descubrir cómo eliminarla si es posible.

¿Qué podría estar haciendo posiblemente mi programa para activar esta advertencia?

Editar: Lo único inusual que mi programa está haciendo al inicio es que utiliza la clase Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase para aplicar una sola aplicación de instancia. Sé que esto hace un poco de magia de enredo entre bastidores para detectar nuevas instancias y redirigirlas. ¿Es posible que esté escuchando en la red por alguna razón?

Respuesta

7

Windows Firewall solo se activará si su programa está escuchando en un puerto, actuando efectivamente como un servidor. System.Diagnostics.Process.Start no activará Firewall de Windows.

En su lugar, es probable que WindowsFormsApplicationBase esté causando la advertencia del firewall, porque WindowsFormsApplicationBase utiliza la comunicación remota para detectar otras instancias de sí mismo. El uso del reflector, me encontré con este código en 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(); 

Como siempre y cuando utilice WindowsFormsApplicationBase por su característica SingleInstance, no sé de ninguna manera de evitar esto.

+0

Esa es la cuestión: obviamente, no hay nada que escuche en los puertos. La advertencia se produce tanto en Visual Studio como cuando ejecuto el ejecutable instalado. –

+0

Lo único que es un poco inusual es que utilizo Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase para hacer cumplir una aplicación de instancia única. Esto hace threading cosas detrás de las escenas; Me pregunto si podría estar escuchando en la red cosas de procesos remotos. –

+1

Abra el símbolo del sistema y ejecute "netstat -b" mientras el programa se está ejecutando para ver si está escuchando en algún puerto. – Greg

Cuestiones relacionadas