Bestimmen, ob die Ausführung in ASP.NET oder WinForms/Konsole ohne System.Web
Aus einer Klassenbibliothek, die ich brauche, um zu bestimmen, die zur Laufzeit, ob ich in einer ASP.NET app oder WinForms/console app. Es wurden mehrere andere Fragen gefragt zu dem Thema, aber alle diese Lösungen benötigen Sie einen Verweis auf System.Web. Wenn überhaupt möglich, beim ausführen meiner Konsole und WinForms-apps, die ich nicht wollen, um das System zu starten.Web-assembly in den Speicher nur für eine Zeile code aus tausenden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
System.Diagnostics.Process.GetCurrentProcess().ProcessName
Wenn Sie ASP.NET dann die Montage benannt werden folgendermassen:
Wenn Sie IIS 6.0 oder IIS 7.0, der name ist w3wp.exe.
Wenn Sie mit einer früheren version von IIS, der name ist aspnet_wp.exe.
Andere Idee: Wie wäre die Prüfung der Prozess - /app-Domäne auf die Anwesenheit von System.Web.dll mit der Anwendungsdomäne.CurrentDomain.GetAssemblies () - API?
System.Diagnostics.Process.GetCurrentProcess().ProcessName
als Ausgangspunkt. Allerdings, die überprüfung für bestimmte Rückgabewerte fühlt Art hacky. Wenn der name des Prozesses ändert sich mit IIS 8, würde ich ein update meiner app. Werde ich haben, um ihm einige Gedanken.System.Diagnostics.Process.GetCurrentProcess().ProcessName
für nicht-web-Anwendungen; und 3) IIS-process-name ist eine sinnvolle Voreinstellung, wenn es Veränderungen mit IIS 8 oder wenn ich nicht, um zu bestimmen, die anderen Namen Weg. Vielen Dank für Ihre Hilfe, Paul.Eine der Fragen, die Sie im Zusammenhang mit enthielt eine Antwort darauf hindeutet,Umwelt.UserInteractive.
Könnte man auch versuchen, zu analysieren, die StackTrace des Codes herausfinden, wo Sie sind aufgerufen, aus.
Environment.UserInteractive
zurückfalse
wenn eine Konsole app ausgeführt wird, von der Windows-Task-Scheduler, so dass ich kann nicht Sie verlassen sich auf es als ein flag, das unterscheidet die web-apps von der Konsole apps. Ich werde versuchen zu analysieren, ein stack-trace und sehen, was ich mit oben kommen kann.Könnten Sie versuchen, etwas, was sich auf die Montage.GetEntryAssembly(). Wie bereits im Kommentar unten, GetEntryAssembly() gibt NULL zurück, wenn der aktuelle code ausgeführt wird, im Kontext einer web-Anwendung oder den Dienst. Es werden wieder einige nicht-null-Verweis in Fällen von standalone-apps wie Windows forms oder console-apps.
Bearbeitet werden, um die original-Antwort, weil der Kommentar.
Assembly.GetEntryAssembly()
zurücknull
für web-Anwendungen und web-services. Guter Gedanke, aber.Noch ein weiterer hacken:
System.- Konfiguration.ConfigurationManager.OpenExeConfiguration löst eine ArgumentException mit einer speziellen Nachricht, wenn Sie nicht innerhalb einer standalone-exe. Könnten Sie diese Tatsache verwenden, um zu überprüfen, die in dieser Weise:
Können Sie check-System.Diagnostik.Prozess.GetCurrentProcess().ProcessName;. Wenn es beginnt mit aspnet, dann ist es asp.net. Ansonsten desktop.
Vielleicht erscheint es wie ein hack. Es verwendet die DomainManager Art der Aktuellen Anwendungsdomäne. Überprüfen Sie auch AppDomainManager
Oder verwenden Sie diese andere Antwort auf SO
Dies ist ein Alter thread, aber hier ist eine neue Antwort, das ist kein hack.
Diese wird Ihnen nicht sagen, wenn die Anwendung ASP.Net oder auch nicht, aber es wird Ihnen sagen, wenn dies ist eine Konsole oder WinForms-app, die den entgegengesetzten Ansatz zu den meisten anderen Antworten hier. Zum Beispiel, wenn dieser eine OWIN Anwendung der
IsExe
Methode wird false zurückgegeben, obwohl dies nicht ein ASP.Net -Anwendung.MSDN Docs