2016-04-07 2 views
0

Я пытаюсь установить MSI через код, и я наткнулся на это решение Programatically installing MSI packagesInstaller.InstallProduct бросает исключение

Код:

public static void Install() 
{ 
    try 
    { 
     Type type = Type.GetTypeFromProgID("WindowsInstaller.Installer"); 
     Installer installer = (Installer)Activator.CreateInstance(type); 
     installer.InstallProduct("D:\\Applications\\TortoiseSVN-1.9.3.27038-x64-svn-1.9.3", "ACTION=INSTALL"); 
    } 
    catch(Exception e) 
    { 
     Utilities.showErrorMessageBox(e.Message); 
    } 
} 

Исключение я имеет эту неоднозначность описательное сообщение: {» InstallProduct, PackagePath, PropertyValues ​​"}

Я не знаю, какой смысл это сделать. Я также пробовал различные комбинации PropertyValues, но безрезультатно.

Может кто-нибудь объяснить причину этой ошибки?

EDIT

Используя следующие работы:

System.Diagnostics.Process.Start("D:\\Applications\\TortoiseSVN-1.9.3.27038-x64-svn-1.9.3.msi"); 

Таким образом, этот метод так хорошо, как с помощью программы установки?

+0

Я просто заметил, что первый код не имеет «.msi» в пути к файлу? –

+0

Да, я пропустил это, но все же получаю такое же исключение даже после добавления .msi в пути –

+1

Я никогда не использовал API-интерфейс установщика для запуска установок, никогда не видел в этом преимущества. Я просто запускаю msi, используя Process.Start, как вы, но я рекомендую использовать: msiexec.exe/i yossiz74

ответ

0

IMO Самый простой способ - вызвать прямой API MsiInstallProduct и проверить результат, чтобы узнать, что произошло. Подпись P/Invoke проста, и это конец упомянутого вами сообщения.

Programatically installing MSI packages

Проблема со многими другими попытками я вижу это введение ненужного COM слоя. Таким образом, вы можете выйти из строя на этом COM-уровне, если только среда не является правильной (потоки, квартиры и все, что еще может потребоваться), а сбой обманывает простую ошибку, которую MsiInstallProduct вернет (как в вашем случае).

Близкий осмотр, за исключением (возможно внутреннее исключение) может показать HRESULT или целочисленный результат от MsiInstallProduct, может быть 4 цифры из этого списка:

https://msdn.microsoft.com/en-us/library/aa368542(v=vs.85).aspx

В противном случае, установите политику ведения журнала установщика Windows для создать подробный журнал:

https://support.microsoft.com/en-us/kb/223300

с voicewarmupx в строке регистрации, а затем посмотреть в% TEMP% для файла MSIxx.log. Это предполагает, что ваша среда не вызывает проблемы. Если вы используете код из чего-то вроде локальной системной учетной записи, есть возможности для отказа, если MSI пытается получить доступ к таким элементам, как Desktop для локальной системной учетной записи. Вам понадобится этот журнал, чтобы узнать, что происходит. Если файл MSI не имеет пользовательского интерфейса и требует повышения, он не будет запрашивать возвышение и сработает. Если у него есть внешний файл CAB, возможно, он не может его найти, а затем сбой. Если он запущен из отображаемого расположения диска, он также может выйти из строя. Так что речь идет не только о коде, потому что имеет значение окружающая среда. Есть много точек отказа, которые не имеют никакого отношения к кодированию.

Смежные вопросы