1

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

我看了看 有没有办法强制将所有引用的程序集加载到应用程序域中?获取所有引用程序集的路径

GetAssemblies() 方法为我们提供了已加载的程序集。但我也想要那些尚未加载的程序集的路径。

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

如果我查看 .csproj 文件,那么我可以看到所有参考。可以有任何构建脚本解决方案吗?就是想。

想法?

期待中的感谢。

4

2 回答 2

1

我相信您想获得完整解决方案中所有 dll 引用的列表。所以首先获取当前解决方案的所有项目列表:

如何以编程方式列出解决方案中的所有项目?

现在将拥有解决方案的所有项目的列表,现在您可以读取(每个项目的).csproj 文件并读取 ItemGroup 标签下的标签。

好像您将尝试使用任何内置函数来获取它,那么它只会为您提供那些已加载的程序集的列表..但不会提供丢失(但被引用)的程序集列表。

其他一些有用的类似链接:

解析来自另一个文件夹的程序集引用

http://www.codeproject.com/Questions/88183/How-to-get-all-dll-name-which-is-reference-in-C-pr

于 2013-07-09T06:42:00.337 回答
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
        }
    }
于 2013-07-10T12:56:17.550 回答