2012-02-15 4 views
2

Microsoft Windows APIコードパックを使用するC#アプリケーションがあります。特に、シェルデバイスの拡張機能を使用しています。除去。Windows APIコードパックを使用するC#アプリケーションシェル拡張機能はシャットダウンしません

しかし、Visual C#2010(Express)でアプリケーションを終了しようとすると、デバッガを手動で停止する必要があります。 ShellObjectWatcherを手動で破棄しても、Win APIコードパックにバックグラウンドループが存在しているように見えます。私がそれを殺すことができる唯一の方法は、デバッガを手動で停止することです。

アプリはWPFで構築されています。

最終的に、VisC#2010は、デバッガの下でアプリケーションを実行しようとすることをやめます。デバッグを開始するように指示しますが、デバッグは開始しません。もう一度やり直すには、タスクマネージャを使用してアプリケーションを終了し、その後VC#2010をシャットダウンするだけです。コーヒーを持ってから、もう一度起動してください。奇妙な私は隠されたプロセスやウィンドウがハングアップしていると思われますが、アプリケーションをクリーンアップしようとするとシャットダウンされません。

どのように私はこのShellObjectWatcherをもう少し効果的にクリーンアップすることができますか?

+0

"ShellObjectWatcher"クラスはありません、どのバージョンですか?シェルインターフェイスは常にCOMスレッドアフィニティを持っていますが、WPFまたはWinformsアプリケーションの[STAThread]からのみ使用してください。そうしないと、COMはオブジェクトをスレッドセーフなホームにするためにスレッドを開始します。 –

+0

Windows APIコードパック1.1の一部 コードパック内のmessaglistenerスレッドメソッドにぶら下がっているようです。 – Mark

+0

私もこれに遭遇しました。具体的には、MessageListener.ThreadMethod()はwhile(_running)の中でブロッキング呼び出しを持つため、Dispose()が_runningを設定してスレッドを終了しようとすると応答しません。どちらが当然ですか。したがって、これらのMessageListenerスレッドは決してクリーンアップされません。これは、バックグラウンドスレッドであれば問題ありませんが、そうではありません。 MSFT独自のShellObjectWatcherSampleWPFで同じ動作が確認できます。 – MNGwinn

答えて

2

:今

case (uint)WindowMessage.Destr​oy: 
**_running = false;** 
break; 

ThreadMethod()は、メッセージループを終了します。 、40行で、コンストラクタで、MessageListener.cs

1

OKを使用すると、System.Environment.Exit(0);がこの問題を修正します。アプリケーションがシャットダウンし、デバッガが制御を解放します。ブルートフォースはこの場合に機能します。 、コードパックシェルプロジェクトのバグを修正しMessageListener.WndProc()に1行を追加するには

0

は、私は同じ問題にぶつかったが、バックグラウンドスレッド(つまり、アプリケーションが停止したときに、それが殺されている)としてスレッドを設定することによってそれを解決しました私は持っています:

_windowThread = new Thread(ThreadMethod); 
// The line below will force the thread to terminate when the app exits. 
_windowThread.IsBackground = true; 
_windowThread.SetApartmentState(ApartmentState.STA); 
関連する問題