【发布时间】:2014-09-29 18:27:12
【问题描述】:
我正在尝试执行以下操作:
- 下载一个字节数组,其中包含我需要执行的程序集。
- 在新的应用程序域中从此程序集中加载一个对象并在该对象上执行方法
这是我尝试将程序集加载到新应用程序域的代码:
public object Execute(byte[] agentCode)
{
var app = AppDomain.CreateDomain("MonitoringProxy", AppDomain.CurrentDomain.Evidence, new AppDomainSetup {ApplicationBase = AppDomain.CurrentDomain.BaseDirectory}, new PermissionSet(PermissionState.Unrestricted));
app.AssemblyResolve += AppOnAssemblyResolve;
var assembly = app.Load(agentCode);
代码库在最后一行终止,并显示以下消息:
附加信息:无法加载文件或程序集 'Alertera.AgentProxy,版本=1.0.0.0,文化=中性, PublicKeyToken=null' 或其依赖项之一。系统无法 找到指定的文件。
没有任何代码会触发 AppOnAssemblyResolve 函数。 有趣的是它正确地读取了程序集的名称。此外,Alertera.AgentProxy 程序集没有任何外部依赖项,除了 System 和 Newtonsoft.Json。不过Newtsoft.Json已经作为资源嵌入到里面了,所以不需要单独加载。
有什么建议吗?使用 .NET 2 实现最大兼容性
【问题讨论】:
-
我认为这是失败的,因为
Load正在将程序集加载到当前域(没有程序集解析处理程序),根据文档:“此方法应仅用于加载将程序集加载到当前应用程序域中。提供此方法是为了方便无法调用静态 Assembly.Load 方法的互操作调用者。要将程序集加载到其他应用程序域中,请使用 CreateInstanceAndUnwrap 等方法。" -
我看到了那些 cmets.. 我想我不知道该怎么做。我正在调用 CreateInstanceAndUnwrap,但在程序集加载到应用程序域之后。 CreateInstanceAndUnwrap 没有办法加载字节数组。您能否分享代码示例以将程序集正确加载到新的应用程序域中?
-
对此一无所知,但 Fuslogvw.exe 有帮助吗?
-
当您说“Newtsoft.Json 已作为资源嵌入其中”时,您是如何做到的?您是在运行时加载它,还是在 Alerteara 汇编中有对 Newtsoft 的强烈引用?
-
@AladinHdabe stackoverflow.com/questions/189549/… - 看看 Lars 的回复,我就是这样做的
标签: c# .net-assembly appdomain