15

在监视窗口中,我试图查看TaskScheduler.Current,但它向我显示以下错误:

The type 'System.Threading.Tasks.TaskScheduler' exists in both 
'CommonLanguageRuntimeLibrary' and 'System.Threading.dll'   

这对我的程序来说是正确的,因为:

  • 这是一个 .NET 4.0 exe,它使用TaskScheduler了 mscorlib (CommonLanguageRuntimeLibrary)
  • 一个 dll 是通过后期绑定引入的,它引用了一个旧的 Reactive Extensions .NET 3.5 System.Threading.dll,它也具有TaskScheduler相同的命名空间。

问题:我可以在调试器中使用什么语法来指定TaskScheduler我要检查的 dll?

顺便说一句:我认为将这两个同名类型带入同一个可执行文件没有问题(即没有未定义的行为),对吧?

4

1 回答 1

4

我不确定这是否可以通过监视窗口工作(但我不明白为什么它不应该,谁知道) - 但是在两个具有相同类型的 dll-s 之间消除歧义的方法是使用extern alias.

这与global::- 相同,只是在这种情况下您可以使用指定 dll 别名。

您可以通过在 dll 引用上自己设置/定义别名来使用它(我认为属性中有别名字段)。

具有相同命名空间的两个不同的 DLL

我不确定这是否完全适用于您的情况,即您是否能够做到这一点,但您必须在自己的情况下进行尝试。

编辑:(基于评论)

鉴于具体情况 - 我在调试器中尝试过。由于另一个是后期绑定 - 编译器不知道它(当然,因为它不起作用)。

因此,在您的源代码中(无论如何您都需要监视的.cs)在顶部添加例如

using mysystem = global::System.Threading.Tasks.TaskScheduler;  

然后在手表中mysystem.Current(我以我的例子为基础)

或者...

using mytasks = global::System.Threading.Tasks;  

mytasks.TaskScheduler- 真的不重要。

EDIT2:
出于历史原因 - 我有点确认代码编辑是不可避免的。

1)mscorlib从项目中删除 - 项目、设置、构建、高级。

2)手动卸载和编辑项目配置——添加mscorlib引用(不允许通过VS添加)。WPF 应用程序还需要另一个修复程序(此处超出范围),

3) 为 mscorlib 添加别名 - 您可以添加多个别名,单独使用 w/ ,,效果很好,

4) 添加extern alias <your alias>,

从那时起,您可以在调试器中引用它——但没有办法放弃手册code editing。外部别名也是每个“建筑单元”,即文件,所以没有全局。

简而言之,这是我们能做的最好的事情,恕我直言。


并且来自@JaredPar 对此的确认
我如何使用程序集名称限定 .NET 类型,以便 Visual Studio 调试器在使用不明确的类型时消除歧义?

于 2013-04-08T20:03:39.127 回答