计算DLL中包含的类所使用的c#应用程序的类型

计算DLL中包含的类所使用的c#应用程序的类型,c#,.net,dll,assemblies,types,C#,.net,Dll,Assemblies,Types,有没有办法知道C语言中正在运行的应用程序的类型 Windows服务 ASP.NET 窗口窗体 控制台 我想对应用程序类型做出反应,但无法找到确定它的方法。尝试检查。对于Windows窗体应用程序(具有WinForms消息循环),它应该为true;对于Windows服务,它应该为false。我不知道ASP.NET会有什么回报 对于控制台应用程序,它们没有消息循环,因此返回false。您可以使用类中的大多数属性来检查它,但我警告您这是一种黑客行为。如果必须的话,我会同意: bool isConsol

有没有办法知道C语言中正在运行的应用程序的类型

Windows服务 ASP.NET 窗口窗体 控制台

我想对应用程序类型做出反应,但无法找到确定它的方法。

尝试检查。对于Windows窗体应用程序(具有WinForms消息循环),它应该为true;对于Windows服务,它应该为false。我不知道ASP.NET会有什么回报

对于控制台应用程序,它们没有消息循环,因此返回false。您可以使用类中的大多数属性来检查它,但我警告您这是一种黑客行为。如果必须的话,我会同意:

bool isConsole = Console.In != StreamReader.Null;

请注意,控制台应用程序仍然可以调用
console.SetIn(StreamReader.Null)
,或者windows应用程序可以调用
console.SetIn(其他
),因此这很容易被欺骗。

ASP.NET,检查HttpContext.Current是否为Null

您应该让客户端代码告诉您的代码上下文是什么,然后从中操作。充其量,你将能够根据外部因素进行猜测

如果你一定要猜,这就是我要找的:

  • 对于ASP.NET,我将查找HttpContext.Current
  • 对于Windows窗体,我查看应用程序类上的静态OpenForms集合中是否包含任何项
  • 对于Windows演示基础,请查看应用程序类上的静态当前属性是否为NULL。
  • 对于服务来说,确实没有办法确定这一点,因为服务不必注册进程句柄、线程句柄等
  • 对于控制台窗口,如果上面没有一个是真的,那么我会假设这是一个控制台
要检查表单、WPF、WCF或控制台应用程序:

if (System.Windows.Forms.Application.OpenForms.Count > 0)
{
    return ApplicationType.WindowsForms;
}

if (System.Windows.Application.Current != null)
{
    return ApplicationType.Wpf;
}

if (System.ServiceModel.OperationContext.Current != null)
{
    return ApplicationType.Wcf;
}

try
{
    int windowHeight = Console.WindowHeight; // an exception could occur
    return ApplicationType.Console;
}
catch (IOException)
{
}

return ApplicationType.Unknown;

重新检测服务时,一种启发式方法可能是查看是否在AppDomain中加载System.ServiceProcess.dll。很少有非服务进程会加载此程序集。我承认,这不是100%可靠;特别是,它不会检测通过COM或CLR宿主API加载DLL的非托管服务。