Подтвердить что ты не робот

Как разузнавать тип в окне просмотра, если есть два типа с тем же именем

В окне просмотра я пытаюсь посмотреть TaskScheduler.Current, но это показывает мне следующую ошибку:

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

Это верно для моей программы, поскольку:

  • Это .NET 4.0 exe, который использует TaskScheduler out of mscorlib (CommonLanguageRuntimeLibrary)
  • В конце позднего связывания dll ссылается на старую Reactive Extensions.NET 3.5 System.Threading.dll, которая также имеет TaskScheduler в том же пространстве имен.

Вопрос: Какой синтаксис я могу использовать в отладчике для указания DLL TaskScheduler, который я хочу проверить?

В стороне: я полагаю, что нет проблемы (т.е. поведения undefined) в том смысле, что эти два одинаково названных типа приводятся в один и тот же исполняемый файл, правильно?

4b9b3361

Ответ 1

Я не уверен, работает ли это через окно просмотра (но я не понимаю, почему это не должно быть, кто знает), но способ устранения двусмысленности между двумя dll-ов с одинаковыми типами использует extern alias,

То же самое, что и global:: - за исключением того, что в этом случае вы можете использовать для определения псевдонимов dll.

Вы можете использовать его, установив/определяя псевдоним самостоятельно в dll reference (я думаю, что в свойствах есть псевдоним).

две разные библиотеки DLL с одинаковым пространством имен

Я не уверен, что это полностью относится к вашему делу, т.е. если вы в состоянии это сделать, но вам придется попробовать его в своем собственном случае.

EDIT: (на основе комментариев)

Учитывая специфику - я попробовал это в своем отладчике. Поскольку другой является поздним связыванием, компилятор не знает об этом (конечно, так как это не сработало).

Итак, в исходном коде (.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 для устранения неоднозначности при использовании неоднозначного типа?