1

我有两个完全不同的目录。目录 1 包含我的应用程序,目录 2 包含很少的程序集。在应用程序启动的运行时,我将加载程序集。默认情况下,执行程序集的 AppDomain 将发现目录 1(应用程序文件夹)或 GAC 中的程序集。如果文件不存在,我们将收到错误消息。但我还必须扩展 AppDomain 的搜索目录以在 Directory 2 中搜索。也就是说,AppDomain 将搜索 Directory1(本地 bin),然后是 GAC,然后是其他默认值,最后在 Directory 2 中搜索。

我尝试过: 1. 通过设置 PrivateBinPath,但它仅限于 ApplicationBaseDirectory。2.通过AssemblyResolve,但不直接引用。AssemblyResolve 代码也永远不会命中。

4

1 回答 1

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手动创建静态类。

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

于 2015-12-12T19:51:55.293 回答