Как загрузить исполняющуюся сборку, существующую только в памяти, в новый домен приложений?
Мне нужно создать новый 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");
}
}