我有一个包含两个项目的解决方案。一个项目仅用于完成所有数据工作,另一个项目是启动项目,用于处理所有Web数据。
现在我想通过首先获取项目根目录来从TaskManagerHelpers类中获取TasksDataBase.xml。但我得到的只是TaskManager.Web根目录。 (我从TaskManager.Web内的控制器调用TaskManagerHelpers.cs中的方法)
当我在同一个项目的课程中时,如何获取TaskManager.Data根目录?
我尝试过使用theese方法和类似方法。
提前致谢!
答案 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
作为基本路径