我的目录结构是这样的:
-- Host Program Base
|- HostProgram.exe
|- SharedLIB.dll
|-- LoadedLibs
|- HostedLib.dll
HostProgram.exe
正在尝试加载 HostedLib.dll
,它依赖于 SharedLib.dll
。
因此,SharedLib.dll
的 ApplicationBase
用于我正在创建加载它的 AppDomain
是 /Host Program Base/HostedLibs/
,但它需要能够找到 SharedLib.dll
。
我已尝试将 ..
添加到 AppDomain
的 PrivateBinPath
但根据 MSDN ,
Private assemblies are deployed in the same directory structure as the application. If the directories specified for PrivateBinPath are not under ApplicationBase, they are ignored.
由于 PrivateBinPath
不在 ApplicationBase
内,而是在一个目录之上,因此它不在 ApplicationBase
内并且被忽略。因此,在尝试将 DLL 加载到新的 AppDomain
时,我得到了一个 AssemblyResolveException
。
我还尝试将 ApplicationBase
设置为 Host Program Base
文件夹并将 HostedLibs
添加为 PrivateBinPath
,但这会导致域根本无法解析 HostedLib.dll
。
那么 -> 如何使用 AppDomainSetup
解析 ApplicationBase
之外的库?
最佳答案
如果不重新组织您的应用程序结构,您可以使用 AppDomain.AssemblyResolve event
.
基本上是这样工作的。
- 订阅 AppDomain 上的 AssemblyResolve 事件。
- 当事件触发时,您可以专门查找您的 SharedLib.dll 或简单地尝试在您的根文件夹中创建所需程序集的完整路径,给定在
ResolveEventArgs.Name
中指定的程序集名称。并使用Assembly.LoadFrom(path)
. - 如果程序集从该路径成功加载,则在 AssemblyResolve handler 中返回它,否则返回
null
。
关于c# - ApplicationBase 之外的 PrivateBinPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17436580/