我正在使用VS調試器的「立即窗口」在類中調用靜態API,該類是2個不同程序集中定義的模糊類型。如何使用Visual Studio調試器限定使用程序集名稱的.NET類型以在使用歧義類型時消除歧義?
調用失敗,出現以下消息: 類型foo
兩個blah.dll
和bar.dll
此消息是有道理的,因爲這是真實的情況存在。我的問題是我如何在調試器中解決這個問題,以指定我想用於綁定這種類型的組件?
是否有一種方法來限定一個類型與它定義的程序集名稱?
謝謝 Bhavin。
我正在使用VS調試器的「立即窗口」在類中調用靜態API,該類是2個不同程序集中定義的模糊類型。如何使用Visual Studio調試器限定使用程序集名稱的.NET類型以在使用歧義類型時消除歧義?
調用失敗,出現以下消息: 類型foo
兩個blah.dll
和bar.dll
此消息是有道理的,因爲這是真實的情況存在。我的問題是我如何在調試器中解決這個問題,以指定我想用於綁定這種類型的組件?
是否有一種方法來限定一個類型與它定義的程序集名稱?
謝謝 Bhavin。
這聽起來像你有兩種類型具有相同的名稱和命名空間,但生活在不同的程序集?如果是這樣,不幸的是,在直接窗口中無法消除這個呼叫的歧義。即時窗口認爲這兩種類型都在範圍之內,並且由於程序集名稱不能成爲C#或VB.Net中的轉換語法的一部分,因此無法消除這些類型的歧義。
您擁有的唯一選擇是創建一個替代的僅調試API,該API與其中一個綁定。然後在調試會話期間調用它。
同樣適用於Watch窗口(在VS2010中)?我在尋找關於[這個問題]的更多信息時發現了你的答案(http://stackoverflow.com/questions/15882391/how-to-disambiguate-type-in-watch-window-when-there-are-two - 類型相同),聽起來就像兩種情況是可比的。 – shambulator 2013-04-09 07:26:02
@shambulator是,同樣適用於監視窗口。手錶,即時,當地人甚至懸停提示都是同一個底層數據引擎的視圖。如果一個人不能區分,那麼其他人也不可以 – JaredPar 2013-04-09 21:18:14
謝謝;方便知道! – shambulator 2013-04-09 22:32:13
正如馬斯洛所說,有可能使用反射來獲得你想要的東西。儘管如此,它並不漂亮。例如,如果要查看靜態屬性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
命名空間中的相應工具調用方法等。
如果無法通過jaredpar與解決生活你可能想看一看這太問題:How to disambiguate type in watch window when there are two types with the same name
這種方法也可採取即時窗口有一定的侷限性雖然。 您正在取決於調試器當前停止的位置(認爲編輯器左邊的黃色箭頭),看起來它必須位於別名已被使用且仍在範圍內的位置。
例子:
創建ConsoleApplication1
添加ClassLibrary2作爲參考ConsoleApplication1並改變全球的財產別名myAlias2
將ClassLibrary3添加爲refe倫斯到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社區版
他們在同一個命名空間嗎?通常,不同的程序集使用不同的名稱空間? – Bahbar 2009-10-15 12:55:14
它們位於相同的命名空間中。這是不幸的,我不能改變這些組件。 此外,API中的代碼完全相同,因此無論調試器選擇哪種類型都無關緊要 - 我只是希望它使用任何一種類型,但似乎無法使其發揮作用。 – bhavinb 2009-10-15 14:36:39