Since the Windows Installer Object Model does not work properly when used with .NET, I've found that the easiest way to control the installation, etc. of MSIs is to use the API provided in msi.dll.
Code:
Const ERROR_SUCCESS = 0
Declare Function MsiInstallProduct Lib "msi.dll" Alias "MsiInstallProductA"
(ByVal szPackagePath As String, ByVal szCommandLine As String) As Long
Sub InstallMSI(ByVal remove As Boolean, ByVal MSIFile As String)
Select Case remove
Case True
If MsiInstallProduct("MSIFileName", "REMOVE=ALL") =
ERROR_SUCCESS Then MsgBox("OK")
Case False
If MsiInstallProduct("MSIFileName", "property1=value1
property2=value2") = ERROR_SUCCESS Then MsgBox("OK")
End Select
End Sub
This was first published in April 2003