0

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

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

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

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

4

1 回答 1

0

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

要应用配置更改:

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

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

于 2012-06-25T07:33:59.587 回答