2015-08-20 53 views
1

我有两个完全不同的目录。目录1包含我的应用程序和具有很少程序集的目录2。在应用程序启动的运行期间,我将加载程序集。默认情况下,正在执行的程序集的AppDomain将发现目录1(应用程序文件夹)或GAC中的程序集。如果该文件不存在,我们会收到错误消息。但我必须扩展AppDomain的搜索目录才能在Directory 2中进行搜索。也就是说,应用程序域将搜索directory1中(本地bin),然后GAC,然后在目录其他默认设置,最后搜索2添加当前AppDomain的路径

我曾尝试: 1.通过PrivateBinPath,但它仅在ApplicationBaseDirectory限制。 2.通过AssemblyResolve,但它不直接引用。 AssemblyResolve代码也不会命中。

回答

0

使用AssemblyResolve事件通常是正确的方法。如果它从未被击中,那可能太晚了。例如,当CLR遇到一个方法时,它会完全编译它,解析它的所有引用。如果此类解决方案失败,它将始终失败。如果绑定AssemblyResolve事件任何或所有程序集绑定失败,事件将永远不会发生。

要解决此问题,请确保尽早绑定AssemblyResolve事件。在一个可执行文件中,这很容易(在应用程序入口处的第一件事,或者您在那里使用的任何类型的任何cctor)。在一个库中,这可能比较困难,最佳实践方法是使用模块初始化程序,该模块初始化程序在加载模块(大多数程序集包含一个模块)时运行。

由于模块初始值设定项不能由C#或我知道的任何其他.NET语言设置,所以必须使用方法编织。我个人喜欢Fody,事实证明,有一个预定义的Fody包,名叫Fody Module Init

刚刚到位,公开的某处在您的图书馆,下面的代码:

public static class ModuleInitializer 
{ 
    public static void Initialize() 
    { 
     // bind to the CurrentDomain.AssemblyResolve event 
    } 
} 

Fody也与其他语言的工作(不指定您使用),但那么你就必须创建静电ModuleInitializer手工类。

使用这种方法,您可以确定将调用AssemblyResolve事件以获得CLR Fusion无法自行找到的任何程序集。