Pregunta

Tengo una aplicación de Windows Forms que se ejecuta localmente en el escritorio del usuario. La única forma en que se accede a Internet es haciendo System.Diagnostics.Process.Start (URL) para iniciar el navegador por defecto del usuario y el punto a varias direcciones URL (para comprobar si hay actualizaciones, póngase en contacto con nosotros, etc.). Y nada de esto sucede sin que el usuario solicita explícitamente haciendo clic en un elemento o botón de menú.

En mi máquina que se han dado casos recibiendo un mensaje de advertencia Firewall de Windows al arrancar el programa, diciendo que el Firewall de Windows ha "bloqueado algunas características" del programa para proteger la máquina. También de vez en cuando sale este aviso al ejecutar mi programa dentro de Visual Studio (y el diálogo de advertencia dice que vshost ha sido bloqueado de la red). Esto no sucede todo el tiempo.

No he oído de cualquiera de mis clientes de que esto ha estado sucediendo en sus PCs, pero eso no significa que no lo es. Y es una advertencia poco de miedo a un usuario menos experto en tecnología, así que me gustaría averiguar cómo eliminarlo si es posible.

¿Qué podría posiblemente ser mi programa haciendo para desencadenar esta advertencia?

Edit: Lo único un poco inusual mi programa está haciendo en el arranque es que utiliza la clase Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase para hacer cumplir una aplicación de instancia única. Sé que esto lo hace un poco de magia enhebrado entre bastidores para detectar nuevos casos y redirigirlos. ¿Es posible que se escucha en la red por alguna razón?

¿Fue útil?

Solución

Firewall de Windows sólo se activa si el programa está escuchando en un puerto - actuando efectivamente como un servidor. System.Diagnostics.Process.Start no activará el Firewall de Windows.

En lugar de ello, es probable WindowsFormsApplicationBase causando la advertencia cortafuegos, porque WindowsFormsApplicationBase utiliza interacció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, yo no sé de ninguna manera de evitar esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top