c# - ApplicationBase 之外的 PrivateBinPath

标签 c# .net appdomain appdomainsetup

我的目录结构是这样的:

-- Host Program Base
  |- HostProgram.exe
  |- SharedLIB.dll
  |-- LoadedLibs
     |- HostedLib.dll

HostProgram.exe 正在尝试加载 HostedLib.dll,它依赖于 SharedLib.dll

因此,SharedLib.dllApplicationBase 用于我正在创建加载它的 AppDomain/Host Program Base/HostedLibs/,但它需要能够找到 SharedLib.dll

我已尝试将 .. 添加到 AppDomainPrivateBinPath 但根据 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.

基本上是这样工作的。

  1. 订阅 AppDomain 上的 AssemblyResolve 事件。
  2. 当事件触发时,您可以专门查找您的 SharedLib.dll 或简单地尝试在您的根文件夹中创建所需程序集的完整路径,给定在 ResolveEventArgs.Name 中指定的程序集名称。并使用 Assembly.LoadFrom(path) .
  3. 如果程序集从该路径成功加载,则在 AssemblyResolve handler 中返回它,否则返回null

关于c# - ApplicationBase 之外的 PrivateBinPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17436580/

相关文章:

c# - 将自定义路径设置为引用的 DLL?

.net - 从数据库查询填充组合框

c# - Active Directory,枚举用户组,COM 异常

c# - 如何使用 C# 播放 mp3 ...没有第三个 dll

c# - "Object has been disconnected or does not exist at the server"异常

c# - 将一个对象传递给 Default AppDomain,以从进程中创建的子 AppDomain 接收回调

c# - 将一个线程的结果通知另一个线程或等待第一个线程的反馈以继续第二个线程

c# - .NET 字典如何解决冲突?

c# - 收集仍在范围内的对象 - GC.Collect

java - 有没有办法在 Android 上对 java 进程的部分进行沙箱处理?