2011-03-07 79 views
0

我正在编写一个包含两个项目的应用程序。一个项目是客户端应用程序,它是一个ASP.NET Web应用程序,另一个是在WinForms(C#3.5)上运行的管理应用程序。两个项目都引用一个包含XML文件的类。问题在于,在将XML文件的目录硬编码到该类中之后,我很难看到如何指向它的运行目录。WinForm和ASP.NET应用程序的相对路径

Web应用程序在c:\ windows \ system32(asp dll的目录)中查找,winforms应用程序在项目的〜\ bin \ debug目录中查找。

如何构建XML文件的相对路径,因为它根据哪个应用引用它而不同?

回答

1

如果修改类引用XML文件采取的参数告诉它XML文件所在的位置,然后你可以让每个应用程序作为参数在它自己的位置传递给该类。

假设你的类被称为YourClass,并且它的加载XML函数被称为LoadXML。

对于Web应用程序,你可以使用:

YourClass.LoadXML(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath); 

对于WinForms应用程序,你可以使用:

YourClass.LoadXML(System.Windows.Forms.Application.StartupPath); 

里面YourClass,你可以使用该参数为绝对路径,使用System.IO.Path.Combine附加一个相对路径。

0

您可以将xml文件添加到其中一个构建操作设置为内容的项目中,并有一个脚本将xml文件从一个项目(如果更新)复制到另一个项目,并将构建操作设置为内容。您可以使用生成后事件使用批处理文件(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项目将是:

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)