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

时间:2013-01-25 21:16:00

标签: c# .net file asp.net-mvc-4 path

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

solution

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

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

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

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

提前致谢!

4 个答案:

答案 0 :(得分: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
}

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

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

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

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

答案 1 :(得分:4)

仅仅因为这两个项目在开发过程中位于同一个文件夹树中,所以没有说明它们在运行时的位置。这完全有可能在不同的机器上。

“不,”你说。他们肯定会在同一台机器上的同一个c:\ inetpub树中。这可能是真的,但这是你的政策,而非要求。

如果您要建立一个关于它们所在位置的硬策略,那么您可以将其硬编码到您的代码中。

答案 2 :(得分:1)

如果您正在运行一个Web项目,所有引用的dll文件都会被复制到bin目录(除非它们在GAC中)并从那里使用,无论您是否添加对另一个项目的引用,Visual Studio首先编译然后将其复制到Web项目的bin文件夹中。您可以将您的xml文件标记为内容(编译操作)并使用copy always选项将其始终复制到bin目录....问题是它有时会在bin文件夹之外查找此文件但我认为你可以处理这个。

答案 3 :(得分:0)

右键单击XML文件并选择属性,然后将“复制到输出控制器”更改为除“&34;不复制"”之外的其他设置之一。这会将文件放在您的\ bin \文件夹旁边,与其他项目输出一起。然后,您可以使用AppDomain.CurrentDomain.BaseDirectory作为基本路径