【问题标题】:AssemblyResolve not firedAssemblyResolve 未触发
【发布时间】:2017-09-28 03:24:17
【问题描述】:

我正在尝试使用 AssemblyResolve 来解决 AnyCPU 平台的依赖关系。

我有 3 个课程:

class Resolver {
    public static void Startup() { }
    static Resolver()
    {
          AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
    }

    private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs 
        ...
    }
}

class Foo {
    private ClassFromAssembly _foo;

    public Foo() {
        _foo = new ClassFromAssembly();
    } 
}

class Bar {
    static Bar() {
        Resolver.Setup();
    }

    public voidFoo() {
        var foo = new Foo();
        //...
    } 
}

我正在尝试使用 AssemblyResolve 事件加载 ClassFromAssembly 类。 但似乎AssemblyResolve 从未被解雇。

我有两个包含ClassFromAssembly 的DLL,一个用于x86,一个用于x64。 我想在 AnyCPU 平台上动态加载它们,但 AssemblyResolve 从未触发过。

为什么AssemblyResolve 不开火?

【问题讨论】:

  • 可能,因为您从Bar 引用Foo,所以在您执行Resolver.Setup 之前,程序集已被解析。在调试中运行时查看 Visual Studio 中的输出窗口,以准确了解加载程序集的时间
  • 看来DLL加载之后我设置了事件AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

标签: c# .net assemblies


【解决方案1】:

您看到的行为是由可能由 .NET 运行时执行的方法内联引起的。

为了使您的方案工作,请确保受影响的方法没有被内联。像这样:

class Bar {
    static Bar() {
        Resolver.Setup();
    }

    public voidFoo() {
        _DoTheJob();
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    void _DoTheJob() {
        var foo = new Foo();
        //...
    }
}

一旦方法没有被内联,保证会首先安装你的解析器,包含ClassFromAssembly的程序集将在安装解析器之后被加载。

附:还要确保在安装程序集解析器之前未加载感兴趣的程序集。否则,丢失的程序集引用将不会得到解决,并且这些故障将永远缓存在当前的 AppDomain 中,例如你再也不会为他们收到AssemblyResolve 事件了。

【讨论】:

  • 我设置事件AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;后加载的DLL似乎对我不起作用...
  • @nrofis 订阅AssemblyLoad 事件以绝对确定何时加载感兴趣的程序集。这将为您提供正确的提示。
  • @nrofis 另请注意,AssemblyResolve 事件仅在通常的解析过程无法定位感兴趣的程序集时引发。例如,如果程序集位于您的 .EXE 附近,您将不会收到 AssemblyResolve 事件。尝试删除它,然后AssemblyResolve 才会起作用。
  • 刚刚,AssemblyLoad 感兴趣的 DLL 被调用 我注册到AssemblyResolve
  • 但是 DLL 在引用中... VS 自动将其复制到 EXE 文件附近...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多