/// <summary>
        /// Logic to load an embedded assembly
        /// </summary>
        /// <param name="assemblyLocationInformation"></param>
        /// <returns>Assembly</returns>
        private Assembly LoadEmbeddedAssembly(AssemblyLocationInformation assemblyLocationInformation)
        {
            if (!assemblyLocationInformation.IsEmbedded)
            {
                return(null);
            }

            // Check if we can work with temporary files
            if (_applicationConfig.CopyEmbeddedAssembliesToFileSystem)
            {
                var assembly = LoadEmbeddedAssemblyViaTmpFile(assemblyLocationInformation);
                if (assembly != null)
                {
                    return(assembly);
                }
            }

            if (Log.IsVerboseEnabled())
            {
                Log.Verbose().WriteLine("Loading {0} internally, this COULD cause assembly load context issues...", assemblyLocationInformation.Name);
            }
            using (var stream = Resources.AbsoluteResourceAsStream(assemblyLocationInformation.ContainingAssembly, assemblyLocationInformation.Filename))
            {
                return(Assembly.Load(stream.ToByteArray()));
            }
        }
        /// <summary>
        /// This is a workaround where an embedded assembly is written to a tmp file, which solves some issues
        /// </summary>
        /// <param name="assemblyLocationInformation">AssemblyLocationInformation</param>
        /// <returns>Assembly</returns>
        private Assembly LoadEmbeddedAssemblyViaTmpFile(AssemblyLocationInformation assemblyLocationInformation)
        {
            var assemblyFileName = $@"{FileLocations.AddonsLocation}\{assemblyLocationInformation.Name}.dll";

            using (var stream = Resources.AbsoluteResourceAsStream(assemblyLocationInformation.ContainingAssembly, assemblyLocationInformation.Filename))
            {
                try
                {
                    if (ShouldWrite(assemblyLocationInformation, assemblyFileName))
                    {
                        using (var fileStream = new FileStream(assemblyFileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
                        {
                            stream.CopyTo(fileStream);
                        }
                        // Register delete on exit, this is done by calling a command
                        _assembliesToDeleteAtExit.Add(assemblyFileName);
                    }

                    // Get the assembly name from the file
                    var assemblyName = AssemblyName.GetAssemblyName(assemblyFileName);
                    if (Log.IsVerboseEnabled())
                    {
                        Log.Verbose().WriteLine("Loading {0} from {1}", assemblyLocationInformation.Name, assemblyFileName);
                    }
                    // Use load, as it's now in the probing path
                    return(Assembly.Load(assemblyName));
                }
                catch (Exception)
                {
                    stream.Seek(0, SeekOrigin.Begin);
                    var appdataDirectory = $@"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}\{_applicationConfig.ApplicationName}";
                    assemblyFileName = $@"{appdataDirectory}\{assemblyLocationInformation.Name}.dll";
                    if (ShouldWrite(assemblyLocationInformation, assemblyFileName))
                    {
                        using (var fileStream = new FileStream(assemblyFileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
                        {
                            stream.CopyTo(fileStream);
                        }
                        // Register delete on exit, this is done by calling a command
                        _assembliesToDeleteAtExit.Add(assemblyFileName);
                    }

                    if (Log.IsVerboseEnabled())
                    {
                        Log.Verbose().WriteLine("Loading {0} from {1}", assemblyLocationInformation.Name, assemblyFileName);
                    }
                    // Use load-from, as it's on a different place
                    return(Assembly.LoadFrom(assemblyFileName));
                }
            }
        }