我正在开发一个“执行器”,它将通过反射执行DLL。我将配置一个实现特定接口的DLL,执行器将加载这个DLL并执行基于接口的方法。
在某些情况下,配置的DLL可能有另一个不在目录中的引用DLL。
我的问题是:如果没有引用的物理DLL,如何加载和执行这个程序集?
前任:
-Executor calls DLL "A".
-DLL "A" references DLL "B" and DLL "C".
-DLL "B" and DLL "C" are not in the directory.
当程序集加载程序在运行时解析引用时,缺少的物理文件将始终导致绑定过程失败并出现异常(当应用程序需要来自该程序集的代码时,它需要物理存在 - 即搜索路径中的任何位置,包括 GAC)。
(即使你能找到一种拦截加载过程的方法——这在.NET中是可能的——如果你最终不以某种方式提供被引用程序集的IL,无论是通过下载、按需编译还是其他方式)。
有关详细信息,请参阅“运行时如何定位程序集”,请参阅:https://msdn.microsoft.com/en-us/library/yx7xezcf(v=vs.110).aspx
您删除额外依赖项的想法是有意义的(减少“DLL地狱”),一个需要考虑的选项是将多个相互依赖的程序集合并到一个二进制文件中,例如这个免费工具,它也可以作为NuGet包提供: http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx
假设您不想将这些dll放入工作目录,您需要将dll B和C注册到全局程序集缓存(GAC)中
您可以参考此wiki帖子或谷歌GAC进一步信息。