2016-06-07 78 views
0

我正在开发一个“执行程序”,它将通过反射来执行DLL。我将配置一个实现特定接口的DLL,执行程序将加载该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. 
+0

你预计会发生什么?为什么程序集不在同一目录中,它们在哪里?你有什么尝试?请参阅例如[解决来自另一个文件夹的程序集引用](http://stackoverflow.com/questions/5260404/resolve-assembly-references-from-another-folder),[如何在运行时将文件夹添加到程序集搜索路径中。 NET?](http://stackoverflow.com/questions/1373100/how-to-add-folder-to-assembly-search-path-at-runtime-in-net)等等。 – CodeCaster

+0

然后他们在哪里?或者它们位于系统目录/ GAC中的一个中,当您加载DLL“A”时,它们将很好地加载,或者它们未找到并且加载DLL“A”将失败。 – nos

+0

@nos我没有DLLs,他们是唯一的本地,是在DLL的“A”的参考:( –

回答

2

当运行时由程序集加载器解析引用时,缺失的物理文件总是会导致绑定进程失败并产生异常(当应用程序需要该程序集中的代码时,它需要在物理上 - 即搜索路径中的任何地方,包括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

-1

假设你不想把这些DLL到工作目录,你需要注册DLL B和C到全局程序集缓存(GAC)

您可以参考this wiki文章或Google GAC更多信息。

+0

不,你不需要to_。你可以重载搜索程序集的探测机制。 – CodeCaster

相关问题