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

时间:2016-06-29 20:20:56

标签: c# assemblies

很抱歉,如果这是转发/复制,但我找不到任何相关内容。

以下是我的尝试:

var assembly = Assembly.GetExecutingAssembly();

通过

获取正在执行的程序集
var assemblies = AppDomain.CurrentDomain.GetAssemblies();

可以获得包含引用的每个程序集

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

3 个答案:

答案 0 :(得分:13)

与此同时,我将使用

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

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

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

答案 1 :(得分:1)

其他人已经指出,议会之间没有区别。构建解决方案后,所有已部署的程序集都只是程序集,无论是您的还是包含在引用中,它们都是相同的。

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

另一种选择可能是应用启发式方法来区分。例如,您可以尝试从执行程序集中的类型中查找名称空间。这是应用程序的切入点,因此我们可以说它必须是解决方案的一部分。

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

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

但另一方面,如果我将自己的解决方案作为测试集,这种启发式方法将完美地运行,这要归功于我的所有项目都带有root命名空间,这是我公司的名字在这个受限制的领域中,这是不正确的。

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

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

答案 2 :(得分:0)

在这种情况下我通常做的是设置前缀名称然后获取具有此前缀的所有程序集,例如,命名我的项目,如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);
    }
}

希望这有帮助。