代码之家  ›  专栏  ›  技术社区  ›  open-collar

如何检测。网络应用程序类型?

  •  4
  • open-collar  · 技术社区  · 17 年前

    我有一个库,它需要以不同的方式响应异常,具体取决于它是在Console应用程序、WinForms、AspNet还是Windows服务中运行。我尝试了查看系统中的各种属性。窗户。形式和系统。Web命名空间,但我找不到一种可靠的方法来准确检测哪种应用程序托管我的库。以前有人来过这里吗?有人有可靠的解决方案吗?

    5 回复  |  直到 17 年前
        1
  •  5
  •   RSolberg    17 年前

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

    编辑
    来自萨米尔的评论。..
    此外,您始终可以为每种类型的应用程序设置一个类,在错误记录器库中实现相同的接口。

    WebErrorLogger error = new WebErrorLogger();
    
        2
  •  3
  •   Steve Willcock    17 年前

    服务人员:对此我不确定,但我想知道您是否可以查看流程的名称。还必须有一个windows API,因为任务管理器显示进程何时是服务(至少在Vista上是这样)

        3
  •  3
  •   Fredrik Mörk    17 年前

    这听起来像是最好通过配置来处理的事情。也许通过IOC注入类似IExceptionHandler接口的东西。

        4
  •  3
  •   JoshBerke    17 年前

    根据异常处理运行的上下文,您想在异常处理行为中更改什么?

        5
  •  1
  •   arul    17 年前
    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 以检测它是否是GUI应用程序而不是控制台。

    windows中的服务通常具有“ services.exe CodeProject .

    ASP。NET进程在名为ASPNET的特殊用户下运行,用户名可以从 an access token .

    推荐文章