我正在尝试基于Environment.Is64BitProcess
实现某些程序集的动态加载。
这基本上是这样的:
AppDomain.AssemblyResolve
event的事件处理程序private Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
{
// args.Name is the display name of an assembly, e.g.:
// MyAssembly, Version=5.0.0.0, Culture=neutral, PublicKeyToken=abcdefghijklmn
if(!args.Name.Contains("MyAssembly"))
return null;
var path = Path.Combine(GetCpuTypeDependentPath(), "MyAssembly.dll");
return Assembly.LoadFrom(path);
}
现在,这有一个问题,它不检查加载的程序集的版本,publicKeyToken等。
我现在想做的是调用
Assembly.Load
并简单地提供一条附加的探测路径。我知道这是行不通的,因为没有这样的过载。还有其他方法可以实现我的目标吗? 最佳答案
只需将找到的程序集的属性与所请求的程序集的属性进行比较即可。例如,版本检查可能如下所示:
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
var name = new AssemblyName(args.Name);
string path = System.IO.Path.Combine(IntPtr.Size == 8 ? "x64" : "x86", name.Name + ".dll");
path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), path);
var asm = Assembly.LoadFrom(path);
var found = new AssemblyName(asm.FullName);
if (name.Version != found.Version) throw new System.IO.FileNotFoundException(name.FullName);
return asm;
}