我正在使用VS调试器的“立即窗口”来调用类上的静态API,该类是在2个不同的程序集中定义的模糊类型。
调用失败,并显示以下消息:
foo
和blah.dll
bar.dll
类型
这个消息很有意义,因为确实如此。我的问题是如何在调试器中解决这个问题,以指定我想用于绑定此类型的程序集?
是否有办法使用在其中定义的程序集名称来限定类型?
由于 Bhavin。
答案 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
这种方法也可用于立即窗口但有一些限制。 您取决于调试器当前停止的位置(想想编辑器左边缘的黄色箭头),它似乎必须位于已使用别名且仍在范围内的位置。
示例:
创建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社区版中测试