我需要创建新的AppDomain并将执行的程序集传递给它,而无需访问程序集文件本身。 我尝试使用二进制序列化程序来传输已加载的程序集,但是仅使用内存中存在的程序集就无法做到这一点。
问题在于新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");
}
}