2009-09-10 10 views
6

Estoy escribiendo un sistema en C# .net (2.0). Tiene un tipo de arquitectura de módulo conectable. Los ensamblajes se pueden agregar al sistema sin reconstruir los módulos base. Para establecer una conexión con el nuevo módulo, deseo intentar llamar a un método estático en algún otro módulo por nombre. No deseo que se haga referencia al módulo llamado de ninguna manera en tiempo de compilación.C# llamar a un método estático en tiempo de ejecución sin una referencia de tiempo de compilación?

Cuando escribía código no administrado comenzando desde la ruta al archivo .dll, utilizaba LoadLibrary() para obtener el .dll en la memoria y luego utilizaba getProcAddress() para obtener un puntero a la función que deseaba llamar. ¿Cómo logro el mismo resultado en C#/.NET.

Respuesta

16

Después de que el ensamblado se carga utilizando Assembly.LoadFrom (...), se puede obtener el tipo por su nombre y conseguir cualquier método estático:

Type t = Type.GetType(className); 

// get the method 
MethodInfo method = t.GetMethod("MyStaticMethod",BindingFlags.Public|BindingFlags.Static); 

Then you call the method: 

method.Invoke(null,null); // assuming it doesn't take parameters 
+2

+ 1, también vale la pena mencionar que 'className' debe contener también espacio de nombres, como "MyNamespace.Class1" – icl7126

1

He aquí una muestra:

 string assmSpec = ""; // OS PathName to assembly name... 
     if (!File.Exists(assmSpec)) 
      throw new DataImportException(string.Format(
       "Assembly [{0}] cannot be located.", assmSpec)); 
     // ------------------------------------------- 
     Assembly dA; 
     try { dA = Assembly.LoadFrom(assmSpec); } 
     catch(FileNotFoundException nfX) 
     { throw new DataImportException(string.Format(
      "Assembly [{0}] cannot be located.", assmSpec), 
      nfX); } 
     // ------------------------------------------- 
     // Now here you have to instantiate the class 
     // in the assembly by a string classname 
     IImportData iImp = (IImportData)dA.CreateInstance 
          ([Some string value for class Name]); 
     if (iImp == null) 
      throw new DataImportException(
       string.Format("Unable to instantiate {0} from {1}", 
        dataImporter.ClassName, dataImporter.AssemblyName)); 
     // ------------------------------------------- 
     iImp.Process(); // Here you call method on interface that the class implements 
+0

Código para llamar a un método de instancia. Pedí el método estático. Pero, necesitaré este fragmento eventualmente. Gracias. +1 –

Cuestiones relacionadas