2009-10-15 3 views
11

J'utilise les débogueurs VS 'Immediate Window' pour appeler une API statique sur une classe qui est un type ambigu défini dans 2 assemblages différents.Comment puis-je qualifier un type .NET avec un nom d'assembly pour que le débogueur Visual Studio désambiguise en utilisant un type ambigu?

L'appel échoue avec le message suivant: Le type foo existe dans blah.dll et bar.dll

Ce message est logique puisque cela est effectivement le cas. Ma question est comment puis-je contourner cela dans le débogueur pour spécifier l'assembly que je veux utiliser pour lier ce type?

Existe-t-il un moyen de qualifier un type avec le nom d'assembly dans lequel il est défini?

Remerciements Bhavin.

+0

sont-ils dans le même espace de noms? Habituellement, différents assemblys utilisent des espaces de noms différents? – Bahbar

+0

Ils sont dans le même espace de noms. C'est malheureux et je ne peux pas changer ces assemblages. De plus, le code de l'API est exactement le même, peu importe le type choisi par le débogueur - je veux juste qu'il en utilise un mais je n'arrive pas à le faire fonctionner. – bhavinb

Répondre

7

Il semble que vous ayez deux types qui ont le même nom et l'espace de noms, mais qui vivent dans des assemblages différents? Si tel est le cas, malheureusement il n'y a aucun moyen de désambiguïser cet appel dans la fenêtre immédiate. La fenêtre immédiate considère que ces deux types sont dans la portée et puisque le nom de l'assembly ne peut pas faire partie de la syntaxe de transtypage en C# ou VB.Net, il n'y a aucun moyen de désambiguïser ces types. La seule option que vous avez est de créer une API de débogage alternative qui se lie à l'un ou à l'autre. Puis appelez ceci pendant la session de débogage.

+0

La même chose s'applique-t-elle à la fenêtre de surveillance (dans VS2010)? J'ai trouvé cette réponse à vous en cherchant plus d'informations sur [cette question] (http://stackoverflow.com/questions/15882391/how-to-disambiguate-type-in-watch-window-when-there-are-two -types-avec-le-même), et on dirait que les deux situations sont comparables. – shambulator

+0

@shambulator oui la même chose s'applique à la fenêtre de la montre. La montre, l'immédiat, les locaux et même les conseils de survol sont tous des vues sur le même moteur de données sous-jacent. Si l'on ne peut pas différencier, les autres ne peuvent pas non plus – JaredPar

+0

Merci; pratique à savoir! – shambulator

1

Comme le suggère Maslow, il est possible d'utiliser la réflexion pour obtenir ce que vous voulez. Ce n'est pas joli, cependant. Par exemple, si vous voulez voir la valeur de la propriété statique My.Properties.Settings.Default, en supposant que MainWindow est un autre type dans l'assembly (par exemple blah.dll) qui contient la valeur que vous voulez déboguer, cette expression vous obtiendra la valeur:

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

Dans cet exemple, My.Properties.Settings est un type défini dans deux assemblys différents.

Il est également possible d'appeler des méthodes, etc. en utilisant les outils appropriés de l'espace de noms System.Reflection.

0

Si vous ne pouvez pas vivre avec une solution par JaredPar Vous pouvez jeter un oeil à cette question SO: How to disambiguate type in watch window when there are two types with the same name

Cette approche peut également prendre pour fenêtre immédiate avec une certaine limitation cependant. Vous dépendez de l'endroit où le débogueur est actuellement arrêté (pensez à la flèche jaune dans la marge de gauche de l'éditeur) il semble qu'il doit se trouver à un emplacement où l'alias a été utilisé et est toujours dans la portée.

Exemple:

  • Créer ClassLibrary2
  • Créer ClassLibrary3
  • Créer ConsoleApplication1

  • Ajouter ClassLibrary2 comme référence à ConsoleApplication1 et modifier les alias de propriété du global au myAlias2

  • Ajouter ClassLibrary3 comme refe Renče à ConsoleApplication1 et modifier les alias de propriété du global au myAlias3

  • modifier le contenu des fichiers suivants:

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("---"); 
     } 
    } 
} 

Testé dans VS2015 Community Edition

Questions connexes