我一直在挖掘Google,试图找到合适的方法来确定用户从安装向导中选择的安装路径。
基本上我遇到的问题是我的服务无法在其自己的目录中创建文件,因为它缺少适当的权限。我假设解决此问题的正确方法是确保服务所使用的任何帐户都在其文件夹上获得适当的文件权限。
但在我甚至可以解决如何通过.Net设置权限之前,我需要知道安装文件夹。我正在使用一个安装项目,它有一个包含ServiceInstaller
控件的Installer类。两者都具有Context
属性,所以我一直在检查AfterInstall事件为每个相应的安装程序触发时可用的参数。我一开始以为我会看到TargetDir
属性集,但事实并非如此。然而,我看到AssemblyPath
设置并指向相应文件夹的可执行文件。
基本上我只是想确保这是我应该使用的合适方法:
private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
{
string InstallPath = System.IO.Path.GetDirectoryName(serviceInstaller1.Context.Parameters["AssemblyPath"]);;
}
答案 0 :(得分:12)
我发现Berg给出的解决方案对我有用,除了将此值用于CustomActionData属性:
/TargetDir="[TARGETDIR]\"
请注意添加反斜杠。请参阅此article on MSDN。
答案 1 :(得分: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并使用它来验证您的安装。这将为你节省无数个小时。
答案 2 :(得分:2)
在安装过程中,事件我这样做了:
// 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"];
不确定这是否有帮助!我正在试图弄清楚如何可靠地确定安装目录,以便我的服务可以进行一些日志记录。
答案 3 :(得分:1)
对于那些有多个人必须这样做的人
/AppID="[APPID]" /Path="[TARGETDIR]\"
答案 4 :(得分:0)
作为安装项目的替代方案,您可以使用一些安装程序构建服务。我认为,使用http://installer.codeeffects.com,您可以从网站加载任何文件,并在用户安装服务时将它们放在安装目录中。希望这会有所帮助。
答案 5 :(得分:0)
要在自定义操作中获取目标目录属性值,您可以通过在自定义操作视图中选择自定义操作输出并执行以下操作来手动转发它:
/TargetDir="[TARGETDIR]"
作为CustomActionData属性的值。
然后您应该可以通过以下方式访问它:
string targetDir = Context.Parameters[ "TargetDir" ];
答案 6 :(得分:-1)
据我所知,这是确定安装目录的唯一方法。当然,如果有人提出不同的答案,我会注意到,但在此之前,这就是我正在采取的方法。