在msi文件中设置自定义属性

时间:2010-06-07 23:55:42

标签: windows-installer

如何动态设置msi文件中的自定义属性?我不想使用msiexec传递自定义属性。我想根据用户登录在msi文件中保存属性的值。

提前致谢。

2 个答案:

答案 0 :(得分:1)

请参阅USERNAME property。设置属性的唯一选项是:在创作时;在命令行(直接或在转换中);并在自定义操作中。但是,您需要的信息可能位于系统设置的属性之一。

答案 1 :(得分:0)

您可以使用以下代码(下载由Ian Schoen Mahr Mariano编写的WindosInstaller类之后

从这里

http://www.codeproject.com/KB/cs/msiinterop/msiinterop.zip

    public static bool ChangeProperty(string MsiPath, string property, string value)
    {
        bool result = true;
        IntPtr view = IntPtr.Zero;
        IntPtr dataBase = IntPtr.Zero;
        MsiError err;

        try
        {
            err = MsiInterop.MsiOpenDatabase(MsiPath, MsiDbPersistMode.Transact, out dataBase);
            if (err == MsiError.Success)
            {
                string sql = "INSERT INTO Property (Property, Value) VALUES ('" + property + "', '" + value + "')";
                err = MsiInterop.MsiDatabaseOpenView(dataBase, sql, out view);

                err = MsiInterop.MsiViewExecute(view, IntPtr.Zero);
                if (err == MsiError.FunctionFailed)
                {
                    string sqlUpdate = @"UPDATE Property SET Value = '" + value + "' WHERE Property = '" + property + "'";
                    err = MsiInterop.MsiDatabaseOpenView(dataBase, sqlUpdate, out view);
                    err = MsiInterop.MsiViewExecute(view, IntPtr.Zero);
                }
            }
            err = MsiInterop.MsiDatabaseCommit(dataBase);
        }
        catch
        {
            result = false;
        }
        finally
        {
            err = MsiInterop.MsiViewClose(view);
            err = MsiInterop.MsiCloseHandle(dataBase);
        }
        return result;
    }