【问题标题】:Add a Mef's Assembly Path to the AppDomain's .Load Path将 Mef 的组装路径添加到 AppDomain 的 .Load 路径
【发布时间】:2012-06-24 20:27:51
【问题描述】:

我有一个通过 Mef 加载某些(可扩展)功能的应用程序。因为这些模块(可能)使用了 3rd 方控件 (Telerik),所以我想尽量减少用户感知的加载时间(在使用上述控件打开表单时),我想预加载这些 Mef 模块引用的程序集。

我正在做的是使用 Assembly.GetReferencedAssemblies(..) 方法来获取每个 Mef 模块引用的程序集的名称,并尝试使用 Assembly.Load(..) 它们。

由于模块位于文件系统上的“某处”(通常不同于 ExecutingAssembly 的路径),因此对于不在 Gac 中的这些 Mef 模块的引用,加载失败。

有没有办法修改我的 AppDomain.CurrentDomain 的程序集加载路径?我知道 AppDomain.AssemblyLoad 事件,但是使用它有点麻烦,因为每个模块可能驻留在不同的目录中。

【问题讨论】:

    标签: .net mef .net-assembly


    【解决方案1】:

    您过去可以简单地调用AppDomain.AppendPrivatePath,但现在这个方法被标记为过时,因为它会引入加载顺序问题(read here)。推荐的方法是更新您的配置以包含其他路径,或使用AppDomainSetup.PrivateBinPath(但后者适用于您创建新应用程序域时)。

    要应用配置更改:

    <configuration>
       <runtime>
          <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
             <probing privatePath="bin;bin2\subbin;bin3"/>
          </assemblyBinding>
       </runtime>
    </configuration>
    

    (直接从associated MSDN page 提升)。请注意,您可以通过用分号分隔多个探测路径来指定它们。您可以冒险使用AppDomain.AppendPrivatePath(...),它在 .NET BCL v4.0 中仍然存在,但出于某种原因它被标记为过时。

    【讨论】:

    • 谢谢马修。我尝试了 AppDomain.AppendPrivatePath 但没有奏效,有趣的是,在调用该方法后,AppDomain 的 .PrivatePath 属性仍然是空的,并且加载仍然失败。我还遇到了 app.config 中的 部分,但问题是,路径是“动态的”。我好奇的是 MEF 是如何处理这个问题的——因为如果我让 .Net 正常、延迟加载所需的程序集引用,它工作得非常好。
    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 2020-01-03
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多