Определите, является ли приложение WinForms или WebForms - PullRequest
6 голосов
/ 02 июня 2010

Есть ли способ определить, является ли запущенное приложение WinForms или Web во время выполнения?

[Изменить]

Есть ли проблема, если я ссылаюсь на System.Web и System.Windows.Forms в моей библиотеке классов?

[Резюме] (пока)

Что я выучил до сих пор:

  • HttpContext.Current равно null, если проверено в асинхронном потоке, поэтому его нельзя надежно использовать во вспомогательном методе. HttpRuntime.Cache на самом деле не помогает, так как я вообще не ищу кешированный контекст (или я что-то здесь упускаю?).
  • с другой стороны, System.Reflection.Assembly.GetEntryAssembly(), похоже, возвращает null в веб-приложениях и не равно нулю в WinForms. Должно ли это быть само собой разумеющимся? Таких «хаков» должно быть больше, и какой из них использовать?
  • ссылки на System.Web и System.Windows.Forms в вспомогательной библиотеке должны быть хорошими, согласно этой теме .

Ответы [ 7 ]

5 голосов
/ 02 июня 2010

При редактировании вы указываете, что ваш вспомогательный класс находится в отдельной сборке. Если вы хотите избежать ссылок и у вас есть контроль над файлами app.config, вы можете поставить

<add key="typeOfSystem" value="Forms|Web"/>

в ваших проектах и ​​доступ к нему с помощью

ConfigurationManager.AppSettings["typeOfSystem"]

с использованием ConfigurationManager вместе со свойством AppSettings . Не забудьте добавить ссылку на System.Configuration в ваш проект. Обратите внимание, что вы получаете AppSettings приложения хостинга. При этом необходимо добавить ключ в файл app.config вашего родительского приложения или вывести некоторую ошибку или предупреждение, если это не указано, возможно.

4 голосов
/ 02 июня 2010

Проверьте, является ли HttpContext.Current значением null. Если это так, то это не веб-приложение.

2 голосов
/ 02 июня 2010

HttpContext.Current может быть нулевым в веб-приложении, если оно выполняет асинхронную обработку. Начиная с эту тему HttpRuntime.Cache можно проверить лучше.

1 голос
/ 11 июля 2013

AppDomain содержит информацию о связанном файле конфигурации. Поскольку у веб-приложений есть свой конфигурационный файл с именем "web.config", а у всех остальных - "{app} .exe.config", это определяет тип приложения.

/// <summary>
/// Extensions for the AppDomain class
/// </summary>
public static partial class AppDomainExtensions
{
    /// <summary>
    /// Determines whether the specified app domain is a web app.
    /// </summary>
    /// <param name="appDomain">The app domain.</param>
    /// <returns>
    ///     <c>true</c> if the specified app domain is a web app; otherwise, 
    /// <c>false</c>.
    /// </returns>
    public static bool IsWebApp(this AppDomain appDomain)
    {
        var configFile = (string)appDomain.GetData("APP_CONFIG_FILE");
        if (string.IsNullOrEmpty(configFile)) return false;
        return (
          Path.GetFileNameWithoutExtension(configFile) ?? string.Empty
          ).Equals(
            "WEB", 
            StringComparison.OrdinalIgnoreCase);
    }
}
1 голос
/ 02 июня 2010

Другой способ сделать это - посмотреть текущее имя процесса.

using System.Diagnostics;

public class Helper
{
  public static bool IsCurrentAppWeb()
  {
    return Process.GetCurrentProcess().ProcessName == "aspnet_wp"; 
  }
}

Это решение работает для XP, строка для сравнения зависит от среды. При запуске VS в режиме отладки по умолчанию вам нужно будет сравнить имя интегрированного сервера тестирования.

Не самое красивое решение, но оно позволяет вам опускать ссылки на веб-сборки или сборки winforms.

Посмотрите http://msdn.microsoft.com/en-us/library/system.diagnostics.process_members(v=VS.100).aspx для более подробной информации о классе Process.

1 голос
/ 02 июня 2010

Чтобы этот вопрос имел смысл, вы должны были бы включить ссылки на System.Web и System.Windows в вашем проекте. Это само по себе (на мой взгляд) немного запах кода.

Скорее всего, вам лучше собрать необходимую информацию в вызывающем методе (который должен быть надежно размещен либо в веб-области, либо в домене WinForms) и передать ее любым методам, для которых эта информация нужна в качестве аргумента.

[править]

Один из способов сделать это показан ниже. Все еще безобразно, но это означает, что вам нужно только один раз установить тот факт, что вы находитесь в веб-приложении.

public class Helper 
{ 
   public static bool IsCurrentAppWeb; //defaults to false
   public bool TheActualHelpFullFunction()
   {
       if(Helper.IsCurrentAppWeb)
       {
           //do web specific things
       }
       else
       {
           //do things the non-web way.
           //note that this does not tell you 
           //if you are currently running a WinForm or service or...
       }
   }
}
0 голосов
/ 08 ноября 2013

У вас есть удобный способ сделать это с помощью свойства framework:

HostingEnvironment.IsHosted

Ссылка на System.Web и добавление пространства имен System.Web.Hosting.

Когда IsHosted имеет значение true, это означает, чтохост - это сеть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...