我正在制作自定义安装程序。我添加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代码示例。
答案 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}}在所有情况下。
您可以在此处详细了解ResolveSource
:http://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
但是,您必须先解析源,然后才能尝试获取源。那是您的MSI不知道从何处运行。因此,请在您的{{1}中添加以下标准操作。
string sourceDir = session["SourceDir"];
请注意,您应该将其放在InstallExecuteSequence
之前和<ResolveSource After="CostInitialize"/>
之后,否则它将给出错误 ICE27:InstallExecuteSequence表中的ICE27:“ ResolveSource”操作在错误的位置。当前:选择,正确:成本计算。
您的自定义操作应在CostFinalize
元素之后引用。
CostInitialize