在使用模糊类型时,如何使用Visual Studio调试器的程序集名称限定.NET类型以消除歧义?

时间:2009-10-15 12:05:15

标签: visual-studio debugging

我正在使用VS调试器的“立即窗口”来调用类上的静态API,该类是在2个不同的程序集中定义的模糊类型。

调用失败,并显示以下消息: fooblah.dll

中都存在bar.dll类型

这个消息很有意义,因为确实如此。我的问题是如何在调试器中解决这个问题,以指定我想用于绑定此类型的程序集?

是否有办法使用在其中定义的程序集名称来限定类型?

由于 Bhavin。

3 个答案:

答案 0 :(得分:7)

听起来你有两种类型和命名空间但存在于不同程序集中的类型?如果是这种情况,遗憾的是,无法在即时窗口中消除此呼叫的歧义。即时窗口考虑这两种类型都在范围内,因为程序集名称不能是C#或VB.Net中的转换语法的一部分,所以无法消除这些类型的歧义。

您唯一的选择是创建一个备用的仅调试API,它绑定到一个或另一个。然后在调试会话期间调用它。

答案 1 :(得分:1)

正如马斯洛所说,可以使用反射来获得你想要的东西。但它并不漂亮。例如,如果要查看静态属性My.Properties.Settings.Default的值,则假设MainWindow是程序集中的其他类型(例如blah.dll),其中包含您想要的值debug,这个表达式将为您提供值:

System.Reflection.Assembly
    .GetAssembly(typeof(MainWindow))
    .GetType("My.Properties.Settings")
    .GetProperty("Default")
    .GetValue(null)

在此示例中,My.Properties.Settings是在两个不同程序集中定义的类型。

也可以使用System.Reflection命名空间中的相应工具调用方法等。

答案 2 :(得分:0)

如果你不能忍受解决方案 jaredpar 你可能想看看这个问题:How to disambiguate type in watch window when there are two types with the same name

这种方法也可用于立即窗口但有一些限制。 您取决于调试器当前停止的位置(想想编辑器左边缘的黄色箭头),它似乎必须位于已使用别名且仍在范围内的位置。

示例:

  • 创建ClassLibrary2
  • 创建ClassLibrary3
  • 创建ConsoleApplication1

  • 添加ClassLibrary2作为对ConsoleApplication1的引用,并将属性别名从全局更改为myAlias2

  • 添加ClassLibrary3作为对ConsoleApplication1的引用,并将属性别名从全局更改为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社区版中测试