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

Как я могу квалифицировать тип .NET с именем сборки для отладчика Visual Studio для устранения неоднозначности при использовании неоднозначного типа?

Я использую "Immediate Window" отладчиков VS для вызова статического API для класса, который является двусмысленным типом, определенным в двух разных сборках.

Сбой вызова со следующим сообщением: Тип foo существует как в blah.dll, так и bar.dll

Это сообщение имеет смысл, поскольку это действительно так. Мой вопрос: как я могу обойти это в отладчике, чтобы указать, какую сборку я хочу использовать для привязки этого типа?

Есть ли способ квалифицировать тип с именем сборки, в котором он определен?

Спасибо Bhavin.

4b9b3361

Ответ 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