AppDomain.CreateInstanceFromAndUnwrap – 无法转换透明代理

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

  1. 使用CreateRemoteThread强制目标进程在非托管引导DLL上调用LoadLibrary 。 从这一点开始,我们在目标进程中执行代码。
  2. 我的引导DLL然后创建一个CLR实例并在其上调用ExecuteInDefaultAppDomain ,它执行托管助手DLL中的方法。
  3. 此方法创建一个新的AppDomain并调用AppDomain.CreateInstanceFromAndUnwrap将执行传递到我的有效负载DLL,并将结果转换为IInjectionPayload
  4. 我的想法是我的有效负载DLL公开了一个实现IInjectionPayload的类,因此助手DLL可以简单地调用payload.Run()

我这样做是为了通过简单地调用AppDomain.Unload (在发信号通知清理之后)完全卸载有效负载代码。

这种方法有效 – 我的有效负载DLL中的类正在目标进程中实例化,因此可以执行代码 – 但是我无法将CreateInstanceFromAndUnwrap返回的对象IInjectionPayload转换为IInjectionPayload ; 它抛出以下exception:

无法转换透明代理以键入’blah.Blah.IInjectionPayload’。

我尝试使用CreateInstanceAndUnwrapActivator.CreateInstanceFrom后跟Object.Unwrap ,但这两种方法也会导致抛出相同的exception。

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

public class Program : MarshalByRefObject, IInjectionPayload

我很难过,因为有效负载DLL肯定会被加载,并且正在按照预期实例化类。 任何帮助将非常感激。

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

它看起来像.NET框架中的一个错误。 解决方案是向AppDomain.CurrentDomain.AssemblyResolve添加一个处理程序,该处理程序在args.Name处手动加载并返回程序集。 然后你可以调用CreateInstanceFromAndUnwrap而不会抛出exception。