2010-02-18 47 views
9

我一直在挖掘Google试图找到合适的方式来确定用户从安装向导中选择的安装路径。Visual Studio安装项目:获取目标目录

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

但在我甚至可以解决如何通过.Net设置权限之前,我需要知道安装文件夹。我正在使用一个安装项目,它有一个安装程序类,其中还包含一个ServiceInstaller控件。两者都有Context属性,因此我一直在检查AfterInstall事件触发每个相应安装程序时可用的参数。我想起初我会看到TargetDir属性集,但事实并非如此。但是,我看到AssemblyPath已设置并指向相应文件夹的可执行文件。

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

private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e) 
{ 
    string InstallPath = System.IO.Path.GetDirectoryName(serviceInstaller1.Context.Parameters["AssemblyPath"]);; 
} 

回答

12

我发现,伯格给了我的作品,除了使用该值CustomActionData属性的解决方案:

/TargetDir="[TARGETDIR]\" 

注意添加反斜杠。看到这个article on MSDN

+1

您还必须在反斜杠“\”后添加额外的空格。否则,在安装或卸载时可能会遇到FileNotFoundException异常。见[这里](http://stackoverflow.com/questions/4516256/how-do-i-fix-setup-project-with-custom-action-file-not-found-exception/4522825#4522825)或[这里](http://stackoverflow.com/questions/8491095/error-1001-using-custom-installer-with-visual-studio-2008)。 – 2013-08-11 08:24:20

+0

你在哪里使用这一点文字?你的解释不是很清楚,对不起。作为项目的命令行参数?代码中的某处?现在MSDN的链接也被破坏了。感谢微软! :-) – 2014-05-15 22:54:35

+0

哦,我明白了。我在另一篇文章中找到了答案: “在您的部署项目中,添加一个用于安装和提交的自定义操作。对于安装自定义操作的CustomActionData属性,输入/ Targetdir =”[TARGETDIR] \“” – 2014-05-15 22:56:33

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并使用它来验证您的安装。这将为您节省无数小时。

+0

WiX能够安装Windows服务吗? – 2010-02-19 01:37:38

+0

是的,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 2010-02-19 04:01:12

+0

我必须坚持为这个项目安装一个Visual Studio安装项目,但+1会给我一个可行的替代研究的未来。 :) – 2010-03-26 17:25:43

0

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

-1

据我所知,这是确定安装目录的唯一方法。当然,如果有人遇到不同的答案,我会注意到,但在此之前这是我正在采取的方法。

+1

这不是一个答案。无论您使用哪种解决方案都是答案。 – 2013-03-27 17:12:34

0

为了让您的自定义操作的目标目录的属性值,你可以通过自定义操作视图中选择您的自定义操作的输出,并把类似手动转发:

/TargetDir="[TARGETDIR]" 

为CustomActionData属性值。

然后,您应该能够通过访问它:

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

正如我在我的问题中所说的那样,我检查了这个值,但不幸的是在事件发生时没有设置。 – 2010-06-07 09:57:45

1

对于那些谁拥有多个必须做这样的

/AppID="[APPID]" /Path="[TARGETDIR]\" 
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"]; 

不知道这是否有帮助!我试图找出如何可靠地确定安装目录,以便我的服务可以做一些日志记录。