如何在不包括引用的解决方案中获取每个项目的程序集
本文关键字:获取 程序集 项目 解决方案 不包括 引用 | 更新日期: 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);
}
}