【发布时间】:2019-11-16 22:00:13
【问题描述】:
我有一个 .NET Core 2.2 项目 A,它具有对程序集 B 和 C 的包引用。 (基本上是 NuGet 引用的 dll)
我需要在运行时动态加载 B 和 C,但是我似乎找不到任何关于如何实现这一点的文档。
很多帖子都提到通过Assembly.GetExecutingAssembly().GetReferencedAssemblies() 对所有引用的程序集调用Assembly.Load(),但这只会检索程序集,在执行程序集的代码中明确引用了它们的某些类型
这对我不起作用,因为我的代码中没有对它们类型的任何引用。
我发现您可以通过 Assembly.ReflectionOnlyLoad() 获取引用程序集的完整列表,但是 .NET Core 运行时不支持此操作。
我尝试搜索 AppDomain 和 AssemblyLoadContext 类,以找到此类信息,但找不到任何有用的信息。
总结一下,我的问题是如何动态加载程序集的引用程序集,而不在我的代码中显式地触及它们的某些类型?
【问题讨论】:
-
您的应用是否有要加载的程序集名称列表?还是所有程序集都在同一个文件夹中?
-
@DavidBrowne-Microsoft 我的问题是获取该列表。我想加载程序集,这些程序集设置为对我正在执行的程序集的包引用。但是我没有办法获得它。如果我能找到获取它们的方法,我可能可以通过 Assembly.Load() 加载它们
-
未使用的引用将在编译时被优化。创建一个新项目,添加一个随机 nuget 包,编译,您将不会在输出文件夹中找到 nuget .dll,生成的程序集也不包含元数据级别的外部程序集引用。
-
好吧,抓住
ildasm自己看看,但即使发布的程序集也不包含引用未使用的外部程序集的单个字节:i.imgur.com/MbdaQrF.png
标签: c# .net dynamic reflection .net-assembly