2013-07-09 8 views
1

Je dois créer un test unitaire pour énumérer les emplacements de tous les assemblages référencés pour une solution .net donnée. J'ai cherché et n'ai pas été capable de trouver quelque chose qui convient au problème.Liste de tous les assemblages référencés (ne pensez pas chargés) pour une solution .net donnée

J'ai regardé Is there a way to force all referenced assemblies to be loaded into the app domain? et Get the paths of all referenced assemblies

La méthode GetAssemblies() nous donne les assemblées qui ont été chargés. Mais je veux aussi les chemins de ces assemblées qui n'ont pas été chargées. Pour parler simplement, je veux juste connaître les emplacements de tous les assemblages que je vois lorsque je développe les 'références' des différents projets dans Visual Studio.

Si je regarde les fichiers .csproj alors je peux voir toutes les références. Pourrait-il y avoir une solution scripty build à cela? Je me demandais juste.

Des idées?

En remerciant par anticipation.

+1

Que diriez-vous de l'analyse chaque fichier * .csproj dans la solution ? Vous recherchez ces lignes '' – rene

+0

Yup. Mise à jour de la question Merci! –

+0

D'accord avec @rene ici - il n'y a pas de solution d'exécution vraiment stable car un assembly référencé n'est pas nécessairement référencé après une construction (les références inutilisées sont effacées). De plus, vous avez des choses comme la copie d'ombre (asp.net et tests unitaires) et plusieurs lieux d'assemblage qui compliquent les choses. Par conséquent, la seule manière vraiment stable est d'énumérer les références au niveau du (des) projet (s). –

Répondre

1

Voici le code général. La première méthode lit le fichier .sln et identifie les fichiers .csproj en utilisant regex. La seconde méthode prend dans le chemin du fichier .csproj et parse pour trouver des emplacements dll référencés (notez qu'il n'identifie GAC installé ensembles) -

public void GetAllCSProjectFiles() 
{ 
var Content = File.ReadAllText("PathTo.sln"); 
     Regex projReg = new Regex(
      "Project\\(\"\\{[\\w-]*\\}\"\\) = \"([\\w _]*.*)\", \"(.*\\.(cs|vcx|vb)proj)\"" 
      , RegexOptions.Compiled); 
     var matches = projReg.Matches(Content).Cast<Match>(); 
     var Projects = matches.Select(x => x.Groups[2].Value).ToList(); 
     for (int i = 0; i < Projects.Count; ++i) 
     { 
      if (!Path.IsPathRooted(Projects[i])) 
       Projects[i] = Path.Combine(Path.GetDirectoryName("PathTo.sln"), 
        Projects[i]); 
      Projects[i] = Path.GetFullPath(Projects[i]); 

      CheckForDllReferences(Projects[i]); 
     } 
} 

public static void CheckForDllReferences(String csprojFile) 
    { 
     XmlDocument xdDoc = new XmlDocument(); 
     xdDoc.Load(csprojFile); 

     XmlNamespaceManager xnManager = 
     new XmlNamespaceManager(xdDoc.NameTable); 
     xnManager.AddNamespace("tu", 
     "http://schemas.microsoft.com/developer/msbuild/2003"); 

     XmlNode xnRoot = xdDoc.DocumentElement; 
     XmlNodeList xnlPages = xnRoot.SelectNodes("//tu:HintPath", xnManager); 

     foreach (XmlNode node in xnlPages) 
     { 
      string location = node.InnerText.ToLower(); 
      //do something 
     } 
    } 
1

Je crois que vous voulez obtenir la liste de toutes les références de dll en solution complète. donc d'abord obtenir la liste de tous les projets de solution actuelle:

How do I programmatically list all projects in a solution?

maintenant aura la liste de tous les projets de la solution, vous pouvez maintenant lire les fichiers .csproj (de chaque projet) et lire l'étiquette sous la balise ItemGroup.

comme si vous essaieriez de l'obtenir en utilisant n'importe quelle fonction intégrée alors il ne vous donnera que la liste des assemblys qui ont été chargés .. mais ne donnera pas la liste des assemblages manquants (mais référencés).

D'autres liens similaires utiles:

Resolve assembly references from another folder

http://www.codeproject.com/Questions/88183/How-to-get-all-dll-name-which-is-reference-in-C-pr

+0

Cool! Je vais essayer ça. –

Questions connexes