65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.29/5 (3投票s)

2007年4月30日

2分钟阅读

viewsIcon

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 中运行还是在安装后运行,你的代码都能找到正确的路径!

关注点

我知道,看起来很简单... 一旦你知道了“技巧”,它就很简单了

历史

© . All rights reserved.