AssemblyResolve没有被解雇

时间:2017-04-30 13:14:48

标签: c# .net assemblies

我正在尝试使用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();
        //...
    } 
}

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

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

为什么AssemblyResolve没有开火?

1 个答案:

答案 0 :(得分:0)

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

要使您的方案有效,请确保未内联受影响的方法。像这样:

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

    public voidFoo() {
        _DoTheJob();
    }

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

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

P.S。还要确保在安装程序集解析程序之前未加载感兴趣的程序集。否则,错过的程序集引用将无法解决,并且这些故障将永远缓存在当前的AppDomain中,例如,你永远不会再为他们举办AssemblyResolve活动。