【问题标题】:How to get absolute path of another project in a solution C#如何在解决方案C#中获取另一个项目的绝对路径
【发布时间】:2013-01-09 22:20:55
【问题描述】:

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

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

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

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

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

提前致谢!

【问题讨论】:

  • 您认为其他解决方案的内容文件在编译时存储在哪里?
  • 很抱歉,我还不太擅长编程。
  • 好的,开发过程中存在的解决方案结构在您编译应用程序后就不存在了。整个数据层变成了一个通常驻留在应用程序文件夹中的 dll 文件。将内容文件放在您想要的位置是您的工作。可以得到数据层组件的路径,但是编译完dll后就没有xml文档的概念了(假设xml文件是内容文件)。
  • 好的,所以如果我想将它用作可读/可写文件,最好放在 atart-up 项目目录中?
  • 是的,一般来说,但这并不意味着您必须在解决方案中移动它。您可以将路径作为变量放在 app.config 或 web.config 中,以便在开发过程中也可以找到它。

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


【解决方案1】:

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

【讨论】:

  • 如果我理解正确,你说如果我想要一个像我这里这样的物理文件,我最好将启动项目放在某个地方,但我可以通过将其作为资源阅读来解决问题?
  • 硬盘上不存在该文件;它将是数据层 dll 文件的一部分
  • 是的,您可以选择:将文件物理复制到例如App_Data 文件夹中,或者将其嵌入到程序集中。
  • 感谢您的回答。我的解决方案是将它移到我的启动项目中:)非常好的解释!
【解决方案2】:

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

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

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

【讨论】:

  • ...对于将路径硬编码到应用程序中而不是将其放入 .config 中的想法存在问题。
  • 将它添加到 Web.config 也可以。关键是不可能以编程方式确定它的位置。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      • 2011-03-21
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多