這裏是整個代碼。第一種方法讀取.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
}
}
如何在解決方案解析每一個* .csproj的文件?你會找到這些行' –
rene
是的。更新了問題。謝謝! –
同意@rene這裏 - 沒有真正穩定的運行時解決方案,因爲引用程序集不一定在構建之後仍然被引用(未使用的引用被刪除)。此外,你有像陰影複製(asp.net和單元測試)和複雜的問題多個彙編位置的東西。因此,唯一真正穩定的方法是枚舉項目級別的引用。 –