有没有办法确定在运行时运行的应用程序是WinForms还是Web?
[编辑]
如果我在类库中同时引用System.Web
和System.Windows.Forms
,确实存在问题吗?
[摘要] (到目前为止)
到目前为止我学到了什么:
HttpContext.Current
为null
,因此无法在辅助方法中可靠地使用它。 HttpRuntime.Cache
并没有真正帮助,因为我根本没有找到缓存的上下文(或者我在这里遗漏了什么?)。System.Reflection.Assembly.GetEntryAssembly()
似乎在网络应用中返回null
,在WinForms中返回非空。这应该被视为理所当然吗?应该有更多这样的“黑客”,那么使用哪一个?System.Web
和System.Windows.Forms
应该没问题。答案 0 :(得分:5)
在编辑中指定您的帮助程序类处于单独的程序集中。如果你想避免引用并且你可以控制你的app.config文件,你可以放一个
<add key="typeOfSystem" value="Forms|Web"/>
在您的项目中并使用
访问它ConfigurationManager.AppSettings["typeOfSystem"]
使用ConfigurationManager及其属性AppSettings。不要忘记在项目中添加对System.Configuration
的引用。请注意,您将获得托管应用程序的AppSettings。通过执行此操作,您需要在父应用程序的app.config中添加密钥,或者如果未指定,则输出一些错误或警告。
答案 1 :(得分:4)
检查HttpContext.Current
是否为null
。如果是,则不是webapp。
答案 2 :(得分:2)
HttpContext.Current
可以为null。从this thread HttpRuntime.Cache
开始测试可能会更好。
答案 3 :(得分:1)
要使这个问题有意义,您必须在项目中包含对System.Web和System.Windows的引用。这本身就是(在我看来)有点代码味道。
你最好在调用方法中收集所需的信息(它应该牢固地存在于Web或WinForms域中),并将其传递给任何需要此信息作为参数的方法。
[编辑]
执行此操作的一种方法如下所示。仍然很难看,但这意味着只需设置一次你在webApp中的事实。
public class Helper
{
public static bool IsCurrentAppWeb; //defaults to false
public bool TheActualHelpFullFunction()
{
if(Helper.IsCurrentAppWeb)
{
//do web specific things
}
else
{
//do things the non-web way.
//note that this does not tell you
//if you are currently running a WinForm or service or...
}
}
}
答案 4 :(得分:1)
另一种方法是查看当前进程名称。
using System.Diagnostics;
public class Helper
{
public static bool IsCurrentAppWeb()
{
return Process.GetCurrentProcess().ProcessName == "aspnet_wp";
}
}
此解决方案适用于XP,要比较的字符串因环境而异。在默认调试模式下运行VS时,您需要再次比较集成测试服务器的名称。
不是最漂亮的解决方案,但它确实允许您省略对web或winforms程序集的引用。
有关Process类的更多详细信息,请查看http://msdn.microsoft.com/en-us/library/system.diagnostics.process_members(v=VS.100).aspx。
答案 5 :(得分:1)
AppDomain保存相关配置文件的信息。由于Web应用程序的配置文件名为“web.config”,而其他所有应用程序都有“{app} .exe.config”,因此这决定了应用程序的类型。
/// <summary> /// Extensions for the AppDomain class /// </summary> public static partial class AppDomainExtensions { /// <summary> /// Determines whether the specified app domain is a web app. /// </summary> /// <param name="appDomain">The app domain.</param> /// <returns> /// <c>true</c> if the specified app domain is a web app; otherwise, /// <c>false</c>. /// </returns> public static bool IsWebApp(this AppDomain appDomain) { var configFile = (string)appDomain.GetData("APP_CONFIG_FILE"); if (string.IsNullOrEmpty(configFile)) return false; return ( Path.GetFileNameWithoutExtension(configFile) ?? string.Empty ).Equals( "WEB", StringComparison.OrdinalIgnoreCase); } }
答案 6 :(得分:0)
你有一个方便的方法来使用框架属性:
HostingEnvironment.IsHosted
参考System.Web并添加System.Web.Hosting命名空间。
当IsHosted为true时,表示主机为web。