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

9
我一直在Google上查找适当的方法来确定用户从安装向导中选择的安装路径。基本上,我遇到了一个问题,我的服务无法在自己的目录中创建文件,因为它缺乏适当的权限。我假设解决这个问题的正确方法是确保服务使用的任何帐户都在其文件夹上获得适当的文件权限。但在我开始解决如何通过.Net设置权限之前,我需要知道安装文件夹的位置。我正在使用一个安装项目,其中包含一个Installer类,其中包含一个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

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

/TargetDir="[TARGETDIR]\"

注意添加反斜杠。请参阅MSDN上的文章


1
你还需要在反斜杠 "" 后面添加一个额外的空格。否则,在安装或卸载时可能会出现 FileNotFoundException 异常。请参见这里这里 - Masood Khaari
你在哪里使用这段文本?你的解释对我来说不太清楚,抱歉。作为项目的命令行参数?还是在代码中的某个地方?那个链接到MSDN现在已经失效了。谢谢微软! :-) - Dan Csharpster
哦,我现在明白了。我在另一篇帖子中找到了答案:“在您的部署项目中,添加一个安装和提交的自定义操作。对于安装自定义操作的CustomActionData属性,输入/Targetdir="[TARGETDIR]"。” - Dan Csharpster

3

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

在Visual Studio 2008中进行复杂的安装非常困难,因为它抽象了MSI的许多关键功能。我强烈建议您查看WiX。

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


WiX 能否安装 Windows 服务? - Spencer Ruport
是的,WiX能够安装服务。您只需要编写ServiceInstall元素,http://wix.sourceforge.net/manual-wix2/wix_xsd_serviceinstall.htm。WiX和Visual Studio 2008设置项目都只是MSI的前端。如果您决定使用WiX,我建议阅读http://msdn.microsoft.com/en-us/library/aa370566(VS.85).aspx及其所有子条目。它将帮助您了解组件和功能。我最初使用Visual Studio 2003\2005进行安装,但遇到了太多限制。 - LanceSc
我不得不在这个项目中使用Visual Studio安装项目,但感谢提供了一个未来可行的研究替代方案。 :) - Spencer Ruport

2

在安装过程中,我执行了以下操作:

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

后来,我能够在OnCommitted后期访问TargetDir

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

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


1

对于那些有多个的人,必须这样做

/AppID="[APPID]" /Path="[TARGETDIR]\"

0

在您的自定义操作中获取目标目录属性值,您可以手动转发它,方法是选择自定义操作视图中的自定义操作输出,并输入类似以下内容:

/TargetDir="[TARGETDIR]"

将其作为CustomActionData属性的值。

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

string targetDir = Context.Parameters[ "TargetDir" ];

正如我在问题中所说的,我检查了那个值,但不幸的是,在事件触发时它没有被设置。 - Spencer Ruport

0

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


-1
就我的了解而言,这似乎是确定安装目录的唯一方法。当然,如果有人提出不同的答案,我会注意到并考虑采用其他方法。但在此之前,我会采用这种方法。

1
这不是一个答案。无论您使用的解决方案都是答案。 - Stealth Rabbi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接