예제 #1
0
파일: PEImage.cs 프로젝트: armku/HelperComm
        /// <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);
            }
        }
예제 #2
0
        /// <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;
        }