c# asp.net .net-assembly

c# - ¿Por qué AppDomain.CurrentDomain.BaseDirectory no contiene "bin" en la aplicación asp.net?



assemblies c# (4)

Tengo un proyecto web como:

namespace Web { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { lbResult.Text = PathTest.GetBasePath(); } } }

El método PathTest.GetBasePath() se define en otro proyecto como:

namespace TestProject { public class PathTest { public static string GetBasePath() { return AppDomain.CurrentDomain.BaseDirectory; } } }

Por qué se muestra .../Web/ mientras que el ensamblaje TestProject se compila en la carpeta bin (en otras palabras, debería aparecer .../Web/bin en mi pensamiento).

Ahora tengo un problema si modifico el método en:

namespace TestProject { public class FileReader { private const string m_filePath = @"/File.config"; public static string Read() { FileStream fs = null; fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + m_filePath,FileMode.Open, FileAccess.Read); StreamReader reader = new StreamReader(fs); return reader.ReadToEnd(); } } }

El File.config se crea en TestProject. Ahora AppDomain.CurrentDomain.BaseDirectory + m_filePath volverá a aparecer ../Web/File.config (en realidad, el archivo se copió en ../Web/bin/File.config ), se ../Web/bin/File.config una excepción.

Podría decir que debería modificar m_filePath a @"/bin/File.config" . Sin embargo, si uso este método en una aplicación de consola en su sugerencia, AppDomain.CurrentDomain.BaseDirectory + m_filePath devolverá ../Console/bin/Debug/bin/File.config (en realidad, el archivo se copió en ./Console/bin/Debug/File.config ), se ./Console/bin/Debug/File.config una excepción debido a la bin excedente.

En otras palabras, en la aplicación web, AppDomain.CurrentDomain.BaseDirectory es una ruta diferente donde se copia el archivo (falta de /bin ), pero en la aplicación de la consola es la misma ruta.
¿Alguien puede ayudarme?


Cuando ASP.net construye su sitio, genera ensamblajes de compilación en su lugar especial para ellos. Así que conseguir el camino de esa manera es extraño.

Para las aplicaciones alojadas de asp.net puede usar:

string path = HttpContext.Current.Server.MapPath("~/App_Data/somedata.xml");


En caso de que desee una solución que funcione para WinForms y aplicaciones web

public string ApplicationPath { get { if (String.IsNullOrEmpty(AppDomain.CurrentDomain.RelativeSearchPath)) { return AppDomain.CurrentDomain.BaseDirectory; //exe folder for WinForms, Consoles, Windows Services } else { return AppDomain.CurrentDomain.RelativeSearchPath; //bin folder for Web Apps } } }

El fragmento de código de la solución anterior es para ubicaciones de binarios

AppDomain.CurrentDomain.BaseDirectory sigue siendo una ruta válida para las aplicaciones web, es solo una carpeta raíz donde web.config y Global.asax y es la misma que Server.MapPath(@"~/");


Según MSDN, un dominio de aplicación "Representa un dominio de aplicación, que es un entorno aislado donde se ejecutan las aplicaciones". Cuando piensa en una aplicación ASP.Net, la raíz donde reside la aplicación no es la carpeta bin. Es totalmente posible, y en algunos casos razonable, no tener archivos en su carpeta bin, y posiblemente ninguna carpeta bin. Ya que AppDomain.CurrentDomain se refiere al mismo objeto, independientemente de si llama al código desde el código que está detrás o desde una dll en la carpeta bin, terminará con la ruta raíz del sitio web.

Cuando escribo un código diseñado para ejecutarse tanto en asp.net como en las aplicaciones de Windows, normalmente creo una propiedad que se parece a esto:

public static string GetBasePath() { if(System.Web.HttpContext.Current == null) return AppDomain.CurrentDomain.BaseDirectory; else return Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"bin"); }

Otra opción (no probada) sería usar:

public static string GetBasePath() { return System.Reflection.Assembly.GetExecutingAssembly().Location; }


Si usa AppDomain.CurrentDomain.SetupInformation.PrivateBinPath lugar de BaseDirectory , debe obtener la ruta correcta.