我需要创建一个单元测试来枚举给定.net解决方案的所有引用程序集的Locations。我一直在寻找并且找不到任何适合这个问题的东西。
我看了看 Is there a way to force all referenced assemblies to be loaded into the app domain? 和 Get the paths of all referenced assembliesGetAssemblies()方法为我们提供了已加载的程序集。但我也想要那些尚未加载的程序集的路径。
简单来说,我只是想知道在Visual Studio中展开各种项目的“引用”时我看到的所有程序集的位置。
如果我查看.csproj文件,那么我可以看到所有引用。可以有任何构建脚本解决方案吗?只是想知道。
想法?
满怀期待。
答案 0 :(得分: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
答案 1 :(得分: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
}
}