Cela m'a étonné pendant un moment sur la façon de le faire. Au départ, je pensais que cela pouvait être réalisé en créant un WebProxy personnalisé qui configurerait la journalisation, et en le chargeant dans l'application principale en utilisant l'élément de configuration . Cependant, le problème est le même que celui des autres suggestions de configuration, à savoir que le code n'est exécuté que lorsque cela est nécessaire (dans ce cas, lorsqu'une requête HTTP est utilisée), ce qui nécessite une modification de l'application d'origine.
Je l'ai atteint cependant en inversant l'approche. Au lieu d'essayer d'obtenir l'application d'origine pour configurer la journalisation, vous pouvez écrire un talon d'une application qui configure la journalisation, puis lance l'application d'origine.
À titre d'exemple:
J'ai une application WinForms appelé Forms.exe
dont le point d'entrée est défini comme:
[STAThread]
internal static void Main()
{
Application.Run(new MainForm());
}
Dans mon application stub (que j'ai comme une application de la console), je configurer l'enregistrement puis charger et exécuter Forms.exe
:
internal static void Main()
{
ConfigureLogging()
Assembly app = Assembly.LoadFrom(@".\Forms.exe");
app.EntryPoint.Invoke(null, null);
}
T il utilise la réflexion pour charger l'autre application dans celle qui configure la journalisation.
Avertissements:
- l'autre application doit être une application .Net pour le charger de cette façon
- vous pourriez avoir besoin d'utiliser réflecteur pour inspecter l'autre application pour travailler le bon arguments à passer au point d'entrée (ie.si elle prend
string[] args
, vous devrez peut-être passer dans un vide string[]
au lieu d'un null
que les arguments)
- la fenêtre de la console de l'application originale se bloque autour tandis que les autres pistes d'application (ce qui est probablement pas un problème, mais si Vous pouvez essayer de le cacher en utilisant FreeConsole)
Appelez-moi fou, mais pourquoi votre outil de connexion ne s'initialise-t-il pas quelque part dans un bloc d'initialisation statique? –
Le but est d'injecter ce code dans une application qui n'a pas été construite pour l'appeler. Un constructeur statique est seulement appelé parfois * avant * le code de la classe est utilisé, il n'y a aucune garantie qu'il sera jamais appelé si vous n'utilisez pas vraiment la classe. Comme l'application n'utilise pas du tout injection-dll, le constructeur statique ne sera pas appelé. –