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

cha*_*ler 3 c# assemblies

很抱歉,如果这是重新发布/重复,但我找不到任何相关的内容.

这是我尝试过的:

var assembly = Assembly.GetExecutingAssembly();
Run Code Online (Sandbox Code Playgroud)

它可以让你获得正在执行的程序集

var assemblies = AppDomain.CurrentDomain.GetAssemblies();
Run Code Online (Sandbox Code Playgroud)

它可以让每一个组件,包括您的参考.

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

cha*_*ler 13

在此期间我将使用

AppDomain.CurrentDomain.GetAssemblies().Where(x => x.FullName.Contains("SolutionName"));
Run Code Online (Sandbox Code Playgroud)

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

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


Zor*_*vat 2

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

唯一准确的解决方案是使用 .sln 文件。它只是一个具有简单方案的 XML 文件,只要您有权访问它,就可以轻松地从中挖掘数据。

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

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

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

但另一方面,如果我将自己的解决方案作为测试集,这种启发式方法将工作得很好,因为我的所有项目都带有根命名空间,这是我公司的名称,但对于- 在这个受限领域中非常明显。

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

最重要的是,这种启发式解决方案可能无法解决您的问题。但我希望你至少能够选择其中的一部分,并将其与其他想法混合在一起,以得出适当的解决方案。