La invocación de los métodos del ensamblado se crea mediante la reflexión de su propietario en .NET.
-
27-10-2019 - |
Pregunta
Sé cómo crear algún objeto mediante reflexión y pasar algunos argumentos.
Dim assembly As System.Reflection.Assembly
Dim control As Object
assembly = System.Reflection.Assembly.Load("WpfControlLibrary1")
control = assembly.CreateInstance("WpfControlLibrary1.Main")
control.Maximize("true")
Mi pregunta es si existe una forma de obtener información del "control" al "propietario" de ese "control".
Supongo que debería haber alguna forma de tener una interacción bidireccional entre el propietario y el ensamblaje creado.
Por ejemplo, dentro de algún temporizador quiero obtener los estados del "control" periódicamente.
foreach(...)
{
var state = control.GetState(); // ????? Is it possible ?
Sleep(10000);
}
Aquí podemos ver cómo pasar los parámetros.
Entonces, lo que necesito es recuperar algún objeto devuelto.
¡Gracias de antemano por cualquier pista útil, mis hermanos y hermanas en programación!
Solución
Para invocar un método definido en clases en otro ensamblado, necesita algo como esto:
Assembly assembly = Assembly.Load("OtherAssembly");
Type controlType = assembly.GetType("OtherAssembly.OtherAssemblyClass");
object control = Activator.CreateInstance(controlType);
controlType.InvokeMember("SetFullName", BindingFlags.InvokeMethod, null,
control, new object[] { "FirstName", "LastNameski" });
Esto invocará el método SetFullName
de la clase OtherAssemblyClass
de la asamblea OtherAssembly
sobre el objeto control
, usando los parámetros "FirstName"
y "LastNameski"
object result = controlType.InvokeMember("GetFullName",
BindingFlags.InvokeMethod, null, control, null);
Esto invocará un método llamado GetFullName
en ese mismo objeto, que no acepta parámetros (de ahí el último null
en la llamada) y devuelve una cadena.
Console.WriteLine(result.GetType().FullName);
Esto se imprimirá "System.String"
Console.WriteLine(result);
Esto se imprimirá "FirstName LastNameski"
.
en el ejemplo, el otro ensamblado contiene esta clase:
namespace OtherAssembly
{
public class OtherAssemblyClass
{
private string firstName;
private string lastName;
public string GetFullName()
{
return firstName + " " + lastName;
}
public void SetFullName(string first, string last)
{
firstName = first;
lastName = last;
}
}
}