Assembly.LoadFrom包含路径和完整程序集名称

时间:2012-08-07 14:17:58

标签: c# .net

我正在尝试根据Environment.Is64BitProcess实现某些程序集的动态加载 这基本上是这样的:

  • 注册AppDomain.AssemblyResolve event
  • 的事件处理程序
  • 在事件处理程序中,从CPU类型相关子路径加载程序集:

    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并简单地提供额外的探测路径。我知道这不起作用,因为没有这样的过载。还有其他方法可以实现我的目标吗?

2 个答案:

答案 0 :(得分:2)

只需将找到的程序集的属性与请求的属性进行比较即可。例如,版本检查可能如下所示:

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;
}

答案 1 :(得分:1)

没有自己探测组件我没有看到你可以做到这一点。 您只需启动另一个将搜索匹配程序集的AppDomain,以便您可以卸载探测期间加载的程序集。不幸的是