【问题标题】:How to disambiguate type in watch window when there are two types with the same name当有两种同名类型时如何在监视窗口中消除类型的歧义
【发布时间】:2013-04-08 14:56:34
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 有趣的问题!不应该有任何歧义;对类型的引用都通过包含程序集来限定。但我不知道是否有任何方法可以在调试器中限定引用...

标签: c# visual-studio-2010


【解决方案1】:

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

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

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

two different DLL with same namespace

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

编辑:(基于 cmets)

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

因此,在您的源代码(无论如何您都需要监视的.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 添加别名 - 您可以添加多个别名,使用 , 分开,效果很好,

4) 添加extern alias <your alias>,

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

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


@JaredPar 对此的确认
How can I qualify a .NET type with assembly name for Visual Studio debugger to disambiguate while using an ambiguous type?

【讨论】:

  • 我没有任何extern alias。我直接引用 mscorlib。 System.Threading.dll 通过后期绑定进来。考虑到这一点,不清楚你建议我在监视窗口中输入什么以消除歧义。
  • 尝试global:: - 你至少可以在代码中执行以下操作var current = global::System.Threading.Tasks.TaskScheduler.Current;。我仍然不知道其他 dll 是否会干扰。
  • 啊,我明白了。好的,我试过global::System.Threading.Tasks.TaskScheduler,但我得到了同样的错误信息。这对我来说很有意义,因为它们都在全局命名空间中(因为它们不是通过 extern alias 引入的)
  • 好的,会到达那里的 :) - 这是另一个 - 我在调试器中尝试过。由于另一个是后期绑定 - 编译器不知道它(当然,因为它不起作用)。因此,在您的源代码(无论如何您都需要监视的.cs)中,在顶部添加例如using mysystem = global::System.Threading.Tasks.TaskScheduler;。然后在手表mysystem.Current(我以我的例子为基础)。
  • @MattSmith 我认为按照此答案中的详细说明解决它是您将获得的最接近的方法。我找到了similar question about the Immediate window,并从 JaredPar 那里得到了非常明确的答复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多