C# - 通过反射获取所有程序集及其类型

8
我想要做的是使用反射获取解决方案中的所有程序集,然后获取它们的类型,以便在.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项目中加载所有解决方案程序集及其类型。
提前感谢!

在 MSBuild 中应该有一种方法,但如果没有的话,您总可以解析您的 csproj 文件。 - johnny 5
1个回答

4

我曾经遇到过类似的问题。我不确定这是否适用于你的情况,但是List<Assembly> usedAssemblies = Assembly.GetExecutingAssembly().GetReferencedAssemblies().Select((item) => Assembly.Load(item)).ToList();可能是一个解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接