Подтвердить что ты не робот

Что заставляет брандмауэр Windows блокировать приложение?

У меня есть приложение Windows Forms, которое выполняется локально на рабочем столе пользователя. Единственный способ, которым он обращается к Интернету, - это запустить System.Diagnostics.Process.Start(url), чтобы запустить браузер по умолчанию пользователя и указать его на различные URL-адреса (чтобы проверить наличие обновлений, связаться с нами и т.д.). И ничто из этого не происходит, если пользователь явно запрашивает его, щелкнув пункт меню или кнопку.

На моей машине я случайно получал предупреждение о брандмауэре Windows при запуске программы, говоря, что брандмауэр Windows "заблокировал некоторые функции" программы для защиты компьютера. Иногда я получаю это предупреждение при запуске моей программы в Visual Studio (и в диалоговом окне предупреждения говорится, что vshost был заблокирован из сети). Это происходит не всегда.

Я не слышал от кого-либо из моих клиентов, что это происходит на их ПК, но это не значит, что это не так. И это несколько пугающее предупреждение для менее технически опытного пользователя, поэтому я хотел бы выяснить, как его устранить, если это возможно.

Что может сделать моя программа для запуска этого предупреждения?

Изменить: Единственная необычная вещь, которую моя программа делает при запуске, заключается в том, что она использует класс Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase для принудительного применения одного экземпляра приложения. Я знаю, что это заставляет задуматься над несколькими потоками, чтобы обнаружить новые экземпляры и перенаправить их. Возможно ли, что он прослушивает сеть по какой-то причине?

4b9b3361

Ответ 1

Брандмауэр Windows будет запускаться только в том случае, если ваша программа прослушивает порт - эффективно работает как сервер. System.Diagnostics.Process.Start не будет запускать брандмауэр Windows.

Вместо этого WindowsFormsApplicationBase, скорее всего, вызывает предупреждение брандмауэра, потому что WindowsFormsApplicationBase использует удаленный доступ, чтобы ощущать другие экземпляры. Используя отражатель, я нашел этот код в 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();

Пока вы используете WindowsFormsApplicationBase для своей функции SingleInstance, я ничего не знаю об этом.