列出给定.net解决方案的所有引用(不要认为已加载)程序集

列出给定.net解决方案的所有引用(不要认为已加载)程序集,.net,.net,我需要创建一个单元测试来枚举给定.net解决方案的所有引用程序集的位置。我一直在搜索,没有找到任何适合这个问题的东西 我看了一眼 和 getAssemblys()方法为我们提供已加载的程序集。但我还需要那些尚未加载的程序集的路径 简单地说,我只想知道在VisualStudio中展开各种项目的“引用”时看到的所有程序集的位置 如果我查看.csproj文件,那么我可以看到所有的引用。是否有任何构建脚本解决方案?只是想知道 想法 感谢期待。我相信您希望获得完整解决方案中所有DLL参考的列表。 因此,

我需要创建一个单元测试来枚举给定.net解决方案的所有引用程序集的位置。我一直在搜索,没有找到任何适合这个问题的东西

我看了一眼 和

getAssemblys()方法为我们提供已加载的程序集。但我还需要那些尚未加载的程序集的路径

简单地说,我只想知道在VisualStudio中展开各种项目的“引用”时看到的所有程序集的位置

如果我查看.csproj文件,那么我可以看到所有的引用。是否有任何构建脚本解决方案?只是想知道

想法


感谢期待。

我相信您希望获得完整解决方案中所有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
        }
    }