如何使用wix的Custom Action的相对路径?

时间:2013-04-03 09:22:59

标签: c# wix windows-installer installer

我正在制作自定义安装程序。我添加Utility.CA.dll以执行自定义操作的位置。在这种情况下,我想访问相对于setup.msi文件路径的本地文件。自定义操作方法可以使用直接路径e:\utility\myfile.txt,但我找不到路径'.. \ utility \ myfile.txt'。经过一些实验后,我得到Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)显示C:\Users\current_username\AppData\Local\Temp\MSIF384.tmp-文件夹。

我该怎么办?需要wix代码示例。

4 个答案:

答案 0 :(得分:2)

首先,我要提一下,引用相对于.MSI源的文件非常具有挑战性,因为稍后(修复,修补,卸载).MSI文件将从安装程序缓存和松散文件中执行(像myfile.txt)将无法使用。您需要非常仔细地编写自定义操作以处理这一事实。

您要找的是标识为Directory的{​​{1}}。您可以通过调用:

获取SourceDir的值
SourceDir

注意:我假设您正在使用DTF,其中 string sourceDir = session["SourceDir"]; 对象已提供给您的自定义操作。

现在,复杂性是session属性仅在Windows Installer完成SourceDir时设置。在初始安装时,双击.MSI文件的源将被解析(因为它是初始安装并且需要文件)。后续安装可能不需要源(例如,卸载不需要您将CD放回驱动器中才能成功)。因此,您必须在.MSI安装序列中调用ResolveSource操作(这将提示用户再次提供原始.MSI文件)或编写自定义操作代码,使其不需要{{ 1}}在所有情况下。

您可以在此处详细了解ResolveSourcehttp://robmensching.com/blog/posts/2010/1/26/stackoverflow-what-does-namesourcedir-refer-to

答案 1 :(得分:1)

如果您需要获取msi文件所在文件夹的路径,可以使用此代码段来检索它:

Path.GetDirectoryName(session["OriginalDatabase"])

OriginalDatabase属性可以在InstallUISequence和InstallExecuteSequence中使用。

要访问相对于您的msi的文件,您将使用

Path.Combine(Path.GetDirectoryName(session["OriginalDatabase"]), "myfile.txt")

答案 2 :(得分:0)

这对我有用;在Product.wxs中:

<Binary 
    Id="WixMyCustomActions"         
    SourceFile="..\WixMyCustomActions\bin\WixMyCustomActions.CA.dll" />

<CustomAction 
    Id="MyMethod" 
    BinaryKey="WixMyCustomActions" 
    DllEntry="MyMethod" 
    Execute="immediate" 
    Return="check" />

WixMyCustomActions.CA.dll是与Wix项目在同一解决方案中的C#类库。在WixMyCustomActions.CA.dll项目属性,Build Events中,我有一个post build事件,用于将WixMyCustomActions.CA.dll和WixMyCustomActions.CA.pdb从bin \ Debug或bin \ Release复制到bin:

copy "$(TargetDir)*.dll" "$(ProjectDir)bin" /Y
copy "$(TargetDir)*.pdb" "$(ProjectDir)bin" /Y

通过复制dll,我的Product.wxs将引用最后构建的任何配置(调试或发布)。

编辑:要获取相对于您的CA dll的文件,请使用此文件查找CA程序集的目录:

using System.IO;
using System.Reflection;

// etc

string assemblyDirectory = 
    Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

您现在可以找到与此目录相关的文件。

答案 3 :(得分:0)

有一个可以从MSI读取的属性-gf

您可以通过SourceDir

在c#代码中引用此属性

但是,您必须先解析源,然后才能尝试获取源。那是您的MSI不知道从何处运行。因此,请在您的{{1}中添加以下标准操作

string sourceDir = session["SourceDir"];

请注意,您应该将其放在InstallExecuteSequence之前和<ResolveSource After="CostInitialize"/>之后,否则它将给出错误 ICE27:InstallExecuteSequence表中的ICE27:“ ResolveSource”操作在错误的位置。当前:选择,正确:成本计算

您的自定义操作应在CostFinalize元素之后引用。

CostInitialize