我有一个像以下网站项目:
namespace Web
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
lbResult.Text = PathTest.GetBasePath();
}
}
}
方法PathTest.GetBasePath()
在另一个项目中定义,如:
namespace TestProject
{
public class PathTest
{
public static string GetBasePath()
{
return AppDomain.CurrentDomain.BaseDirectory;
}
}
}
为什么在将TestProject程序集编译到...\Web\
文件夹时显示bin
(换句话说,它应该在我的思想中显示...\Web\bin
)。
如果我将方法修改为:
,现在我遇到了麻烦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();
}
}
}
File.config
在TestProject中创建。现在AppDomain.CurrentDomain.BaseDirectory + m_filePath
将重新..\Web\File.config
(实际上文件被复制到..\Web\bin\File.config
),将抛出异常。
您可以说我应该将m_filePath
修改为@"\bin\File.config"
。但是,如果我在建议的控制台应用中使用此方法,则AppDomain.CurrentDomain.BaseDirectory + m_filePath
将返回..\Console\bin\Debug\bin\File.config
(实际上该文件已复制到.\Console\bin\Debug\File.config
),因为剩余{{bin
将引发异常1}}。
换句话说,在网络应用中,AppDomain.CurrentDomain.BaseDirectory
是将文件复制到其中的不同路径(缺少/bin
),但在控制台应用中,它是相同的路径。
任何人都可以帮助我吗?
答案 0 :(得分:33)
每个MSDN,一个App Domain“代表一个应用程序域,它是应用程序执行的隔离环境。”当您考虑ASP.Net应用程序时,应用程序所在的根目录不是bin文件夹。完全可能,在某些情况下是合理的,在bin文件夹中没有文件,并且可能根本没有bin文件夹。由于AppDomain.CurrentDomain引用同一个对象,无论您是从后面的代码调用代码还是从bin文件夹中的dll调用代码,您都将获得该网站的根路径。
当我编写设计为在asp.net和windows应用程序下运行的代码时,通常我创建一个看起来像这样的属性:
public static string GetBasePath()
{
if(System.Web.HttpContext.Current == null) return AppDomain.CurrentDomain.BaseDirectory;
else return Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"bin");
}
另一个(未经测试的)选项是使用:
public static string GetBasePath()
{
return System.Reflection.Assembly.GetExecutingAssembly().Location;
}
答案 1 :(得分:17)
如果您想要一个适用于WinForms和Web Apps的解决方案
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
}
}
}
以上解决方案代码段适用于二进制文件位置
AppDomain.CurrentDomain.BaseDirectory
仍是Web Apps的有效路径,它只是web.config
和Global.asax
并且与Server.MapPath(@"~\");
相同的根文件夹
答案 2 :(得分:15)
如果您使用AppDomain.CurrentDomain.SetupInformation.PrivateBinPath
代替BaseDirectory
,那么您应该获得正确的路径。
答案 3 :(得分:2)
当ASP.net构建您的站点时,它会在其特殊位置输出构建程序集。所以以这种方式获得路径是很奇怪的。
对于asp.net托管的应用程序,您可以使用:
string path = HttpContext.Current.Server.MapPath("~/App_Data/somedata.xml");