列出给定.net解决方案的所有引用(不要认为已加载)程序集
我需要创建一个单元测试来枚举给定.net解决方案的所有引用程序集的位置。我一直在搜索,没有找到任何适合这个问题的东西 我看了一眼 和 getAssemblys()方法为我们提供已加载的程序集。但我还需要那些尚未加载的程序集的路径 简单地说,我只想知道在VisualStudio中展开各种项目的“引用”时看到的所有程序集的位置 如果我查看.csproj文件,那么我可以看到所有的引用。是否有任何构建脚本解决方案?只是想知道 想法列出给定.net解决方案的所有引用(不要认为已加载)程序集,.net,.net,我需要创建一个单元测试来枚举给定.net解决方案的所有引用程序集的位置。我一直在搜索,没有找到任何适合这个问题的东西 我看了一眼 和 getAssemblys()方法为我们提供已加载的程序集。但我还需要那些尚未加载的程序集的路径 简单地说,我只想知道在VisualStudio中展开各种项目的“引用”时看到的所有程序集的位置 如果我查看.csproj文件,那么我可以看到所有的引用。是否有任何构建脚本解决方案?只是想知道 想法 感谢期待。我相信您希望获得完整解决方案中所有DLL参考的列表。 因此,
感谢期待。我相信您希望获得完整解决方案中所有DLL参考的列表。 因此,首先获取当前解决方案的所有项目的列表: 现在将有解决方案的所有项目的列表,现在您可以读取.csproj文件(每个项目)并读取ItemGroup标记下的标记 就像您将尝试使用任何内置函数获取它一样,它将只提供已加载程序集的列表。。但不会给出缺失(但被引用)的程序集列表 其他一些有用的类似链接:
以下是全部代码。第一个方法读取.sln文件并使用regex标识.csproj文件。第二个方法接收.csproj文件的路径并对其进行解析,以找出引用的dll位置(请注意,它不标识GAC安装的程序集)——
public void GetAllCSProjectFiles()
{
var Content=File.ReadAllText(“PathTo.sln”);
正则表达式projReg=新正则表达式(
“项目\(\”\{[\\w-]*\\\\\\“\\)=\”([\\w\]*.*),\“(.\\\.(cs | vcx | vb)项目)”
,RegexOptions.Compiled);
var matches=projReg.matches(Content.Cast();
var Projects=matches.Select(x=>x.Groups[2].Value.ToList();
对于(int i=0;i
解析解决方案中的每个*.csproj文件如何?您将查找这些行
是的。更新了问题。谢谢在这里同意@rene的观点-没有真正稳定的运行时解决方案,因为在构建之后引用的程序集不一定仍然被引用(未使用的引用被剥离)。此外,您还可以进行卷影复制(asp.net和单元测试)和多个程序集位置,这会使问题变得复杂。因此,唯一真正稳定的方法是在项目级别枚举引用。
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
}
}