如何正确访问当前 AppDomain 的 PrivateBinPath 属性?

Posted

技术标签:

【中文标题】如何正确访问当前 AppDomain 的 PrivateBinPath 属性?【英文标题】:How to properly access the PrivateBinPath property of the current AppDomain? 【发布时间】:2009-08-28 16:45:50 【问题描述】:

由于 AppDomain.AppendPrivatePath() 已过时,我试图弄清楚如何在我的项目中为当前 AppDomain 指定 PrivateBinPath,而无需启动一个全新的 AppDomain,并且以后能够访问它。

我知道我可以在 AppDomainSetup 对象上设置 PrivateBinPath(如果我想创建一个新的 AppDomain 就可以了),我也知道我可以像这样将它添加到我的 app.config 中:

 <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath=".\AlternateLookupPath" />
    </assemblyBinding>
  </runtime>

但是,当将此条目添加到我的 app.config 时,AppDomain.CurrentDomain.SetupInformation.PrivateBinPath 属性为空。

【问题讨论】:

【参考方案1】:

使用

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="AlternateLookupPath" />
    </assemblyBinding>
  </runtime>

根据http://msdn.microsoft.com/en-us/library/823z9h8w.aspx privatePath 已经被解释为“应用程序基目录的子目录”...所以我怀疑使用.\ 会以某种方式搞砸...

【讨论】:

我尝试使用它,但对我不起作用。 AppDomain.CurrentDomain.SetupInformation.PrivateBinPath 属性仍然为空。 当通过 app.config 文件设置探测路径时,AppDomain.CurrentDomain.SetupInformation.PrivateBinPath 似乎仍然为空,但我能够确认探测路径实际上仍在使用这个案例。调用 Assembly.Load 并在我的探测路径中指定程序集的名称成功。 正如此评论中所建议的,***.com/questions/33353420/… SetupInformation.PrivateBinPath 对于主应用程序域始终为空。【参考方案2】:

来自文档:

如果指定的目录为 PrivateBinPath 不在 ApplicationBase,它们被忽略。

所以,您需要确保您添加的路径在 ApplicationBase 下。

但这仅适用于 app.config。如果您需要在运行时执行此操作,请使用文档中描述的 AssemblyResolve 事件:

http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx

【讨论】:

路径在ApplicationBase下

以上是关于如何正确访问当前 AppDomain 的 PrivateBinPath 属性?的主要内容,如果未能解决你的问题,请参考以下文章

受限 AppDomain 中的加载项应如何访问升级服务

使用 JointCode.Shuttle 访问任意 AppDomain 的服务

如何从其他 appdomain 获取 UI 线程调度程序?

添加当前 AppDomain 的路径

获取对象的 AppDomain

当我加载的另一个 AppDomain 引发未处理的异常时,我可以隔离我当前的 AppDomain 以防被拆除吗?