代码之家  ›  专栏  ›  技术社区  ›  Spencer Ruport

Visual Studio安装项目:获取目标目录

  •  9
  • Spencer Ruport  · 技术社区  · 15 年前

    我一直在搜索谷歌,试图找到合适的方法来确定用户从安装向导中选择的安装路径。

    基本上,我遇到了一个问题,我的服务无法在它自己的目录中创建文件,因为它缺乏适当的权限。我假设解决这一问题的正确方法是确保为服务使用的任何帐户授予对其文件夹的适当文件权限。

    但在我能够处理如何通过.NET设置权限之前,我需要知道安装文件夹。我使用的安装项目具有包含 ServiceInstaller 控制也一样。两者都有 Context 属性,因此我一直在检查在为每个安装程序触发AfterInstall事件时可用的参数。起初我以为我会看到 TargetDir 属性设置,但情况并非如此。但是我看到了 AssemblyPath 设置并指向相应文件夹的可执行文件。

    本质上,我只是想确保这是我应该使用的适当方法:

    private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
    {
        string InstallPath = System.IO.Path.GetDirectoryName(serviceInstaller1.Context.Parameters["AssemblyPath"]);;
    }
    
    7 回复  |  直到 12 年前
        1
  •  12
  •   YWE    14 年前

    我发现Berg提供的解决方案对我有效,除了对CustomActionData属性使用此值:

    /TargetDir="[TARGETDIR]\"
    

    注意反斜杠的加法。看到这个 article on MSDN .

        2
  •  3
  •   LanceSc    15 年前

    您的自定义操作是延迟的自定义操作,只有某些属性可用,有关详细信息,请参阅下页。 http://msdn.microsoft.com/en-us/library/aa370543(VS.85).aspx . 您可以在Visual Studio 2008中将TargetDir属性添加到CustomActionData;但是,我还没有将Visual Studio 2008作为创作工具使用。

    在Visual Studio 2008中进行复杂的安装非常困难,因为它抽象掉了MSI的一些关键功能。我强烈建议你看看Wix。

    即使你不使用wix,你也要下载orca, http://msdn.microsoft.com/en-us/library/aa370557(VS.85).aspx 并使用它来验证您的安装。这将为您节省无数小时的时间。

        3
  •  2
  •   jonsca    12 年前

    在安装过程中,我这样做的事件:

    // locate the installation directory and store it where we can find it during Commit
    stateSaver.Add("TargetDir", Context.Parameters["DP_TargetDir"]);
    

    然后,我可以进入 TargetDir 稍后在 OnCommitted :

    string path = (string)savedState["TargetDir"];
    

    不确定这是否有帮助!我正在努力找出如何可靠地确定安装目录,以便我的服务可以进行一些日志记录。

        4
  •  1
  •   Chief    13 年前

    对于有多重人格的人来说,必须这样做

    /AppID="[APPID]" /Path="[TARGETDIR]\"
    
        5
  •  0
  •   Regina    15 年前

    作为安装项目的替代方案,您可以使用一些安装程序构建服务。我认为 http://installer.codeeffects.com 当用户安装您的服务时,您可以从您的网站加载任何文件并将它们放在安装目录中。希望这有帮助。

        6
  •  0
  •   Berg    14 年前

    要在自定义操作中获取目标目录属性值,可以通过在“自定义操作”视图中选择自定义操作输出并将其设置为:

    /TargetDir="[TARGETDIR]"
    

    作为CustomActionData属性的值。

    然后您应该能够通过以下方式访问它:

    string targetDir = Context.Parameters[ "TargetDir" ];
    
        7
  •  -1
  •   Spencer Ruport    14 年前

    据我所知,这是确定安装目录的唯一方法。当然,如果有人给出不同的答案,我会记下,但在那之前,这是我要采用的方法。