protected virtual Assembly AssemblyResolver(AssemblyName assemblyName)
        {
            if (_assemblyCache.ContainsKey(assemblyName))
            {
                return(_assemblyCache[assemblyName]);
            }

            Assembly actualAssembly = null;
            var      assembly       = Assembly.GetEntryAssembly();

            if (assembly.GetName() == assemblyName)
            {
                actualAssembly = assembly;
            }

            if (actualAssembly == null)
            {
                assembly = Assembly.GetCallingAssembly();
                if (assembly.GetName() == assemblyName)
                {
                    actualAssembly = assembly;
                }
            }
            if (actualAssembly == null)
            {
                assembly = Assembly.GetExecutingAssembly();
                if (assembly.GetName() == assemblyName)
                {
                    actualAssembly = assembly;
                }
            }

            try
            {
                actualAssembly = Assembly.Load(assemblyName);
            }
            catch (System.IO.FileNotFoundException)
            {
                Assembly[] ais = AppDomain.CurrentDomain.GetAssemblies();
                actualAssembly = ais.FirstOrDefault(a => a.GetName() == assemblyName);
                if (actualAssembly == null)
                {
                    actualAssembly = ais.FirstOrDefault(a => a.GetName().Name == assemblyName.Name);
                }
                if (actualAssembly == null)
                {
                    ThrowHelper.ThrowBinaryException_DeserializeCannotFindType(assemblyName.FullName);
                }
            }

            _assemblyCache[assemblyName] = actualAssembly;

            return(actualAssembly);
        }