2010-06-02 9 views
6

¿Hay alguna forma de determinar si la aplicación en ejecución es WinForms o Web en tiempo de ejecución?Determine si la aplicación es WinForms o WebForms

[Editar]

¿Existe en realidad un problema si me refiero tanto System.Web y System.Windows.Forms en mi biblioteca de clases?

[Resumen] (hasta ahora)

Lo que he aprendido hasta ahora:

  • HttpContext.Current es null si se activa en un hilo asíncrono, por lo que no puede fiable utilizar en un ayudante método. HttpRuntime.Cache realmente no ayuda, ya que no estoy buscando el contexto en caché en absoluto (¿o me falta algo aquí?).
  • por el contrario, System.Reflection.Assembly.GetEntryAssembly() parece devolver null en aplicaciones web, y no nulo en WinForms. ¿Debería darse por sentado? Debería haber más "hacks" como este, ¿cuál usar?
  • haciendo referencia a ambos System.Web y System.Windows.Forms en una biblioteca auxiliar debe estar bien, de acuerdo con this thread.

Respuesta

4

Compruebe si HttpContext.Current es null. Si es así, no es una aplicación web.

+0

¡Gracias! ¿Podría consultar también mi pregunta actualizada para obtener más detalles? – dummy

+0

Como M. Smith ha escrito a continuación, HttpContext.Current es nulo cuando se realizan operaciones asíncronas, por lo que no siempre funciona. – dummy

2

HttpContext.Current puede ser nulo en una aplicación web si está realizando un proceso asíncrono. De this threadHttpRuntime.Cache podría ser una mejor cosa para probar.

1

Para que esta pregunta tenga sentido, debería haber incluido referencias a System.Web y System.Windows en su proyecto. Esto en sí mismo es (en mi opinión) un poco olor a código.

Probablemente sea mejor que recopile la información necesaria en el método de llamada (que debe estar firmemente en el dominio Web o WinForms) y pasar esto a los métodos que necesiten esta información como argumento.

[editar]

Una forma de hacer esto se muestra a continuación. Sigue siendo feo, pero solo significa tener que establecer el hecho de que estás en una aplicación web una vez.

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

Bueno, el punto es tener una lógica común en un ensamblado compartido (que haría referencia a lo que necesite hacer referencia), por lo que los ensamblajes de llamadas solo necesitarán referenciar ese ensamblado compartido. – dummy

+0

Sin ofender, pero el código que ha publicado es un ejemplo de olor a código en la escuela, y una forma mucho peor de hacerlo que agregar dos referencias. Las clases nunca deben exponer los campos públicos para que cambien otros clientes. Si necesita pasar alguna información al método, páselo como parámetro (como 'bool TheActualHelpFunction (bool isCurrentAppWeb)'), no espere que los llamantes cambien un grupo de indicadores antes de llamar a un método. – dummy

+0

Estoy de acuerdo, mi ejemplo no es mejor. Lo que me gustaría evitar es hacer que un ensamblaje cambie su comportamiento según el entorno en el que se está ejecutando. Esto no sería un problema para usted, pero podría convertirse en un problema para la próxima persona que herede el código. Es posible que no sepa que el comportamiento cambia según el contexto en el que se ejecuta. Al leer su otra pregunta (http://stackoverflow.com/questions/2957042/get-the-file-path-of-the-current-app) la intención es mucho más clara para mí. Solo puedo aplaudir la intención. – LaustN

1

Otra forma de hacerlo es mirar el nombre del proceso actual.

using System.Diagnostics; 

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

Esta solución funciona para XP, la cadena para comparar varía según el entorno. Al ejecutar VS en el modo de depuración predeterminado, deberá comparar el nombre del servidor de prueba integrado.

No es la solución más bonita, pero le permite omitir referencias a ensambles web o winforms.

Eche un vistazo a http://msdn.microsoft.com/en-us/library/system.diagnostics.process_members(v=VS.100).aspx para obtener más detalles sobre la clase de proceso.

5

En su edición usted especifica que su clase de ayuda está en un conjunto separado. Si desea evitar referencias y tiene control sobre su aplicación.ficheros de configuración que podrían poner

<add key="typeOfSystem" value="Forms|Web"/> 

en sus proyectos y acceder a ella con

ConfigurationManager.AppSettings["typeOfSystem"] 

usando ConfigurationManager junto con su propiedad AppSettings. No olvide agregar una referencia al System.Configuration en su proyecto. Tenga en cuenta que obtiene AppSettings de la aplicación de alojamiento. Al hacer esto, usted necesita para agregar una clave en el app.config de su aplicación principal, o generar algún error o advertencia si no se especifica tal vez.

1

AppDomain contiene información del archivo de configuración asociado. Como las aplicaciones web tienen su archivo de configuración denominado "web.config" y todas las demás tienen "{app} .exe.config", esto determina el tipo de aplicación.

/// <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

usted tiene una manera conveniente de hacerlo con propiedad marco:

HostingEnvironment.IsHosted 

Referencia System.Web y añadir espacio de nombres System.Web.Hosting.

Cuando IsHosted es verdadero, significa que el host es web.

Cuestiones relacionadas