2011-07-07 7 views
0

VS拡張プロジェクトでは、プロセススレッドのマッピングを作成し、EnvDTE.Thread(FreezeメソッドとThawメソッドにアクセスする)とSystem.Threading.Thread(ManagedThreadIdプロパティにアクセスする)の両方にキャストしようとしています。EnvDTE.ThreadからSystem.Threading.Threadへのキャストを強制するにはどうすればいいですか?

理想的には以下のようにする必要がありますが、キャストはSystem.Threading.ThreadからEnvDTE.Threadにキャストできないと言ってコンパイルしません。

var threads = new Dictionary<EnvDTE.Thread, System.Threading.Thread>(); 
foreach (System.Threading.Thread thread in this.dte.Debugger.CurrentProgram.Threads) { 
    threads.Add((EnvDTE.Thread)thread, thread); 
} 

どのように私は(私はここで何かが欠けていなければ)、それは例外をスローしないであろうことを知って、キャストを強制することができますか?

編集:InvalidCastExceptionをスローします。

答えて

0

あなたが得ているコンパイルエラーはちょっとした赤ちゃんです。

Debugger.CurrentProgram.ThreadsはすでにEnvDTE.Threadオブジェクトのコレクションを返しますので、名前を越えて、それらのクラスの間には関係がないのでSystem.Threading.Threadにそれらをキャストしようとすると、あなたのforeachは失敗します。

EnvDTE.Threadは、IDの特性を有する。それはSystem.Threading.Threadに変換することなく、あなたが望むことをするでしょうか?

+0

ああ、IDプロパティはManagedThreadIdではありませんが、これはSystem.Threading.Threadから逃した唯一の情報です。 EnvDTE.ThreadまたはSystem.Threading.Threadへのキャストは、両方ともループ変数宣言で実行されていれば動作します。 ここでは、CurrentProgram.Threadsオブジェクトを2回繰り返し処理することを避けようとしています。 –

+2

@Erwin OSスレッドを管理対象スレッドにマッピングするように見える[不可能](http://stackoverflow.com/questions/1749541/getting-from-processthread-to-a-managed-thread) –

+0

ありがとう、アンナ、確かに不可能と思われます。 Process.GetCurrentProcess()でマッピングを行うことも不可能です。一致するIDがないためスレッドです。私はこの時間のために不運です。 –

1

最初にオブジェクトにキャストしようとしましたか?

threads.Add((EnvDTE.Thread)(object)thread, thread); 
+0

ちょうど試しましたが、動作しません(実行時にSystem.InvalidCastExceptionが発生します)...しかし、それでもコンパイラエラーは無効になりました。 –

関連する問題