这里是整个代码。第一种方法读取.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和单元测试)和复杂的问题多个汇编位置的东西。因此,唯一真正稳定的方法是枚举项目级别的引用。 –