2009-10-15 35 views
11

我正在使用VS調試器的「立即窗口」在類中調用靜態API,該類是2個不同程序集中定義的模糊類型。如何使用Visual Studio調試器限定使用程序集名稱的.NET類型以在使用歧義類型時消除歧義?

調用失敗,出現以下消息: 類型foo兩個blah.dllbar.dll

此消息是有道理的,因爲這是真實的情況存在。我的問題是我如何在調試器中解決這個問題,以指定我想用於綁定這種類型的組件?

是否有一種方法來限定一個類型與它定義的程序集名稱?

謝謝 Bhavin。

+0

他們在同一個命名空間嗎?通常,不同的程序集使用不同的名稱空間? – Bahbar 2009-10-15 12:55:14

+0

它們位於相同的命名空間中。這是不幸的,我不能改變這些組件。 此外,API中的代碼完全相同,因此無論調試器選擇哪種類型都無關緊要 - 我只是希望它使用任何一種類型,但似乎無法使其發揮作用。 – bhavinb 2009-10-15 14:36:39

回答

7

這聽起來像你有兩種類型具有相同的名稱和命名空間,但生活在不同的程序集?如果是這樣,不幸的是,在直接窗口中無法消除這個呼叫的歧義。即時窗口認爲這兩種類型都在範圍之內,並且由於程序集名稱不能成爲C#或VB.Net中的轉換語法的一部分,因此無法消除這些類型的歧義。

您擁有的唯一選擇是創建一個替代的僅調試API,該API與其中一個綁定。然後在調試會話期間調用它。

+0

同樣適用於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

+0

@shambulator是,同樣適用於監視窗口。手錶,即時,當地人甚至懸停提示都是同一個底層數據引擎的視圖。如果一個人不能區分,那麼其他人也不可以 – JaredPar 2013-04-09 21:18:14

+0

謝謝;方便知道! – shambulator 2013-04-09 22:32:13

1

正如馬斯洛所說,有可能使用反射來獲得你想要的東西。儘管如此,它並不漂亮。例如,如果要查看靜態屬性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命名空間中的相應工具調用方法等。

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添加爲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社區版