C# - 通过反射及其类型获取所有装配

时间:2017-10-05 12:50:32

标签: c# reflection .net-core metaprogramming

我想要实现的是从解决方案中获取带有反射的所有程序集,然后使用它们的类型,因此我可以使用.NET Core 2.0将它们放在集合Type[]中。

我可以使用的是

  • AppDomain.CurrentDomain.GetAssemblies(); - 问题是这将获得所有引用和使用的程序集。在我的情况下,我想获得所有引用的程序集,但不是必需的。所以问题是JIT编译正在删除未使用的项目的引用,因此在这种情况下,这将无法正常工作。
  • 其他选项是使用Assembly.GetExecutingAssembly().Location获取DLL的位置,然后加载所有程序集。这里的问题是,当后者我想使用.GetTypes()时抛出类型System.Reflection.ReflectionTypeLoadException的异常然后加载异常我有System.IO.FileNotFoundException: Could not load file or assembly Microsoft.EntityFrameworkCore。问题是,它试图使用无法找到的库,使用Assembly.LoadFrom(dll)显然加载DLL似乎也不会加载依赖项(库)。

我发现的是BuildManager.GetReferencedAssemblies,根据我到目前为止所读到的内容,它说这可行,并且即使它们未被使用,它也能获得所有参考资料,所以我也在MsBuild库中找到它,但是不包含该方法,所以我可能引用了错误的包。

我愿意接受任何建议,如何从.NET Core 2.0项目加载所有解决方案程序集及其类型。

提前致谢!

1 个答案:

答案 0 :(得分:2)

我有一个非常类似的问题。我不确定这是否适用于您的案例,但List<Assembly> usedAssemblies = Assembly.GetExecutingAssembly().GetReferencedAssemblies().Select((item) => Assembly.Load(item)).ToList();可能是一个解决方案。