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?
6
A
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
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
- 1. Accès à une méthode statique en C#
- 2. Comment passer une référence de méthode à une méthode différente en C#
- 3. Méthode statique C# à partir de l'objet
- 4. Comment puis-je obtenir une référence à une méthode?
- 5. Lorsque créer une méthode statique
- 6. Est-ce que self.class.delete appelle une méthode de classe?
- 7. Puis-je appeler une méthode statique dans une autre méthode?
- 8. Comment accélérer le temps de construction? (C#/Unmanaged C++)
- 9. C++ MI modèle statique - méthode statique disapears à rejoindre
- 10. Passage d'une méthode C++ à une méthode Objective-C
- 11. Déterminer si une méthode existe dans une classe statique
- 12. Exécuter une méthode sans bloquer le client
- 13. Est-il possible d'obtenir la méthode de nom de cela appelle une autre méthode?
- 14. Comment puis-je passer un objet PHP à une fonction statique pendant la construction de l'objet?
- 15. Problèmes de lien C++ avec la méthode statique
- 16. appelle une fonction de rails de jquery?
- 17. Une référence d'objet est requise pour le champ, la méthode ou la propriété non statique
- 18. Quelle méthode de CreateUserWizard appelle Membership.CreateUser?
- 19. Renvoyer la référence à la variable locale statique en C++
- 20. Transmettre le type de variable à une méthode sans énumérer
- 21. Mettre à niveau une DLL de référence dans un projet C# sans recompiler le projet
- 22. Une référence d'objet est requise pour le champ, la méthode ou la propriété non statique?
- 23. Lien vers une bibliothèque statique liée à une bibliothèque statique
- 24. Lvalue de liaison à une référence
- 25. Comment créer une bibliothèque statique pour iPhone?
- 26. Liaison statique à une bibliothèque dynamique. glibc
- 27. En passant une structure non géré C++ par référence à une méthode gérée C++ provoque une violation d'accès lorsque la structure est référencée
- 28. Comment modifier une cible Xcode existante de dynamique à statique?
- 29. Intégration de sources externes dans une construction
- 30. "Référence indirecte est faite à l'assemblage" Erreur de construction
+ 1, Aussi, il vaut la peine de mentionner que 'className' doit contenir aussi un espace de noms, comme "MyNamespace.Class1" – icl7126