如何检测.Net应用程序类型?

时间:2009-05-18 16:36:22

标签: .net asp.net winforms console

我有一个库需要以不同方式响应异常,具体取决于它是在控制台应用程序,WinForms,AspNet还是Windows服务中运行。我已经尝试过查看System.Windows.Forms和System.Web命名空间中的各种属性,但是我找不到一种可靠的方法来检测哪种应用程序正在托管我的库。有没有人来过这里?有没有人有可靠的解决方案?

5 个答案:

答案 0 :(得分:5)

如果我理解你正在寻找什么,你有一个单独的库可以进行错误处理,但是你想让库知道源是web,console,winforms等吗?

您可以使用库中的属性(例如枚举)来跟踪消费应用程序类型的内容。例如......

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

编辑
来自Samir的评论......
此外,您可以随时为每种类型的应用程序创建一个类,在您的错误记录器库中实现相同的接口。

例如,在Web应用程序中,您将使用:

WebErrorLogger error = new WebErrorLogger();

答案 1 :(得分:3)

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

答案 2 :(得分:3)

在走这条路之前我会问你的设计,但我认为这是一个有趣的挑战,想看看我是否能找到它。

ASP.Net:检查HttpContext.Current不为null。您还可以查看System.Web.Hosting.ApplicationManager.GetApplicationManager(),但我不确定这将如何在Asp.net之外运行

Window Forms:您可以尝试使用System.Windows.Forms.Application.OpenForms,这将返回任何打开的表单。正在假设Windows窗体应用程序永远不会有任何形式。控制台应用程序也可以启动获胜表单。

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

答案 3 :(得分:2)

这感觉就像你想要更多地看一下设计,虽然是我自发的。类库不需要知道关于它的调用者的事情。

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

根据你的评论,我建议寻找为错误处理程序定义一个接口,然后创建该接口所需的实现数量(一个用于WinForms,一个用于控制台等等),并具有客户端应用程序创建并将相应的实现注入库中。这样,您就可以从库中解除知识需求,并将责任转移到客户端应用程序。这些实现仍然可以驻留在您的类库中,但是决定使用哪个将由客户端应用程序进行。

答案 4 :(得分:1)

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获得。