public Assembly Load(AssemblyName assemblyName)
        {
            var projectPath = Path.Combine(_path, assemblyName.Name);
            if (!Project.HasProjectFile(projectPath)) {
                return null;
            }

            return _cache.Get<Assembly>(assemblyName.Name, cacheContext => {
                var moduleContext = new ModuleLoaderContext(
                    projectPath,
                    _applicationEnvironment.RuntimeFramework);

                foreach (var lib in moduleContext.LibraryManager.GetLibraries()) {
                    _libraryManager.AddLibrary(lib);
                }

                var engine = new CompilationEngine(new CompilationEngineContext(
                    _applicationEnvironment,
                    _assemblyLoadContextAccessor.Default,
                    new CompilationCache()));

                var exporter = engine.CreateProjectExporter(
                    moduleContext.Project, moduleContext.TargetFramework, _applicationEnvironment.Configuration);

                var exports = exporter.GetAllExports(moduleContext.Project.Name);
                foreach (var metadataReference in exports.MetadataReferences) {
                    _libraryManager.AddMetadataReference(metadataReference);
                }

                return engine.LoadProject(moduleContext.Project, null, _assemblyLoadContextAccessor.Default);
            });
        }
        public Assembly Load(AssemblyName assemblyName)
        {
            var reference = _libraryManager.GetMetadataReference(assemblyName.Name);

            if (reference != null && reference is MetadataFileReference)
            {
                var fileReference = (MetadataFileReference)reference;

                var assembly = _assemblyLoadContextAccessor
                    .Default
                    .LoadFile(fileReference.Path);

                return assembly;
            }

            var projectPath = Path.Combine(_path, assemblyName.Name);
            if (!Project.HasProjectFile(projectPath))
            {
                return null;
            }

            var moduleContext = new ModuleLoaderContext(
                projectPath,
                _applicationEnvironment.RuntimeFramework);

            foreach (var lib in moduleContext.LibraryManager.GetLibraries())
            {
                _libraryManager.AddLibrary(lib);
            }

            var engine = new CompilationEngine(new CompilationEngineContext(
                _applicationEnvironment,
                _runtimeEnvironment,
                _assemblyLoadContextAccessor.Default,
                new CompilationCache()));

            var exporter = engine.CreateProjectExporter(
                moduleContext.Project, moduleContext.TargetFramework, _applicationEnvironment.Configuration);

            var exports = exporter.GetAllExports(moduleContext.Project.Name);
            foreach (var metadataReference in exports.MetadataReferences)
            {
                _libraryManager.AddMetadataReference(metadataReference);
            }

            var loadedProjectAssembly = engine.LoadProject(
                moduleContext.Project,
                _applicationEnvironment.RuntimeFramework,
                null,
                _assemblyLoadContextAccessor.Default,
                assemblyName);

            IList<LibraryDependency> flattenedList = moduleContext
                .Project
                .Dependencies
                .SelectMany(x => Flatten(x))
                .Where(x => x.Library.Type == "Package")
                .Distinct()
                .ToList();

            foreach (var dependency in flattenedList)
            {
                foreach (var assemblyToLoad in dependency.Library.Assemblies)
                {
                    Assembly.Load(new AssemblyName(assemblyToLoad));
                }
            }

            return loadedProjectAssembly;
        }
        public Assembly Load(AssemblyName assemblyName)
        {
            return _cache.Get<Assembly>(assemblyName.Name, cacheContext =>
            {
                var reference = _libraryManager.GetMetadataReference(assemblyName.Name);

                if (reference is MetadataFileReference)
                {
                    var fileReference = (MetadataFileReference)reference;

                    var assembly = _assemblyLoadContextAccessor
                        .Default
                        .LoadFile(fileReference.Path);

                    return assembly;
                }

                var projectPath = Path.Combine(_path, assemblyName.Name);

                if (!Project.HasProjectFile(projectPath))
                {
                    return null;
                }

                var moduleContext = new ModuleLoaderContext(
                    projectPath,
                    _applicationEnvironment.RuntimeFramework);

                foreach (var lib in moduleContext.LibraryManager.GetLibraries())
                {
                    _libraryManager.AddLibrary(lib);
                }

                var ctx = new CompilationEngineContext(
                    _applicationEnvironment,
                    _runtimeEnvironment,
                    _assemblyLoadContextAccessor.Default,
                    new CompilationCache());

                var engine = new CompilationEngine(ctx);

                var exporter = engine.CreateProjectExporter(
                    moduleContext.Project, moduleContext.TargetFramework, _applicationEnvironment.Configuration);

                var exports = exporter.GetAllExports(moduleContext.Project.Name);

                foreach (var metadataReference in exports.MetadataReferences)
                {
                    _libraryManager.AddMetadataReference(metadataReference);
                }

                //LibraryExport projectExport = exporter.GetExport(moduleContext.Project.Name);
                //IMetadataProjectReference projectRef = (IMetadataProjectReference)projectExport.MetadataReferences.First();

                //string exportDir = Path.Combine(moduleContext.Project.ProjectDirectory, "export");
                //projectRef.EmitAssembly(exportDir);

                //string assemblyPath = Path.Combine(exportDir, moduleContext.Project.Name + ".dll");

                Assembly pluginAssm = engine.LoadProject(
                    moduleContext.Project, moduleContext.FrameworkName, null, _assemblyLoadContextAccessor.Default,
                    new AssemblyName(moduleContext.Project.Name));

                IList<LibraryDependency> flattenedList = moduleContext
                    .Project
                    .Dependencies
                    .SelectMany(Flatten)
                    .Where(x => x.Library.Type == "Package")
                    .Distinct()
                    .ToList();

                //foreach (var dependency in flattenedList)
                //{
                //    foreach (var assemblyToLoad in dependency.Library.Assemblies)
                //    {
                //        Assembly.Load(new AssemblyName(assemblyToLoad));
                //    }
                //}

                return pluginAssm;
            });
        }