我正在编写一个包含两个项目的应用程序。一个项目是客户端应用程序,它是一个ASP.NET Web应用程序,另一个是在WinForms上运行的管理应用程序(C#3.5)。两个项目都引用包含XML文件的类。问题是,如果没有将XML文件的目录硬编码到该类中,我很难看到如何指向它的运行目录。
Web应用程序在c:\ windows \ system32(asp dll的目录)中查找,winforms应用程序在项目的〜\ bin \ debug目录中查找。
我如何形成XML文件的相对路径,因为它根据引用它的应用程序而有所不同?
答案 0 :(得分:1)
如果您修改引用XML文件的类以接收一个告诉它XML文件所在位置的参数,那么您可以让每个应用程序在其自己的位置作为参数传递给该类。
假设您的类名为YourClass,其加载XML函数称为LoadXML。
对于网络应用,您可以使用:
YourClass.LoadXML(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath);
对于WinForms应用程序,您将使用:
YourClass.LoadXML(System.Windows.Forms.Application.StartupPath);
在YourClass中,您将使用该参数作为绝对路径,并使用System.IO.Path.Combine附加相对路径。
答案 1 :(得分:0)
我知道在使用WinForms时,您可以使用System.IO.Path.GetFullPath(string)从相对路径返回绝对路径。
我对网络并不是很熟悉,但也许这有用吗? http://blog.dotnetclr.com/archive/2009/06/08/506.aspx
希望这有帮助。
答案 2 :(得分:0)
您可以将xml文件添加到其中一个项目,其中构建操作设置为content,并且具有一个脚本,该脚本将xml文件从一个项目(如果更新)复制到另一个项目,并将构建操作设置为content。您可以使用生成后事件使用批处理文件(copyifnewer.bat)复制xml文件:
@echo off
echo Comparing two files: %1 with %2
if not exist %1 goto File1NotFound
if not exist %2 goto File2NotFound
fc %1 %2
if %ERRORLEVEL%==0 GOTO NoCopy
echo Files are not the same. Copying %1 over %2
copy %1 %2 /y & goto END
:NoCopy
echo Files are the same. Did nothing
goto END
:File1NotFound
echo %1 not found.
goto END
:File2NotFound
copy %1 %2 /y
goto END
:END
echo Done.
winforms项目中的post build事件将是:
call "$(ProjectDir)copyifnewer.bat" "$(ProjectDir)\XML\myfile.xml"
"$(ProjectDir)..\WebApp\XML\myfile.xml"
这样,您只需要在winforms项目中编辑一个xml文件,另一个自动更新。然后可以使用dacris提供的路径访问XML文件,并结合相关文件夹XML。
或者,如果Web应用程序与客户端winforms应用程序在同一台计算机上运行,请使用公共数据文件夹:
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)