Как определить тип приложения .Net? - PullRequest
4 голосов
/ 18 мая 2009

У меня есть библиотека, которая должна реагировать на исключения по-разному, в зависимости от того, работает ли она в консольном приложении, WinForms, AspNet или Windows Service. Я экспериментировал с просмотром различных свойств в пространствах имен System.Windows.Forms и System.Web, но не могу найти надежного способа точно определить, какое приложение размещает мою библиотеку. Кто-нибудь был здесь раньше? У кого-нибудь есть надежное решение?

Ответы [ 5 ]

5 голосов
/ 18 мая 2009

Если я правильно понимаю, что вы ищете, у вас есть одна библиотека, которая выполняет обработку ошибок, но вы хотите, чтобы библиотека знала, является ли источник web, console, winforms и т. Д .?

Возможно, вы сможете использовать свойство в библиотеке, скажем перечисление, которое отслеживает тип приложений-потребителей. Например ...

ErrorLogger error = new ErrorLogger(ErrorLoggerAppType.WinForm);
ErrorLogger error = new ErrorLogger(ErrorLoggerAppType.Web);
ErrorLogger error = new ErrorLogger(ErrorLoggerAppType.Console);

РЕДАКТИРОВАТЬ
От Самира в комментариях ...
Кроме того, вы всегда можете просто иметь класс для каждого типа приложения, реализующего один и тот же интерфейс в вашей библиотеке регистрации ошибок.

Например, в веб-приложении вы используете:

WebErrorLogger error = new WebErrorLogger();
3 голосов
/ 18 мая 2009

Я бы поставил под сомнение ваш дизайн, прежде чем идти по этому маршруту, но я подумал, что это интересный вызов, и хотел посмотреть, смогу ли я найти его в любом случае.

ASP.Net. Проверьте, не является ли HttpContext.Current нулевым. Вы также можете посмотреть System.Web.Hosting.ApplicationManager.GetApplicationManager (), но я не уверен, как это будет происходить за пределами Asp.net

Оконные формы: Вы можете попробовать использовать System.Windows.Forms.Application.OpenForms, это вернет все открытые формы. Делается предположение, что приложение формы Windows никогда не будет иметь никаких форм. Также консольное приложение может также запустить форму выигрыша.

Служба: Не уверен в этом, но мне интересно, если вы можете проверить название процесса. Также должен быть Windows API, поскольку диспетчер задач показывает, когда процесс является службой (по крайней мере, в Vista это делает)

3 голосов
/ 18 мая 2009

Звучит так, как будто лучше всего справиться с настройкой. Возможно внедрение чего-то вроде интерфейса IExceptionHandler через IOC.

2 голосов
/ 18 мая 2009

Такое ощущение, что вы хотели бы немного больше взглянуть на дизайн, хотя я спонтанен. Библиотека классов не должна знать такие вещи о вызывающей стороне.

Что вы хотите изменить в поведении обработки исключений в зависимости от контекста, в котором оно запущено?

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

1 голос
/ 18 мая 2009
BOOL IsConsole(PBYTE file)
{
    PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)file;
    if(pDosHeader->e_magic == IMAGE_DOS_SIGNATURE) 
    {
        PIMAGE_NT_HEADERS pImageHeaders = (PIMAGE_NT_HEADERS)(file + pDosHeader->e_lfanew);
        if(pImageHeaders->Signature == IMAGE_NT_SIGNATURE) 
        {
            IMAGE_OPTIONAL_HEADER optionalHeader = pImageHeaders->OptionalHeader;
            return (optionalHeader.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI);
        }
    }

    return FALSE;
}

IMAGE_SUBSYSTEM_WINDOWS_CUI можно ввести с помощью IMAGE_SUBSYSTEM_WINDOWS_GUI, чтобы определить, является ли это приложение с графическим интерфейсом вместо консоли.

Службы в окнах обычно имеют в качестве родителя 'services.exe', способ определения родительского процесса хорошо описан в CodeProject .

Процесс ASP.NET выполняется под специальным пользователем ASPNET, имя пользователя можно получить из токена доступа .

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