AppDomain.CreateInstanceFromAndUnwrap - Невозможно привести прозрачный прокси - PullRequest
19 голосов
/ 17 сентября 2009

Я пишу библиотеку .NET для внедрения управляемых DLL во внешние процессы. Мой текущий подход:

  1. Используйте CreateRemoteThread, чтобы заставить целевой процесс вызывать LoadLibrary для неуправляемой библиотеки начальной загрузки. С этого момента мы выполняем код в целевом процессе.
  2. Моя библиотека начальной загрузки затем создает экземпляр CLR и вызывает на нем ExecuteInDefaultAppDomain, который выполняет метод в управляемой вспомогательной DLL.
  3. Этот метод создает новый домен AppDomain и вызывает AppDomain.CreateInstanceFromAndUnwrap для передачи выполнения в мою DLL полезной нагрузки, приводя результат к IInjectionPayload.
  4. Идея состоит в том, что моя DLL полезной нагрузки предоставляет класс, который реализует IInjectionPayload, поэтому вспомогательная DLL может просто вызвать payload.Run().

Я делаю это таким образом, чтобы код полезной нагрузки можно было полностью выгрузить, просто позвонив по номеру AppDomain.Unload (после того, как он дал понять, чтобы он очистился).

Этот подход работает - класс в моей DLL полезной нагрузки создается в целевом процессе, поэтому код может быть выполнен, но я не могу привести объект, возвращенный CreateInstanceFromAndUnwrap, к IInjectionPayload; выдает следующее исключение:

Невозможно привести прозрачный прокси к типу «blah.Blah.IInjectionPayload».

Я пытался использовать CreateInstanceAndUnwrap и Activator.CreateInstanceFrom с последующим Object.Unwrap, но оба эти метода также вызывают одно и то же исключение.

Подпись моего класса полезной нагрузки:

public class Program : MarshalByRefObject, IInjectionPayload

Я в замешательстве, потому что DLL полезной нагрузки определенно загружается и создается экземпляр класса, как и предполагалось. Любая помощь будет высоко ценится.

1 Ответ

23 голосов
/ 17 сентября 2009

Найдено решение этой проблемы здесь: http://www.west -wind.com / WebLog / posts / 601200.aspx

Это похоже на ошибку в .NET Framework. Решение состоит в том, чтобы добавить обработчик к AppDomain.CurrentDomain.AssemblyResolve, который вручную загружает и возвращает сборку в args.Name. Затем вы можете позвонить CreateInstanceFromAndUnwrap без исключения.

...