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