7
votes

C # Réflexion: est-il possible de trouver une instance d'un objet au moment de l'exécution?

Je me demande s'il est possible d'utiliser la réflexion pour localiser un objet au moment de l'exécution? C'est plus d'expérience qu'une exigence pratique.

J'ai utilisé la méthode .getType () sur une instance d'objet pour faire diverses choses à l'objet, mais ma question est la suivante: que si je connais un objet d'un certain type existe au moment de l'exécution, mais je ne peux pas me référer à son nom.

comme exemple plus concret, supposons que j'ai une application WinForms qui charge une DLL - comment la DLL pourrait-elle localiser indépendamment une référence à l'objet de formulaire afin d'interagir avec le formulaire ou d'appeler une méthode publique?

Est-ce que cela est encore possible?


0 commentaires

7 Réponses :


9
votes

non, fondamentalement.

Vous pouvez avoir une sorte de carte globale horrible de type à "l'instance du type qui m'intéresse" mais sinon, non.

Fondamentalement, l'application WinForms devrait transmettre une référence au formulaire dans la DLL en quelque sorte.


0 commentaires

2
votes

Nope Ce n'est pas possible, car les références sont implémentées en privé par Microsoft, elles ne sont pas des pointeurs par rapport à C / C ++, dans Old C / C ++, vous pouvez numériser votre mémoire mais dans .net Il n'y a pas de tels outils.


0 commentaires

0
votes

Je n'ai pas compris votre question. Lorsque vous vous référez à un objet, vous voulez dire que vous recherchez une instance d'objet ou faites-vous référence à la recherche d'un type d'objet?

Si vous recherchez une instance, la réponse est non. Si vous recherchez un type par nom au moment de l'exécution, la réponse est oui.

La ligne suivante vous permettra d'obtenir tous les assemblages chargés dans l'AppDomain: AppDomain.CurrentDomaine.GetAssemblages ();

La méthode d'instance assembly.getTypes () vous obtiendra tous les types d'assemblage.

Edit: Vous avez oublié que vous connaissiez le nom du type. Vous pouvez également utiliser assemblage.getType (nom de chaîne) .


0 commentaires

0
votes

Vous pouvez concevoir un cadre de plug-in de votre application. Voici un exemple: xxx pré>

alors vous pouvez trouver vos plugins lorsque vous chargez un montage au moment de l'exécution. P>

foreach(var type in assembly.GetTypes())
{
if(typeof(IPlugin).IsAssignableFrom(type))
var plugin=(IPlugin)Activator.CreateInstance(type);
plugin.Load(_mainForm);
}


0 commentaires

0
votes

Comme d'autres personnes ont déjà répondu, non, ce n'est pas possible de manière générale.

Mais, pour un scénario plus spécifique, vous pouvez obtenir une liste de toutes les fenêtres de la Win API, puis examiner chacun Pour les propriétés que vous essayez de rechercher. xxx


1 commentaires

C'est vraiment le long chemin. L'objet application gère tous ceux de la collection openForms (pour les applications WinForms).



0
votes

Si vous expérimentez et essayez de localiser le formulaire principal de votre DLL, vous pouvez le faire:

//get the current process
System.Diagnostics.Process p = System.Diagnostics.Process.GetCurrentProcess();

//get its main windows handle (only works, if the form is already created)
IntPtr hWnd = p.MainWindowHandle;

//locate the form by its native handle
System.Windows.Forms.Form f = System.Windows.Forms.Form.FromHandle(hWnd) as System.Windows.Forms.Form;


0 commentaires

1
votes

Jon Skeet est correct que ce n'est pas possible pour n'importe quel type arbitraire.

Pour votre exemple concret, c'est possible. Et vous n'avez pas besoin de p / invoquer Enumwindows CODE> ou d'utiliser form.fromhandle () code> p>

Form f = Application.OpenForms.Where(x => x.GetType().Name == "FormIWant").FirstOrDefault();


0 commentaires