我需要将 MSI 中的文件提取到一个文件夹中,但是更改文件的目录结构,所有这些都来自 C# 应用程序(即:不是通过管理员安装或任何其他 MSI 安装)。从概念上讲,我想将 MSI 的嵌入式 cab 解压缩到我选择的文件夹中。要进行提取,我使用的是 WiX 3.6 DTF 库,但无法确定如何更改文件夹结构。
因此,例如,如果我运行 MSI 安装程序,“Component1”的目标文件夹将为c:\Program Files(x86)\Company Name\Demo Product Installer\Component1\
,但在我的提取器应用程序运行时,我想将其更改为c:\SomeOtherPlace\Demo Product Installer\Component1\
,最好通过更改APPLICATIONFOLDER
目录路径(见下文) .
对于 MSI,我定义了这样的目录结构:
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="APPLICATIONFOLDER" Name="Company Name">
<Directory Id="ProductFolder" Name="Demo Product Installer">
<Directory Id="Cmp1Folder" Name="Component1" />
<Directory Id="Cmp2Folder" Name="Component2" />
</Directory>
</Directory>
</Directory>
</Directory>
</Fragment>
然后,在需要提取文件的代码中,我这样做了:
var msiFilePath = "myInstallerFile.msi";
var targetFolder = @"c:\SomeOtherPlace\";
using (var msiPackage = new InstallPackage(msiFilePath, DatabaseOpenMode.ReadOnly))
{
msiPackage.WorkingDirectory = targetFolder;
var dirMapping = msiPackage.Directories;
if (dirMapping.ContainsKey("APPLICATIONFOLDER"))
{
//This doesn't work, but represents what I hope to do:
var oldInstallPath = dirMapping["APPLICATIONFOLDER"];
oldInstallPath.TargetPath = targetFolder;
}
msiPackage.UpdateDirectories();
msiPackage.ExtractFiles();
msiPackage.Close();
}
有没有办法在运行时使用 DTF 对象修改这样的文件夹结构?我知道我可以在事后移动文件,但如果我能这样做,它会更干净。