未触发 AssemblyResolve
AssemblyResolve not fired
我正在尝试使用 AssemblyResolve
解决 AnyCPU 平台的依赖关系。
我有 3 个 classes:
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
class。
但似乎 AssemblyResolve
从未被解雇。
我有两个包含 ClassFromAssembly
的 DLL,一个用于 x86,一个用于 x64。
我想在 AnyCPU 平台上动态加载它们,但 AssemblyResolve
从未触发。
为什么AssemblyResolve
不火?
您看到的行为是由 .NET 运行时可能执行的方法内联引起的。
为使您的方案正常运行,请确保受影响的方法未内联。像这样:
class Bar {
static Bar() {
Resolver.Setup();
}
public voidFoo() {
_DoTheJob();
}
[MethodImpl(MethodImplOptions.NoInlining)]
void _DoTheJob() {
var foo = new Foo();
//...
}
}
一旦方法未内联,保证首先安装您的解析器,包含 ClassFromAssembly
的程序集将在 安装解析器之后加载。
P.S。还要确保在安装程序集解析器之前未加载感兴趣的程序集。否则,将不会解决丢失的程序集引用,并且这些失败将永远缓存在当前 AppDomain 中,例如你将永远不会再为他们获得 AssemblyResolve
事件。
我正在尝试使用 AssemblyResolve
解决 AnyCPU 平台的依赖关系。
我有 3 个 classes:
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
class。
但似乎 AssemblyResolve
从未被解雇。
我有两个包含 ClassFromAssembly
的 DLL,一个用于 x86,一个用于 x64。
我想在 AnyCPU 平台上动态加载它们,但 AssemblyResolve
从未触发。
为什么AssemblyResolve
不火?
您看到的行为是由 .NET 运行时可能执行的方法内联引起的。
为使您的方案正常运行,请确保受影响的方法未内联。像这样:
class Bar {
static Bar() {
Resolver.Setup();
}
public voidFoo() {
_DoTheJob();
}
[MethodImpl(MethodImplOptions.NoInlining)]
void _DoTheJob() {
var foo = new Foo();
//...
}
}
一旦方法未内联,保证首先安装您的解析器,包含 ClassFromAssembly
的程序集将在 安装解析器之后加载。
P.S。还要确保在安装程序集解析器之前未加载感兴趣的程序集。否则,将不会解决丢失的程序集引用,并且这些失败将永远缓存在当前 AppDomain 中,例如你将永远不会再为他们获得 AssemblyResolve
事件。