2010-06-02 26 views
6

有没有一种方法可以确定在运行时运行的应用程序是WinForms还是Web?确定应用程序是WinForms还是WebForms

[编辑]

是否有实际上是一个问题,如果我引用我的类库都System.WebSystem.Windows.Forms

[摘要](到目前为止)

我到目前为止已经了解到:

  • HttpContext.Currentnull如果异步线程检查,所以不能可靠地在助手使用方法。 HttpRuntime.Cache并没有真正的帮助,因为我根本没有在寻找缓存上下文(或者我在这里错过了什么?)。
  • 另一方面,System.Reflection.Assembly.GetEntryAssembly()似乎在网络应用程序中返回null,WinForms中非空。应该认为理所当然?应该有更多像这样的“黑客”,以便使用哪一个?
  • 根据this thread,在助手库中引用System.WebSystem.Windows.Forms应该没问题。

回答

4

检查HttpContext.Current是否为null。如果是这样,它不是一个Web应用程序。

+0

谢谢!您还可以检查我更新的问题以获取更多详细信息吗? – dummy 2010-06-02 10:46:23

+0

正如M. Smith所写的,HttpContext.Current在执行异步时是空的,所以它并不总是有效。 – dummy 2010-06-02 15:26:47

2

HttpContext.Current如果Web应用程序正在进行异步处理,则它们可以为null。从this threadHttpRuntime.Cache可能是一个更好的事情来测试。

1

对于这个问题是有道理的,你必须在你的项目中包含对System.Web和System.Windows的引用。这本身就是(在我看来)有点代码味道。

你很可能会更好收集的调用方法所需要的信息(这应该是牢牢掌握在Web或的WinForms域),并通过这一切metods需要这个信息作为参数。

[编辑]这如下所示做的

一种方式。仍然丑陋,但它意味着只需要设置一个事实,即你在web应用程序中一次。

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... 
     } 
    } 
} 
+0

好,关键是在共享程序集中有共同的逻辑(它可以引用它需要引用的任何东西),所以调用程序集只需要引用共享程序集。 – dummy 2010-06-02 10:55:39

+0

没有冒犯,但你发布的代码是一个学校代码气味的例子,而且更糟糕的方法是添加两个引用。类不应该暴露公有字段以供其他客户端更改。如果你需要传递一些信息给方法,把它作为参数传递(比如'bool TheActualHelpFunction(bool isCurrentAppWeb)'),不要指望你的调用者在调用一个方法之前改变一堆标志。 – dummy 2010-06-02 11:17:36

+0

我同意,我的例子不是更好。我想避免的是,程序集根据运行的环境而改变它的行为。 这对你来说不是问题,但它可能成为下一个人继承代码的问题。他可能不知道行为会根据运行上下文而改变。 读你的其他问题(http://stackoverflow.com/questions/2957042/get-the-file-path-of-the-current-app)使我的意图更清晰。我只能赞扬这个意图。 – LaustN 2010-06-02 12:17:06

1

这样做的另一种方法是查看当前进程的名称。

using System.Diagnostics; 

public class Helper 
{ 
    public static bool IsCurrentAppWeb() 
    { 
    return Process.GetCurrentProcess().ProcessName == "aspnet_wp"; 
    } 
} 

此解决方案适用于XP,要比较的字符串因环境而异。在默认调试模式下运行VS时,您需要再次比较集成测试服务器的名称。

不是最漂亮的解决方案,但它确实允许您省略对web或winforms程序集的引用。

查看http://msdn.microsoft.com/en-us/library/system.diagnostics.process_members(v=VS.100).aspx了解Process类的更多详细信息。

5

在编辑中指定辅助类是在单独的程序集中。如果你想避免引用,你可以控制你的应用程序。配置文件,你可以把一个

<add key="typeOfSystem" value="Forms|Web"/> 
在您的项目

ConfigurationManager.AppSettings["typeOfSystem"] 

使用ConfigurationManager其财产AppSettings一起访问它。不要忘记在项目中添加对System.Configuration的引用。请注意,您将获得托管应用程序的AppSettings。通过这样做,您需要需要在您的父应用程序的app.config中添加一个键,或者输出一些错误或警告(如果未指定)。

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); 
    } 
} 
0

你有一个方便易方式与框架属性来做到这一点:

HostingEnvironment.IsHosted 

参考的System.Web并添加System.Web.Hosting命名空间。

当IsHosted为真时,表示主机是网页。

相关问题