2013-07-09 19 views
1

我需要创建一个单元测试来枚举给定.net解决方案的所有引用程序集的位置。我一直在寻找,一直没有找到适合这个问题的东西。列出给定.net解决方案的所有引用(不认为已加载)程序集

我在 Is there a way to force all referenced assemblies to be loaded into the app domain?Get the paths of all referenced assemblies

()方法为我们提供了已加载的程序集的GetAssemblies接过来一看。但我也想要那些尚未加载的程序集的路径。

简而言之,我只想知道在Visual Studio中展开各个项目的“参考”时看到的所有程序集的位置。

如果我看看.csproj文件,那么我可以看到所有的引用。可以有任何构建脚本解决方案吗?就是想。

想法?

感谢预期。

+1

如何在解决方案解析每一个* .csproj的文件?你会找到这些行' – rene

+0

是的。更新了问题。谢谢! –

+0

同意@rene这里 - 没有真正稳定的运行时解决方案,因为引用程序集不一定在构建之后仍然被引用(未使用的引用被删除)。此外,你有像阴影复制(asp.net和单元测试)和复杂的问题多个汇编位置的东西。因此,唯一真正稳定的方法是枚举项目级别的引用。 –

回答

1

这里是整个代码。第一种方法读取.sln文件并使用正则表达式识别.csproj文件。第二种方法需要在.csproj的文件的路径,并对其进行解析,找出引用的DLL的位置(注意,它不识别GAC安装组件) -

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

我相信你想获得完整解决方案中的所有dll引用列表。 所以首先获取当前解决方案的所有项目名单:

How do I programmatically list all projects in a solution?

现在有解决方案的所有项目名单,现在你可以读取.csproj的(每个项目)文件和读取标签在ItemGroup标签下。

就好像你会尝试使用任何内置函数来获取它,那么它只会给你那些被加载的程序集列表,但不会给出缺少(但引用)的程序集列表。

其他一些有用的类似链接:

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

酷!我会试试这个。 –

相关问题