将Mef的程序集路径添加到AppDomain的.Load路径

时间:2012-06-24 20:27:51

标签: .net mef .net-assembly

我有一个应用程序从via Mef加载某些(可扩展的)功能。因为这些模块(可能)使用第三方控件(Telerik),我想最大限度地减少用户感知的加载时间(在使用上述控件打开表单时),我想预先加载这些Mef模块参考的组件。

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

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

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

1 个答案:

答案 0 :(得分:0)

您以前只能调用AppDomain.AppendPrivatePath,但此方法现在标记为obselete,因为它可能会引入加载顺序问题(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开始它仍然存在,但出于某种原因标记为obselete。