从类库中,我需要在运行时确定我是在ASP.NET应用程序还是WinForms / console应用程序中运行。关于此主题已有several other questions asked,但所有这些解决方案都需要添加对System.Web的引用。如果可能的话,在运行我的控制台和WinForms应用程序时,我不想将System.Web程序集加载到内存中,只需要为数千行代码中的一行代码。
答案 0 :(得分:8)
使用System.Diagnostics.Process.GetCurrentProcess().ProcessName
如果您正在运行ASP.NET,那么程序集will be named thusly:
如果您运行的是IIS 6.0或IIS 7.0,则名称为w3wp.exe。
如果您运行的是早期版本的IIS,则名称为aspnet_wp.exe。
另一个想法:如何使用AppDomain.CurrentDomain.GetAssemblies()API测试进程/应用程序域是否存在System.Web.dll?
答案 1 :(得分:5)
您链接的其中一个问题包含answer建议Environment.UserInteractive。
您还可以尝试分析代码的StackTrace,以确定调用的位置。
答案 2 :(得分:2)
你可以尝试一些基于Assembly.GetEntryAssembly()的东西。如下面的注释所述,如果当前代码在Web应用程序或服务的上下文中运行,则GetEntryAssembly()将返回NULL。在独立应用程序(如WinForm或控制台应用程序)的情况下,它将返回一些非空引用。
由于评论而被编辑以更改原始答案。
答案 3 :(得分:2)
另一个黑客:
如果您没有在独立的exe内运行,则System.Configuration.ConfigurationManager.OpenExeConfiguration会抛出带有特定消息的ArgumentException。您可以使用这个事实来检查:
bool notAnExe = false ;
try
{
// see if we're running in an exe.
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
}
catch(ArgumentException aex)
{
if(aex.Message == "exePath must be specified when not running inside a stand alone exe.")
{
notAnExe = true ;
}
}
答案 4 :(得分:1)
您可以检查System.Diagnostics.Process.GetCurrentProcess()。ProcessName;。如果它以aspnet开头,那就是asp.net。否则,桌面。
答案 5 :(得分:0)
它可能看起来像一个黑客。它使用DomainManager类型的当前AppDomain。另请查看AppDomainManager
public static class AspContext
{
public static bool IsAspNet()
{
var appDomainManager = AppDomain.CurrentDomain.DomainManager;
return appDomainManager != null && appDomainManager.GetType().Name.Contains("AspNetAppDomainManager");
}
}
或者您可以使用this other answer on SO
答案 6 :(得分:0)
这是一个老线程,但这里是一个新的答案,不是黑客。
private bool IsExe()
{
var domainManager = AppDomain.CurrentDomain.DomainManager;
if (domainManager == null) return false;
var entryAssembly = domainManager.EntryAssembly;
if (entryAssembly == null) return false;
return entryAssembly.Location.EndsWith(".exe", StringComparison.OrdinalIgnoreCase);
}
这不会告诉你应用程序是否是ASP.Net,但是它会告诉你这是一个控制台还是WinForms应用程序,这是与大多数其他答案相反的方法。例如,如果这是一个OWIN应用程序,IsExe
方法将返回false,即使这不是ASP.Net应用程序。
答案 7 :(得分:0)
var fullNameTextField = self.infoRegisterRefferenceVC.fullName.text