2011-07-07 51 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

@Erwin它看起来像一个操作系统线程映射到托管线程[是不可能](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)...但是它仍然禁用了编译器错误。 –