我需要创建新的 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");
}
}