确定应用程序是WinForms还是WebForms

时间:2010-06-02 10:05:18

标签: c# winforms webforms

有没有办法确定在运行时运行的应用程序是WinForms还是Web?

[编辑]

如果我在类库中同时引用System.WebSystem.Windows.Forms,确实存在问题吗?

[摘要] (到目前为止)

到目前为止我学到了什么:

    如果在异步线程中检查,则
  • HttpContext.Currentnull,因此无法在辅助方法中可靠地使用它。 HttpRuntime.Cache并没有真正帮助,因为我根本没有找到缓存的上下文(或者我在这里遗漏了什么?)。
  • 另一方面,System.Reflection.Assembly.GetEntryAssembly()似乎在网络应用中返回null,在WinForms中返回非空。这应该被视为理所当然吗?应该有更多这样的“黑客”,那么使用哪一个?
  • 根据{{​​3}},
  • 在辅助库中引用System.WebSystem.Windows.Forms应该没问题。

7 个答案:

答案 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)

如果Web应用程序正在执行异步处理,则

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。