2009-03-31 41 views
12

私は、ユーザーのデスクトップ上でローカルに実行されるWindowsフォームアプリケーションを持っています。インターネットにアクセスする唯一の方法は、System.Diagnostics.Process.Start(url)を実行してユーザーの既定のブラウザーを起動し、さまざまなURL(更新の確認、連絡先など)を指定することです。また、メニュー項目やボタンをクリックして明示的に要求しなくても、このようなことは起こりません。Windowsファイアウォールがアプリケーションをブロックする原因は何ですか?

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

これは自分のパソコンで起こっているとは聞いていませんが、そうではありません。それはあまり技術的に精通していないユーザーにとっては恐ろしい警告です。可能であれば、それを排除する方法を理解したいと思います。

私のプログラムはこの警告を引き起こす可能性がありますか?

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

答えて

7

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

代わりに、WindowsFormsApplicationBaseは、WindowsFormsApplicationBaseがremotingを使用して他のインスタンスを検出するため、ファイアウォールの警告を発する可能性があります。反射鏡を使用して、私は)(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を使用して、私はこの周りにどのような方法を知りません。

+0

これは問題です。明らかにポートをリッスンしていることはありません。この警告は、Visual Studioとインストールされた実行可能ファイルを実行するときに発生します。 –

+0

少し珍しいことの1つは、Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBaseを使用して単一のインスタンスアプリケーションを実行することです。これはシーンの裏側にあるスレッドを処理します。私はそれがリモートプロセスのものをネットワーク上で聞くことができるのだろうかと思います。 –

+1

コマンドプロンプトを開き、プログラムが実行されている間に "netstat -b"を実行して、すべてのポートでリッスンしているかどうかを確認します。 – Greg

関連する問題