c# - 如何将仅存在于内存中的执行程序集加载到新的 AppDomain 中?
问题描述
我需要创建新的 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");
}
}
解决方案
推荐阅读
- awk - awk 命令 - 定义单词的大小
- gitpython - 使用 GitPython 下载特定版本
- c# - 带有 Swagger 的通用 ApiController 基类
- android - 为什么 popBackStack 不使用 FragmentStatePagerAdapter 恢复到上一个片段?
- php - 无法制作 JSON 多级 PHP
- gcc - 与系统库动态或静态链接的库的交叉编译
- r - 拆分单元格的内容并创建一个新列表
- python - 如何在字符串的二进制表示中将 'b' 替换为 0 或 1
- java - 如何从地址位置获取直接字节缓冲区
- html - 为什么这个 HTML 有效