首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AppDomain.CreateInstanceFromAndUnwrap -无法转换透明代理

AppDomain.CreateInstanceFromAndUnwrap -无法转换透明代理
EN

Stack Overflow用户
提问于 2009-09-17 10:00:58
回答 1查看 14.4K关注 0票数 21

我正在编写一个.NET库,将托管DLL注入外部进程。我目前的做法是:

  1. 使用CreateRemoteThread强制目标进程在非托管引导DLL上调用LoadLibrary。从这一点开始,我们在目标进程中执行代码。然后,IInjectionPayload.
  2. The payload.Run().

  • 引导DLL创建一个CLR实例并在其上调用ExecuteInDefaultAppDomain,后者在托管助手DLL中执行一个方法。

  • 该方法创建一个新的AppDomain并调用AppDomain.CreateInstanceFromAndUnwrap将执行传递到我的有效负载DLL中,将结果转换为payload.Run().

的思想是,我的有效负载DLL公开了一个实现IInjectionPayload的类,因此助手DLL可以简单地调用payload.Run().

我是这样做的,这样就可以通过调用AppDomain.Unload (在发送信号清理它之后)完全卸载有效负载代码。

这种方法有效--我的有效负载DLL中的类在目标进程中被实例化,因此可以执行代码--但我不能将CreateInstanceFromAndUnwrap返回的对象转换为IInjectionPayload;它引发以下异常:

无法将透明代理强制转换为“blah.Blah.IjectionPayload”。

我尝试过使用CreateInstanceAndUnwrapActivator.CreateInstanceFromObject.Unwrap,但这两个方法都会引发相同的异常。

我的有效负载类的签名是:

public class Program : MarshalByRefObject, IInjectionPayload

我很难理解,因为有效负载DLL肯定会被加载,并且类正按预期被实例化。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-09-17 12:43:27

在这里找到了解决这个问题的方法:http://www.west-wind.com/WebLog/posts/601200.aspx

它看起来像.NET框架中的一个bug。解决方案是向AppDomain.CurrentDomain.AssemblyResolve添加一个处理程序,该处理程序在args.Name处手动加载和返回程序集。然后,您可以调用CreateInstanceFromAndUnwrap而不引发异常。

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1437831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档