2009-09-10 15 views
6

J'écris un système en C# .net (2.0). Il a un module enfichable sorte d'architecture. Les assemblages peuvent être ajoutés au système sans avoir à reconstruire les modules de base. Pour établir une connexion avec le nouveau module, je souhaite essayer d'appeler une méthode statique dans un autre module par son nom. Je ne veux pas que le module appelé soit référencé de quelque manière que ce soit au moment de la construction. Lorsque j'écrivais du code non géré en commençant par le chemin du fichier .dll, j'utilisais LoadLibrary() pour mettre le fichier .dll en mémoire, puis j'utilise get GetProcAddress() pour obtenir un pointeur vers la fonction que je souhaitais appeler. Comment puis-je obtenir le même résultat en C#/.NET.C# appelle une méthode statique à l'exécution sans une référence de temps de construction?

Répondre

16

Après l'assemblage est chargé à l'aide Assembly.LoadFrom (...), vous pouvez obtenir le type de nom et d'obtenir une méthode statique:

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, Aussi, il vaut la peine de mentionner que 'className' doit contenir aussi un espace de noms, comme "MyNamespace.Class1" – icl7126

1

est ici un échantillon:

 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

Code pour l'appel d'une méthode d'instance. J'ai demandé une méthode statique. Mais, j'aurai besoin de ce fragment finalement. Merci. +1 –

Questions connexes