Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2008 Visual Studio安装项目:获取目标目录_Visual Studio 2008_Windows Services_Installation - Fatal编程技术网

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

Visual studio 2008 Visual Studio安装项目:获取目标目录,visual-studio-2008,windows-services,installation,Visual Studio 2008,Windows Services,Installation,我一直在谷歌搜索,试图找到合适的方法来确定用户从安装向导中选择的安装路径 基本上,我遇到了一个问题,我的服务无法在自己的目录中创建文件,因为它缺乏适当的权限。我假设解决这个问题的正确方法是确保服务使用的任何帐户都在其文件夹上获得了适当的文件权限 但在我解决如何通过.Net设置权限之前,我需要知道安装文件夹。我正在使用一个安装项目,它有一个Installer类,其中还包含一个ServiceInstaller控件。两者都有Context属性,因此我一直在检查在为每个安装程序触发AfterInstal

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

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

但在我解决如何通过.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"]);;
}

您的自定义操作是延迟的自定义操作,并且只有某些属性可用,有关详细信息,请参阅下一页。您可以在VisualStudio2008中将TARGETDIR属性添加到CustomActionData中;但是,我还没有使用VisualStudio2008作为创作工具

在VisualStudio2008中进行复杂的安装非常困难,因为它抽象了MSI的一些关键特性。我强烈建议大家看看WiX


即使你不使用WiX,你也会想下载Orca,并用它来验证你的安装。这将为您节省无数个小时。

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

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

要在自定义操作中获取目标目录属性值,可以通过在自定义操作视图中选择自定义操作输出并放置以下内容手动转发:

/TargetDir="[TARGETDIR]"
作为CustomActionData属性的值

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

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

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

/TargetDir="[TARGETDIR]\"

注意添加了反斜杠。看看这个。

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

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

在安装期间,我执行了以下操作:

// locate the installation directory and store it where we can find it during Commit
stateSaver.Add("TargetDir", Context.Parameters["DP_TargetDir"]);
然后,我可以在以后提交的
过程中访问
TargetDir

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

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

WiX能够安装Windows服务吗?是的,WiX能够安装服务。您只需要编写ServiceInstall元素。WiX和VisualStudio2008安装项目都只是MSI的前端。如果你决定使用WiX,我建议你阅读,以及所有的子条目。它将帮助您了解组件和功能。我最初开始使用Visual Studio 2003\2005进行安装,但遇到了太多的限制。我必须坚持使用Visual Studio安装项目来完成此项目,但+1为我提供了一个可行的替代方案,以替代未来的研究工作。:)正如我在问题中所说,我检查了该值,但不幸的是,它没有在事件触发时设置。这不是答案。无论您使用哪种解决方案都是答案。您还必须在反斜杠“\”后添加额外的空格。否则,在安装或卸载时可能会出现FileNotFoundException异常。请参阅或。您在哪里使用这段文字?对不起,你的解释我不太清楚。作为项目的命令行参数?代码中的某个地方?到MSDN的链接现在也断了。谢谢微软!:-)哦,我现在明白了。我在另一篇帖子中找到了答案:“在部署项目中,为安装和提交添加自定义操作。对于安装自定义操作的CustomActionData属性,请输入/Targetdir=“[Targetdir]””