我有一个在用户桌面上本地运行的Windows窗体应用程序。它访问Internet的唯一方法是通过执行System.Diagnostics.Process.Start(url)来启动用户的默认浏览器并将其指向各种URL(以检查更新,联系我们等)。如果没有用户通过单击菜单项或按钮明确请求它,就不会发生这种情况。
在我的计算机上,我偶尔会在启动程序时收到Windows防火墙警告消息,说Windows防火墙已“阻止程序的某些功能”以保护计算机。在Visual Studio中运行我的程序时,我偶尔会收到此警告(并且警告对话框显示vshost已被阻止从网络中)。它不会一直发生。
我没有从我的任何客户那里听说过这种情况发生在他们的电脑上,但这并不意味着事实并非如此。这对于技术水平较低的用户来说是一个有点可怕的警告,所以我想弄清楚如何在可能的情况下消除它。
我的程序可能会采取什么措施来触发此警告?
编辑:我的程序在启动时唯一不寻常的事情是它使用Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase类来强制执行单个实例应用程序。我知道这会在幕后发现一些线程魔法来检测新实例并重定向它们。是否有可能出于某种原因在网络上收听?
答案 0 :(得分:7)
只有当您的程序正在侦听端口时才会触发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功能,我就不知道如何解决这个问题。