如何在解决方案C#中获取另一个项目的绝对路径

And*_*eas 5 .net c# file path asp.net-mvc-4

我有一个包含两个项目的解决方案.一个项目仅用于完成所有数据工作,另一个项目是启动项目,用于处理所有Web内容.

解

现在我想通过首先获取项目根目录来从TaskManagerHelpers类获取TasksDataBase.xml.但我得到的只是TaskManager.Web根目录.(我从TaskManager.Web中的控制器调用TaskManagerHelpers.cs中的方法)

当我在同一个项目中的某个类时,如何获取TaskManager.Data根目录?

我尝试过使用theese方法和类似方法.

  • HttpContext.Current.Request.PhysicalApplicationPath;
  • System.IO.Path.GetFullPath();
  • AppDomain.CurrentDomain.BaseDirectory;

提前致谢!

Dar*_*rov 7

一种可能性是embed the XML file into the assembly类库,然后在Web应用程序中将其作为资源读取.请记住,当您将Web应用程序发布到Web服务器时,将进入该程序包的所有内容都将是此Web应用程序的文件.与此Web应用程序所属的Visual Studio解决方案中可能存在的某些项目没有任何物理关系.

您可以查看GetManifestResourceStream允许您从引用的程序集中读取嵌入式XML 的方法.

这是一个例子:

// you could use any type from the assembly here
var assembly = typeof(TaskManagerHelper).Assembly;
using (var stream = assembly.GetManifestResourceStream("TaskManager.Data.DataBase.TasksDataBase.xml"))
using (var xmlReader = XmlReader.Create(stream))
{
    // ... do something with the XML here
}
Run Code Online (Sandbox Code Playgroud)

请记住,因为文件嵌入到程序集中,您将无法修改它.它是只读的.如果您需要修改它,则另一种方法是将此文件复制到您的Web应用程序.例如,一个好地方是App_Data特殊文件夹.您甚至可以设置一个后期编译步骤,该步骤将在此位置复制XML文件.

然后你可以轻松地引用它:

string xmlFile = HostingEnvironment.MapPath("~/App_Data/TasksDataBase.xml");
using (var xmlReader = XmlReader.Create(xmlFile))
{
    // ... do something with the XML here
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,由于XML文件现在实际上是Web应用程序的一部分并且存在于硬盘驱动器上,因此您也可以对其进行修改.