如何动态设置msi文件中的自定义属性?我不想使用msiexec传递自定义属性。我想根据用户登录在msi文件中保存属性的值。
提前致谢。
答案 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;
}