8

我有一个包含两个项目的解决方案。一个项目只做所有的数据工作,另一个是启动项目,做所有的网络工作。

解决方案

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

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

我已经尝试过这些方法和类似的方法。

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

提前致谢!

4

4 回答 4

8

一种可能性是使用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 应用程序的一部分并且位于硬盘驱动器上,因此您也可以对其进行修改。

于 2013-01-25T21:19:42.070 回答
4

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

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

如果您要制定关于它们所在位置的硬性政策,那么您可以将其硬编码到您的代码中。

于 2013-01-25T21:30:06.947 回答
1

右键单击 XML 文件并选择属性,然后将 Copy to Output Director 更改为“Do Not Copy”以外的其他设置之一。这会将文件与其他项目输出一起放入您的 \bin\ 文件夹中。然后,您可以将其AppDomain.CurrentDomain.BaseDirectory用作基本路径

于 2013-01-25T21:25:20.807 回答
1

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

于 2013-01-25T21:26:48.170 回答