2012-09-19 12 views

risposta

7

In genere è possibile eseguire un Administrative installation per estrarre il contenuto di un MSI.

msiexec /a foo.msi TARGETDIR=C:\EXTRACTHERE /qn 

Se non si vuole andare fuori processo è possibile interoperabilità direttamente con MSI tramite il MsiInstallProduct function.

szPackagePath [in] Una stringa con terminazione null che specifica il percorso della posizione del pacchetto di Windows Installer. Il valore stringa può contenere un URL un percorso di rete, un percorso file (ad esempio file: //packageLocation/package.msi) o un percorso locale (ad esempio D: \ packageLocation \ package.msi).

szCommandLine [in] Una stringa con terminazione null che specifica le impostazioni delle proprietà della riga di comando. Questo dovrebbe essere un elenco del formato Property = Setting Property = Setting. Per ulteriori informazioni, vedere Informazioni sulle proprietà.

Per eseguire un'installazione amministrativa, includere ACTION = ADMIN in szCommandLine. Per ulteriori informazioni, consultare la proprietà ACTION.

Si noti che mentre è possibile dichiarare il P/Invoke autonomamente, esiste una buona libreria di interoperabilità .NET disponibile con Windows Instaler XML denominata Deployment Tools Foundation (DTF). Lo spazio dei nomi Microsoft.Deployment.WindowsInstaller ha un metodo di classe chiamato Installer che espone un metodo statico chiamato InstallProduct. Questo è un incapsulamento diretto di MsiInstallProduct.

L'utilizzo delle librerie DTF ti nasconde dalla bruttezza dell'API Win32 e implementa correttamente IDisposable laddove necessario per garantire che gli handle non gestiti sottostanti vengano rilasciati dove necessario.

Inoltre DTF ha lo spazio dei nomi Microsoft.DeploymentWindowwsInstaller.Package con la classe InstallPackage. Questa classe espone un metodo chiamato ExtractFiles() che estrae i file nella directory di lavoro. Un esempio di codice è simile a:

using Microsoft.Deployment.WindowsInstaller; 
using Microsoft.Deployment.WindowsInstaller.Package; 
namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using(var package = new InstallPackage(@"C:\test.msi", DatabaseOpenMode.ReadOnly)) 
      { 
       package.ExtractFiles(); 
      } 
     } 
    } 
} 
+0

Grazie e scusa per questo ritardo. Sei curioso di sapere se è disponibile da un'app Web ASP.NET? – c00000fd

+0

Non vedo perché no. –

+0

Scusa, se sto chiedendo qualcosa di molto semplice. Quando includo le due linee "uso" ottengo questo: "errore CS0234: Il tipo o il nome dello spazio dei nomi 'Deployment' non esiste nello spazio dei nomi 'Microsoft' (ti manca un riferimento all'assembly?)" – c00000fd

4

Un file MSI è un COM structured storage. È fondamentalmente un database. È possibile trovare un po 'di documentazione dettagliata su MSDN:

  • Here è l'API di database
  • Here si possono trovare alcune informazioni su un composto formato di file binario
  • Here è il documento su Windows Installer
+0

Grazie. Anche se per me è tutto abbastanza travolgente ... Qualche link a un codice C# che può fare l'estrazione? – c00000fd

+1

@ user843732, controlla [questo progetto] (http://code.google.com/p/lessmsi/) – SingerOfTheFall

+2

Vuole solo sapere come estrarre i contenuti. Ci sono API per questo. Non ha bisogno di capire la struttura del database a livello binario. –

Problemi correlati