Ayuda Reflection

14/06/2005 - 14:09 por Víctor | Informe spam
Hola, estoy intentando invocar dinamicamente el constructor de una clase
heredada de Panel compilada como librería de clases. El código utilizado es
el siguiente:

try
{
Assembly asm=Assembly.LoadFile(Application.StartupPath +
@"\Panels\ComunicatePanel.dll");

foreach(Module m in asm.GetLoadedModules())
{
foreach(Type t in m.GetTypes())
{
if(t.Name=="ComunicatePanel")
{

foreach(ConstructorInfo ci in t.GetConstructors())
{
// ci.Invoke(null);

if(ci.GetParameters().Length>0)
{
ci,Invoke(new object[]{"login", "password"});

}
}
}


}
}
}
catch(Exception exc)
{
MessageBox.Show(exc.Source + "" + exc.Message + "" + exc.StackTrace);
}


La clase tiene dos constructores, uno sin parámetros y otro con parámetros
(vereis que en la línea comentada invoco al primero con null y al segundo
con dos cadenas para pasarle un login y una contraseña), pero llame al que
llame siempre me da el siguiente fallo según el tratamiento de la excepción:

Origen: mscorlib

Mensaje:Se inició una excepción en el destino de la invocación.

StackTrace: at
System.Reflection.RuntimeConstructorInfo.InternalInvoke(BindingFlags
invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean
isBinderDefault)
at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags
invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.ConstructorInfo.Invoke(Object[] parameters)
at PanelSet.Form1.Form1_Load(Object sender, EventArgs e) in c:\documents
and settings\administrador.accweb\mis documentos\visual studio
projects\panelset\form1.cs:line 113


Tengo que decir, que la libreria, cargada desde un proyecto con la librería
referenciada funciona perfectamente.

Pongo también el código de los constructores para que echeis un vistazo:

public ComunicatePanel():base()

{

InitializeComponent();

}


public ComunicatePanel(string login, string perfil):base()

{

_login=login;

_perfil=perfil;

InitializeComponent();

if(!this.DesignMode)

{

ApplicationConnection();

SetSizeMenu();

}

}


¿Alguna idea?

Muchas gracias.
 

Leer las respuestas

#1 Víctor
14/06/2005 - 16:18 | Informe spam
Falsa alarma, he einvestigado el fallo y era causado a que no copiaba un
ensamblado con un fichero de recursos al directorio de la aplicación. Un
pequeño fallo.

De todas formas gracias y acepto sugerencias al código de invocación
dinámica.
Víctor.


"Víctor" escribió en el mensaje
news:%23ko%
Hola, estoy intentando invocar dinamicamente el constructor de una clase
heredada de Panel compilada como librería de clases. El código utilizado


es
el siguiente:

try
{
Assembly asm=Assembly.LoadFile(Application.StartupPath +
@"\Panels\ComunicatePanel.dll");

foreach(Module m in asm.GetLoadedModules())
{
foreach(Type t in m.GetTypes())
{
if(t.Name=="ComunicatePanel")
{

foreach(ConstructorInfo ci in t.GetConstructors())
{
// ci.Invoke(null);

if(ci.GetParameters().Length>0)
{
ci,Invoke(new object[]{"login", "password"});

}
}
}


}
}
}
catch(Exception exc)
{
MessageBox.Show(exc.Source + "" + exc.Message + "" + exc.StackTrace);
}


La clase tiene dos constructores, uno sin parámetros y otro con parámetros
(vereis que en la línea comentada invoco al primero con null y al segundo
con dos cadenas para pasarle un login y una contraseña), pero llame al que
llame siempre me da el siguiente fallo según el tratamiento de la


excepción:

Origen: mscorlib

Mensaje:Se inició una excepción en el destino de la invocación.

StackTrace: at
System.Reflection.RuntimeConstructorInfo.InternalInvoke(BindingFlags
invokeAttr, Binder binder, Object[] parameters, CultureInfo culture,


Boolean
isBinderDefault)
at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags
invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.ConstructorInfo.Invoke(Object[] parameters)
at PanelSet.Form1.Form1_Load(Object sender, EventArgs e) in


c:\documents
and settings\administrador.accweb\mis documentos\visual studio
projects\panelset\form1.cs:line 113


Tengo que decir, que la libreria, cargada desde un proyecto con la


librería
referenciada funciona perfectamente.

Pongo también el código de los constructores para que echeis un vistazo:

public ComunicatePanel():base()

{

InitializeComponent();

}


public ComunicatePanel(string login, string perfil):base()

{

_login=login;

_perfil=perfil;

InitializeComponent();

if(!this.DesignMode)

{

ApplicationConnection();

SetSizeMenu();

}

}


¿Alguna idea?

Muchas gracias.




Preguntas similares