Как я могу квалифицировать тип .NET с именем сборки для отладчика Visual Studio для устранения неоднозначности при использовании неоднозначного типа?
Я использую "Immediate Window" отладчиков VS для вызова статического API для класса, который является двусмысленным типом, определенным в двух разных сборках.
Сбой вызова со следующим сообщением:
Тип foo
существует как в blah.dll
, так и bar.dll
Это сообщение имеет смысл, поскольку это действительно так. Мой вопрос: как я могу обойти это в отладчике, чтобы указать, какую сборку я хочу использовать для привязки этого типа?
Есть ли способ квалифицировать тип с именем сборки, в котором он определен?
Спасибо
Bhavin.
Ответы
Ответ 1
Похоже, у вас есть два типа, которые имеют одно и то же имя и пространство имен, но живут в разных сборках? Если это так, к сожалению, нет способа устранить этот вызов в непосредственном окне. Непосредственное окно рассматривает оба этих типа в области видимости и поскольку имя сборки не может быть частью синтаксиса cast в С# или VB.Net, нет способа устранить эти типы.
Единственный вариант, который у вас есть, - создать альтернативный API отладки, который привязывается к тому или иному. Затем вызовите это во время сеанса отладки.
Ответ 2
Как предполагает Маслоу, можно использовать отражение, чтобы получить то, что вы хотите. Это не очень. Например, если вы хотите увидеть значение статического свойства My.Properties.Settings.Default
, тогда предполагается, что MainWindow
- это какой-то другой тип сборки (например, blah.dll
), который содержит значение, которое вы хотите отлаживать, это выражение получится вам значение:
System.Reflection.Assembly
.GetAssembly(typeof(MainWindow))
.GetType("My.Properties.Settings")
.GetProperty("Default")
.GetValue(null)
В этом примере My.Properties.Settings
- это тип, который определен в двух разных сборках.
Также можно вызвать методы и т.д., используя соответствующие инструменты из пространства имен System.Reflection
.
Ответ 3
Если вы не можете жить с помощью решения jaredpar, вы можете захотеть взглянуть на этот вопрос SO: Как устранить проблему в окне просмотра, когда два типа с тем же именем
Этот подход также можно использовать для Immediate Window с некоторым ограничением.
Вы в зависимости от того, где отладчик в настоящее время остановлен (думаю, желтая стрелка в левом поле редактора), похоже, он должен находиться в месте, где псевдоним был использован и все еще находится в области видимости.
Пример:
- Создать ClassLibrary2
- Создать ClassLibrary3
-
Создать ConsoleApplication1
-
Добавьте ClassLibrary2 в качестве ссылки на ConsoleApplication1 и измените свойства Псевдонимы от global до myAlias2
-
Добавьте ClassLibrary3 в качестве ссылки на ConsoleApplication1 и измените псевдонимы свойств с global на myAlias3
- изменить содержимое следующих файлов:
Program.cs:
namespace ConsoleApplication2
{
extern alias myAlias2;
extern alias myAlias3;
using myConsole2 = myAlias2::ClassLibrary.Console;
using myConsole3 = myAlias3::ClassLibrary.Console;
class Program
{
static void Main(string[] args)
{ // from now on you can use <code>myAlias2::ClassLibrary.Console.Write("ABC")</code> in Immediate Window
myConsole2.Write("ABC");
Write3();
// from now on you can use <code>myAlias2::ClassLibrary.Console.Write("ABC")</code> in Immediate Window
}
private static void Write3()
{ // in here you can use both aliases
myConsole3.Write("ABC");
}
}
}
ClassLibrary2/Class1.cs:
namespace ClassLibrary
{
public static class Console
{
public static void Write(string text)
{ // in here You cannot use the aliases in Immediate Window
System.Console.Write("===");
System.Console.Write(text);
System.Console.Write("===");
}
}
}
ClassLibrary3/Class1.cs:
namespace ClassLibrary
{
public static class Console
{
public static void Write(string text)
{ // in here You cannot use the aliases in Immediate Window
System.Console.Write("---");
System.Console.Write(text);
System.Console.Write("---");
}
}
}
Протестировано в VS2015 Community Edition