Как вы заметили, MsiInstallProduct просто возвращает ошибку или успех без дополнительной информации. Installer.InstallProduct ничего не возвращает. DTF ничего не возвращает.
Почему разница? MsiInstallProduct - это старая школа C / C ++, где вы возвращаете коды ошибок. Остальные - это новая школа, где вы вместо этого поднимаете исключения. Затем ваш код перехватывает исключение, чтобы узнать, что возникла проблема.