如何持久化 DIR 在 SETUP 向导之后






1.29/5 (3投票s)
2007年4月30日
2分钟阅读

18476
如何在设置向导部署之前和之后查找目录路径
引言
在使用 .NET 时... 如何在安装部署前后找到你的支持目录和文件。
假设... 你有一个 .NET WinForm 应用程序。该应用程序使用几个必须在安装过程中安装的支持文件。你正在使用标准的 2005 安装项目。
你是否意识到 IDE 实际上有多么“巧妙-酷”?
好的,这是它的工作方式。
Application.ExecutablePath
根据构建配置返回 "MyProject/bin/debug
" 或 "MyProject/bin/release
"。但是... 一旦使用 MSI 包装并安装后,Application.ExecutablePath
返回 "ProgramFiles/Manuf/MyProject
"。
所以,路径发生了变化!这意味着,你想要在开发期间找到的任何子目录/文件,以及在部署后找到的任何子目录/文件,最终会出现在三个可能的位置!真糟糕...
任何你想要包含在最终 SETUP msi 中的文件(或子目录)都需要将其 "Build Action
" 属性设置为 "Content
",然后在安装过程中,所有子目录和文件都会被复制到安装程序的 [TargetDirectory
]。
但是,**这里是关键**,每个文件都有另一个属性叫做 "Copy To Output Directory
",需要将其设置为 "CopyAlways
"... 这样... 每次你在 IDE 中运行应用程序时,调试器首先会将所有标记为 "CopyAlways
" 的文件复制到相应的 "bin/debug
" 或 "bin/release
" 目录,然后再运行!每次你运行!每次都复制!所以,使用 Application.ExecutablePath
总是有效的!无论是在 IDE 中调试还是在部署后。
使用代码
这是我现在的方式...
我有一个名为 funcs.cs
的静态类文件...
public class funcs
{
private static string mBasePath="";
public funcs()
{
}
public static string BasePath
{
get { return mBasePath; }
set { mBasePath = value; }
}
}
然后... 在我的 Main 初始化中,我设置了静态 BasePath ... 像这样...
[STAThread]
static void Main()
{
fn.BasePath = Application.ExecutablePath.Substring(0, 1 + Application.ExecutablePath.LastIndexOf("\\"));
Application.Run(new frmMain());
}
最后,任何时候我需要构建一个路径名,我只需要使用 BasePath!
PicsHomePath = fn.BasePath + "pics\\";
只要每个文件的 "Copy To Output Directory
" 设置为 "CopyAlways
",那么无论你是在 IDE 中运行还是在安装后运行,你的代码都能找到正确的路径!
关注点
我知道,看起来很简单... 一旦你知道了“技巧”,它就很简单了