15

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

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

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

この警告をトリガーするために、私のプログラムはおそらく何をしている可能性がありますか?

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

4

1 に答える 1

8

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

代わりに、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();

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

于 2009-03-31T04:42:43.797 に答える