13


1

ユーザーのデスクトップ上でローカルに実行されるWindowsフォームアプリケーションがあります。 インターネットにアクセスする唯一の方法は、System.Diagnostics.Process.Start(url)を実行してユーザーの既定のブラウザを起動し、さまざまなURLを指定することです(更新の確認、お問い合わせなど)。 ユーザーがメニュー項目またはボタンをクリックして明示的に要求しない限り、これは起こりません。

私のマシンでは、プログラムの起動時に、Windowsファイアウォールがマシンの保護のためにプログラムの「いくつかの機能をブロックしている」という警告メッセージを受け取ることがあります。 プログラムをVisual Studio内で実行しているときにもこの警告が表示されることがあります(警告ダイアログに、vshostがネットワークからブロックされていることが表示されます)。 いつも起こるわけではありません。

私の顧客からは、これが彼らのPCで起こっていると聞いたことはありませんが、そうではないというわけではありません。 そして、それは技術的に精通していないユーザへのいくぶん怖い警告です、それで私はそれを可能ならば排除する方法を見つけたいと思います。

この警告を引き起こすために私のプログラムは何をしている可能性がありますか?

編集:私のプログラムが起動時にやっている唯一のやや珍しいことはそれがシングルインスタンスアプリケーションを強制するためにMicrosoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBaseクラスを使うということです。 私はこれが新しいインスタンスを検出してそれらをリダイレクトするために舞台裏でいくらかのスレッドマジックをすることを知っています。 何らかの理由でネットワークで待機している可能性はありますか?

1 Answer


7


Windowsファイアウォールは、プログラムがポートをリッスンしている場合にのみトリガされます - 事実上サーバーとして機能します。 System.Diagnostics.Process.StartはWindowsファイアウォールを起動しません。

代わりに、WindowsFormsApplicationBaseがファイアウォールの警告を引き起こしている可能性があります。WindowsFormsApplicationBaseは、リモート処理を使用してそれ自体の他のインスタンスを検出するためです。 リフレクタを使用して、私はWindowsFormsApplicationBase.Run()でこのコードを見つけました:

TcpChannel channel = this.RegisterChannel(secureChannel); RemoteCommunicator communicator = new RemoteCommunicator(これ、this.m_MessageRecievedSemaphore);ストリングuRI = applicationInstanceID ".rem"; new SecurityPermission(SecurityPermissionFlag.RemotingConfiguration).Assert(); RemotingServices.Marshal(コミュニケータ、uRI)。 CodeAccessPermission.RevertAssert();文字列uRL = channel.GetUrlsForUri(uRI)[0]; this.WriteUrlToMemoryMappedFile(uRL); this.m_FirstInstanceSemaphore.Set(); this.DoApplicationModel();

SingleInstance機能にWindowsFormsApplicationBaseを使用している限り、これを回避する方法はわかりません。