如何在目录表中没有名为“INSTALLDIR”,“INSTALLDIRECTORY”的目录时从MSI读取安装目录

时间:2013-02-04 08:54:36

标签: c# wix windows-installer

我想阅读MSI的安装目录。当目录表中的“INSTALLDIR”,“INSTALLDIRECTORY”或“INSTALLLOCATION”指定安装目录时,我能够读取安装目录。但许多msis不包含“INSTALLDIR”左右。然后如何确定特定msi的安装目录是什么。

是否有任何特定的关键字列表可用于指定安装目录,因为有些msi包含INSTALLDIR,有些包含INSTALLDIRECTORY或某些包含INSTALLLOCATION。

我正在使用以下代码snipet来获取安装目录

                DataTable directoryTable;

            directoryTable = this.ReadMsiTableByName(msiFile, "Directory");     // get Directory table of msi specifiec bt msiFile.



            foreach (DataRow row in directoryTable.Rows)
            {
                if (row["Directory"].ToString() == "INSTALLLOCATION" || row["Directory"].ToString() == "INSTALLDIR" || row["Directory"].ToString() == "INSTALLDIRECTORY")
                {
                    installDirectoryPath = row["Directory_Parent"].ToString();
                    break;
                }
            }

            string directory = installDirectoryPath;
            while (directory != "TARGETDIR")
            {
                foreach (DataRow row in directoryTable.Rows)
                {
                    if (row["Directory"].ToString() == directory)
                    {
                        installDirectoryPath = row["Directory_Parent"].ToString() + "//" + installDirectoryPath;

                        directory = row["Directory_Parent"].ToString();
                        break;
                    }
                }
            }

如果INSTALLDIR条目不在目录表中,请告知如何获取MSI的安装目录。我正在用C#编写代码并使用WiX dll。

1 个答案:

答案 0 :(得分:2)

因为“INSTALLDIR”,“INSTALLDIRECTORY”或“INSTALLLOCATION”不是standard Windows Installer properties,所以不能保证它们将存在于每个msi安装中。

TARGETDIR属性指定安装的根目标目录。 TARGETDIR必须是Directory表中一个根的名称。可能只有一个根目标目录。

如果定义了TARGETDIR属性,则目标目录将解析为属性的值。如果未定义TARGETDIR属性,则使用ROOTDRIVE属性来解析路径。

ROOTDRIVE属性指定安装目标目录的默认驱动器。如果未在命令行中设置ROOTDRIVE或将其创作到Property表中,则安装程序会设置此属性。

在MSDN文档中,请参阅

Directory Table

Using the Directory Table

Specifying Directory Structure

Changing the Target Location for a Directory