Подтвердить что ты не робот

Определите, работает ли в ASP.NET или WinForms/консоль без System.Web

Из библиотеки классов мне нужно определить во время выполнения, выполняюсь ли я в приложении ASP.NET или в приложении WinForms/console. Были несколько другие questions спросил по этому вопросу, но для всех этих решений требуется добавить ссылку на System.Web. Если это вообще возможно, при запуске приложений консоли и WinForms я не хочу загружать сборку System.Web в память только для одной строки кода из тысяч.

4b9b3361

Ответ 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.