Как загрузить исполняющуюся сборку, существующую только в памяти, в новый домен приложений?

Мне нужно создать новый AppDomain и передать ему исполняющуюся сборку без какого-либо доступа к самому файлу сборки. Я пытался использовать двоичный сериализатор для передачи загруженной сборки, но это невозможно сделать с помощью сборки, существующей только в памяти.

Проблема в том, что новый AppDomain вызывает исключение загрузки сборки, потому что в текущем каталоге такого файла нет.

Обновление: даже если я нашел способ получить фактический массив байтов сборки, сохранил его на диск и заставил загрузить его в новый домен приложений - возникает ошибка приведения - я не могу привести его из типа прокси к реальному классу или интерфейсу,

Пример проекта: https://drive.google.com/open?id=16z9nr8W5D8HjkBABgOCe5MIZKJSpFOul

Обновление 2: приведенный ниже пример работает, когда выполняется сборка на жестком диске - нет необходимости искать файл сборки и сборки FullName достаточно в CreateInstanceFromAndUnwrap метод. Все ошибки возникают, когда сборка, содержащая этот код, загружается из байтового массива. Использование:

 public sealed class LoadDomain: IDisposable 
    {
        private AppDomain _domain;
        private IFacade _value;
        public IFacade Value
        {
            get
            {
                return _value;
            }
        }

        public void Dispose()
        {
            if (_domain != null)
            {
                AppDomain.Unload(_domain);

                _domain = null;
            }
        }
        public void Load(byte[] assemblyBytes,string assemblyPath,string assemmblyDir)
        {
            var domainSetup = new AppDomainSetup()
            {
                ShadowCopyDirectories = "true",
                ShadowCopyFiles = "true",
                ApplicationName = Assembly.GetExecutingAssembly().ManifestModule.ScopeName,
                DynamicBase = assemmblyDir,
                LoaderOptimization = LoaderOptimization.MultiDomainHost,
            };
            _domain = AppDomain.CreateDomain("Isolated:" + Guid.NewGuid(), null, domainSetup);
            // _domain.Load(assemblyBytes); not working
            // _domain.AssemblyResolve+=.. not working
             Type type = typeof(Facade);
            _value = (IFacade)_domain.CreateInstanceFromAndUnwrap(assemblyPath, type.FullName);
            //assemlby path working, but casting error : InvalidCastException
            //assembly FullName not working: FileNotFoundException
        }
    }
    public class Facade : MarshalByRefObject, IFacade
    {
        public void DoSomething()
        {
            MessageBox.Show("new domain");
        }
    }

0 ответов

Другие вопросы по тегам