Из библиотеки классов мне нужно определить во время выполнения, выполняюсь ли я в приложении ASP.NET или в приложении WinForms/console. Были несколько другие questions спросил по этому вопросу, но для всех этих решений требуется добавить ссылку на System.Web. Если это вообще возможно, при запуске приложений консоли и WinForms я не хочу загружать сборку System.Web в память только для одной строки кода из тысяч.
Определите, работает ли в ASP.NET или WinForms/консоль без System.Web
Ответ 1
Используйте System.Diagnostics.Process.GetCurrentProcess().ProcessName
Если вы используете ASP.NET, то сборка будет названа так:
-
Если вы используете IIS 6.0 или IIS 7.0, это имя w3wp.exe.
-
Если вы используете более раннюю версию IIS, имя aspnet_wp.exe.
Другая идея: как насчет тестирования домена процесса/приложения для наличия System.Web.dll с API AppDomain.CurrentDomain.GetAssemblies()?
Ответ 2
В одном из вопросов, которые вы связали, содержится ответ, предлагающий Environment.UserInteractive.
Вы также можете попытаться проанализировать StackTrace вашего кода, чтобы выяснить, откуда вы вышли.
Ответ 3
Вы можете попробовать что-то на основе Assembly.GetEntryAssembly(). Как отмечено в комментарии ниже, GetEntryAssembly() возвращает NULL, если текущий код запускается в контексте веб-приложения или службы. Он вернет некоторую ненулевую ссылку в случае автономных приложений, таких как WinForm или консольные приложения.
Отредактировано для изменения исходного ответа из-за комментария.
Ответ 4
Вы можете проверить System.Diagnostics.Process.GetCurrentProcess(). ProcessName;. Если он начинается с aspnet, то он asp.net. В противном случае, рабочий стол.
Ответ 5
Еще один взлом:
System.Configuration.ConfigurationManager.OpenExeConfiguration выдает исключение ArgumentException конкретным сообщением, если вы не работаете внутри автономного exe. Вы можете использовать этот факт для проверки следующим образом:
bool notAnExe = false ;
try
{
// see if we're running in an exe.
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
}
catch(ArgumentException aex)
{
if(aex.Message == "exePath must be specified when not running inside a stand alone exe.")
{
notAnExe = true ;
}
}
Ответ 6
Он может выглядеть как хак. Он использует DomainManager тип текущего AppDomain. Также проверьте AppDomainManager
public static class AspContext
{
public static bool IsAspNet()
{
var appDomainManager = AppDomain.CurrentDomain.DomainManager;
return appDomainManager != null && appDomainManager.GetType().Name.Contains("AspNetAppDomainManager");
}
}
Или вы можете использовать этот другой ответ на SO
Ответ 7
Это старый поток, но вот новый ответ, который не является взломом.
private bool IsExe()
{
var domainManager = AppDomain.CurrentDomain.DomainManager;
if (domainManager == null) return false;
var entryAssembly = domainManager.EntryAssembly;
if (entryAssembly == null) return false;
return entryAssembly.Location.EndsWith(".exe", StringComparison.OrdinalIgnoreCase);
}
Это не скажет вам, является ли приложение ASP.Net или нет, но он скажет вам, является ли это консольным или WinForms-приложением, что является противоположным подходом к большинству других ответов здесь. Например, если это приложение OWIN, метод IsExe
возвращает false, даже если это не приложение ASP.Net.
Ответ 8
HostingEnvironment.IsHosted