2013-07-09 17 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

酷!我會試試這個。 –

相關問題