如何在不包括引用的解决方案中获取每个项目的程序集

本文关键字:获取 程序集 项目 解决方案 不包括 引用 | 更新日期: 2023-09-27 17:53:37

对不起,如果这是一个转发/重复,但我找不到任何相关的

这是我尝试过的:

var assembly = Assembly.GetExecutingAssembly();

表示执行程序集和

var assemblies = AppDomain.CurrentDomain.GetAssemblies();

可以得到所有的汇编,包括你的引用

但是,我想要解决方案项目的所有程序集(不是包/引用)。

如何在不包括引用的解决方案中获取每个项目的程序集

在此期间,我将使用

AppDomain.CurrentDomain.GetAssemblies().Where(x => x.FullName.Contains("SolutionName"));

因为我所有的项目名称都包含解决方案名称。

不理想,希望有人有更好的解决方案。

其他人已经指出程序集之间没有区别。一旦您构建了解决方案,所有部署的程序集都只是程序集,无论是您的还是作为引用包含的,都是一样的。

唯一确切的解决方案是使用.sln文件。它只是一个具有简单方案的XML文件,并且很容易从中挖掘数据,前提是您确实可以访问它。

另一个选择可能是应用启发式来进行区分。例如,您可以尝试从执行程序集中的类型中找出名称空间。这是应用程序的入口点,因此我们可以认为它一定是解决方案的一部分。

然后你可以检查从GetAssemblies()获得的程序集,然后检查其中包含的类型的命名空间。如果您发现某些程序集和执行程序集之间的命名空间路径(部分)有重叠,您可以声明它们来自相同的源。

再一次,这只是一个启发式,在一般情况下它不会令人满意。事实上,想出一个反例是很容易的。

但另一方面,如果我把我自己的解决方案作为一个测试集,这个启发式会很好地工作,这要归功于我所有的项目都带有根命名空间,这是我公司的名称,这在这个受限的域中是不成立的。

一个明显的反例是当您将自己的一些项目部署为NuGet包时。然后它们将共享名称空间,但不会成为解决方案的一部分。

底线是这种启发式解决方案可能无法解决您的问题。但我希望你至少能从中挑出一部分,把它和其他的想法混合在一起,得出一个合适的解决方案。

在这种情况下,我通常做的是设置一个前缀名称,然后使用这个前缀获得所有程序集,例如,将我的项目命名为EX。"ProjectName"我可以使用:

Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
List<Assembly> myAssemblies = new List<Assembly>();
foreach (Assembly assembly in assemblies)
{
    if (assembly.GetName().Name.Contains("EX."))
    {
        myAssemblies.Add(assembly);
    }
}