Существует ли способ определить, является ли запущенным приложением WinForms или сеть во времени выполнения?
[Править]
Есть ли на самом деле проблема, если я ссылаюсь на обоих System.Web
и System.Windows.Forms
в моей библиотеке классов?
[Сводка] (до сих пор)
Что я изучил до сих пор:
HttpContext.Current
null
если зарегистрировано асинхронный поток, таким образом, это не может надежно использоваться во вспомогательном методе. HttpRuntime.Cache
действительно не помогает, так как я не ищу кэшируемый контекст вообще (или я пропускаю что-то здесь?).System.Reflection.Assembly.GetEntryAssembly()
кажется, возвращается null
в веб-приложениях, и не пустой в WinForms. Это должно считаться само собой разумеющимся? Должно быть больше "взломов" как это, поэтому который использовать?System.Web
и System.Windows.Forms
в помощнике библиотека должна быть прекрасной, согласно этому потоку.В вашем правке вы указываете, что ваш вспомогательный класс находится в отдельной сборке. Если вы хотите избежать ссылок и у вас есть контроль над файлами app.config, вы можете поместить
<add key="typeOfSystem" value="Forms|Web"/>
в свои проекты и получить к нему доступ с помощью
ConfigurationManager.AppSettings["typeOfSystem"]
, используя ConfigurationManager вместе с его свойством AppSettings . Не забудьте добавить ссылку на System.Configuration
в свой проект. Обратите внимание, что вы получаете настройки приложения хостинга. При этом вам нужно добавить ключ в app.config родительского приложения или вывести ошибку или предупреждение, если это, возможно, не указано.
HttpContext.Current
может быть нулевым в веб-приложении, если оно выполняет асинхронную обработку. Из этой темы HttpRuntime.Cache
может быть более подходящей вещью для тестирования.
Чтобы этот вопрос имел смысл, вы должны были включить в свой проект ссылки на 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...
}
}
}
Проверьте, является ли HttpContext.Current
null
. Если да, то это не webapp.
Другой способ сделать это - посмотреть имя текущего процесса.
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 . .