La invocación de los métodos del ensamblado se crea mediante la reflexión de su propietario en .NET.

StackOverflow https://stackoverflow.com/questions/7334670

  •  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!

¿Fue útil?

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;
    }
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top