Определите, является ли приложением WinForms или WebForms

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

[Править]

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

[Сводка] (до сих пор)

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

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

6
задан Community 23 May 2017 в 12:06
поделиться

5 ответов

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

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

в свои проекты и получить к нему доступ с помощью

ConfigurationManager.AppSettings["typeOfSystem"]

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

5
ответ дан 8 December 2019 в 17:19
поделиться

HttpContext.Current может быть нулевым в веб-приложении, если оно выполняет асинхронную обработку. Из этой темы HttpRuntime.Cache может быть более подходящей вещью для тестирования.

2
ответ дан 8 December 2019 в 17:19
поделиться

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

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

[edit]

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

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...
       }
   }
}
1
ответ дан 8 December 2019 в 17:19
поделиться

Проверьте, является ли HttpContext.Current null. Если да, то это не webapp.

4
ответ дан 8 December 2019 в 17:19
поделиться

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

using System.Diagnostics;

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

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

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

Дополнительные сведения о классе Process см. На http://msdn.microsoft.com/en-us/library/system.diagnostics.process_members (v = VS.100) .aspx . .

1
ответ дан 8 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: