/// <summary>读取镜像信息</summary> /// <param name="file"></param> /// <returns></returns> public static PEImage Read(String file) { if (String.IsNullOrEmpty(file)) { return(null); } if (!File.Exists(file)) { return(null); } try { using (var fs = new FileStream(file, FileMode.Open, FileAccess.Read)) { return(PEImage.Read(fs)); } } catch (Exception ex) { if (XTrace.Debug) { XTrace.WriteLine("PEImage.Read({0})出错 {1}", file, ex); } return(null); } }
/// <summary>只反射加载指定路径的所有程序集</summary> /// <param name="file"></param> /// <param name="ver"></param> /// <returns></returns> public static Assembly ReflectionOnlyLoadFrom(String file, Version ver = null) { // 仅加载.Net文件,并且小于等于当前版本 var pe = PEImage.Read(file); if (pe == null || !pe.IsNet) { return(null); } if (ver == null) { ver = new Version(Assembly.GetExecutingAssembly().ImageRuntimeVersion.TrimStart('v')); } // 只判断主次版本,只要这两个相同,后面可以兼容 var pv = pe.Version; if (pv.Major > ver.Major || pv.Major == ver.Major && pv.Minor > ver.Minor) { if (XTrace.Debug) { XTrace.WriteLine("程序集 {0} 的版本 {1} 大于当前运行时 {2}", file, pv, ver); } return(null); } // 必须加强过滤,下面一旦只读加载,就再也不能删除文件 if (!pe.ExecutableKind.Has(PortableExecutableKinds.ILOnly)) { // 判断x86/x64兼容。无法区分x86/x64的SQLite驱动 //XTrace.WriteLine("{0,12} {1} {2}", item, pe.Machine, pe.ExecutableKind); //var x64 = pe.ExecutableKind.Has(PortableExecutableKinds.Required32Bit); //var x64 = pe.Machine == ImageFileMachine.AMD64; var x64 = pe.Machine == ImageFileMachine.AMD64; if (Runtime.Is64BitProcess ^ x64) { if (XTrace.Debug) { XTrace.WriteLine("程序集 {0} 的代码特性是 {1},而当前进程是 {2} 进程", file, pe.Machine, Runtime.Is64BitProcess ? "64位" : "32位"); } return(null); } } try { return(Assembly.ReflectionOnlyLoadFrom(file)); } catch { return(null); } //return null; }