c# - servidor - AppDomain.CreateInstanceFromAndUnwrap-No se puede convertir el proxy transparente
squid configurar proxy transparente (1)
Encontró la solución para este problema aquí: http://www.west-wind.com/WebLog/posts/601200.aspx
Parece un error en el marco .NET. La solución es agregar un controlador a AppDomain.CurrentDomain.AssemblyResolve
que carga y devuelve manualmente el ensamblado en args.Name
. Luego puede llamar a CreateInstanceFromAndUnwrap
sin que se lance una excepción.
Estoy escribiendo una biblioteca .NET para inyectar DLL administradas en procesos externos. Mi enfoque actual es:
- Use
CreateRemoteThread
para forzar que el proceso de destino llame aLoadLibrary
en una DLL deLoadLibrary
deLoadLibrary
no administrada. Desde este punto estamos ejecutando código en el proceso objetivo. - Mi bootstrap DLL luego crea una instancia del CLR y llama a
ExecuteInDefaultAppDomain
en él, lo que ejecuta un método en una DLL de ayuda administrada. - Este método crea un nuevo AppDomain y llama a
AppDomain.CreateInstanceFromAndUnwrap
para pasar la ejecución a mi DLL de carga útil,IInjectionPayload
el resultado comoIInjectionPayload
. - La idea es que mi DLL de carga útil expone una clase que implementa
IInjectionPayload
, por lo que la DLL auxiliar puede simplemente llamar apayload.Run()
.
Lo hago de esta manera para que el código de carga útil pueda descargarse completamente simplemente llamando a AppDomain.Unload
(después de indicarlo para que se limpie).
Este enfoque funciona: la clase en mi DLL de carga útil se está instanciando en el proceso objetivo, por lo que se puede ejecutar el código, pero no puedo convertir el objeto devuelto por CreateInstanceFromAndUnwrap
a un IInjectionPayload
; lanza la siguiente excepción:
No se puede convertir el proxy transparente para escribir ''blah.Blah.IInjectionPayload''.
He intentado usar CreateInstanceAndUnwrap
y Activator.CreateInstanceFrom
seguido de Object.Unwrap
, pero ambos métodos también hacen que se Object.Unwrap
la misma excepción.
La firma de mi clase de carga útil es:
public class Program : MarshalByRefObject, IInjectionPayload
Estoy perplejo porque la DLL de carga útil definitivamente se está cargando y la clase está siendo instanciada, según lo previsto. Cualquier ayuda sería muy apreciada.