2010-08-01 3 views
2

Eh bien
c'est une question très simple, les larmes de recherche ne sont tout simplement pas terrible.Découvrez si en cours d'exécution en mode WPF ou en mode console (C#)

Comment puis-je archiver une bibliothèque si je suis en cours d'exécution en tant qu'application de console, par rapport à une application de fenêtre WPF?

Merci pour les conseils,

Chris

+4

Si vous posez cette question que vous faites quelque chose faux, même si nous ne considérons pas qu'il est techniquement possible d'avoir une application avec une console et une interface utilisateur WPF, que se passe-t-il si votre bibliothèque est appelée à partir d'une application WinForms? ou à partir d'une application ASP.NET fonctionnant sous IIS? ou un tout nouveau type d'application qui sera introduit dans une future version de .net? – Nir

+1

Dans mon cas, j'ai un moteur de reporting capable de créer un fichier pdf ou d'afficher un aperçu. (Permettre de sauter/ignorer des parties du code liées à l'aperçu lorsque le moteur est appelé depuis une application de console lui permet de s'exécuter plus vite/ne pas planter en essayant de faire des choses liées à wpf pour une application qui ne le supporte pas. – Wonderbird

Répondre

2

Vous pouvez vérifier si le thread courant est un fil interface utilisateur WPF en vérifiant Dispatcher.Current.

0

ildasm aura une entrée dans le manifeste comme suit:

.subsystem 0x0003  // WINDOWS_CUI 

.subsystem 0x0002  // WINDOWS_GUI 

sur la base subsystemtype vous pouvez dire si son interface graphique ou CUI.

Ces informations sont également disponibles à partir de la commande suivante:

dumpbin ConsoleApplication1.exe /headers 

À partir de votre requête de bibliothèque pour l'assemblage d'entrée et obtenir son chemin complet (. CodeBase Assembly.GetEntryAssembly()) et vous pouvez émettre un de ces commande de connaître le sous-système.

2

De plus, que faire si votre méthode de bibliothèque est appelée à partir d'un thread de travail? Vous n'avez pas dit pourquoi vous avez besoin de savoir, empêchant une bonne réponse. Une approche est que l'application qui utilise votre bibliothèque n'a jamais aucun problème à savoir si sa console ou WPF. Exposez une propriété pour lui permettre de vous le dire. Une autre consiste à utiliser des événements pour que l'application puisse simplement implémenter le gestionnaire d'événements à son gré. L'injection de dépendance en est une autre.

2

Vous pouvez vérifier si les instructions exécutées sont en cours d'exécution dans un hôte WPF avec la déclaration suivante:

if (System.Windows.Application.Current != null) 
{ 
//statements for WPF mode 
} 
else 
{ 
//statements for non WPF mode... 
} 

Pour cela, vous devez faire référence à PresentationFramework.dll