Supponiamo, se ho un file di installazione MSI, posso estrarne il contenuto da un programma C# o C++ senza installarlo?Posso estrarre il contenuto del pacchetto MSI dal programma C++ o C#?
risposta
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();
}
}
}
}
Un file MSI è un COM structured storage. È fondamentalmente un database. È possibile trovare un po 'di documentazione dettagliata su MSDN:
Grazie. Anche se per me è tutto abbastanza travolgente ... Qualche link a un codice C# che può fare l'estrazione? – c00000fd
@ user843732, controlla [questo progetto] (http://code.google.com/p/lessmsi/) – SingerOfTheFall
Vuole solo sapere come estrarre i contenuti. Ci sono API per questo. Non ha bisogno di capire la struttura del database a livello binario. –
- 1. Estrarre il contenuto del bootstrapper di masterizzazione
- 2. Ottenere il nome del prodotto dal file msi in C#
- 3. Come posso stampare il contenuto dello stack nel programma C?
- 4. Come decomprimere il file tar.gz utilizzando il programma C++
- 5. Passare i parametri dal pacchetto pacchetto bootstrapper a msi
- 6. WIX Disinstallazione pacchetto MSI
- 7. Come estrarre AST dal codice Objective-C?
- 8. MSI non viene eseguito da C#
- 9. Chiama LLVM Jit dal programma c
- 10. Produrre video dal programma OpenGL C
- 11. Passaggio di molti dati dal programma Python al programma C
- 12. Letterale "o" nel programma C++?
- 13. Nascondere un programma C# dal task manager?
- 14. Dimensione massima pila C/C++ del programma
- 15. PostgreSQL: annullare la query dal programma C/C++
- 16. Installazione silenziosa di un pacchetto MSI
- 17. Chiamare il metodo python dal callback C++ (o C)
- 18. C# - Programma senza finestra
- 19. Impossibile compilare il programma C++
- 20. L'esecuzione del programma C in Linux Terminal
- 21. Programmazione C. Il programma FizzBuzz
- 22. Come posso compilare il programma Mongodb-c-driver?
- 23. C'è qualche differenza tra il programma di installazione .msi di specflow e il suo pacchetto nuget?
- 24. Estrarre il contenuto da HttpResponseMessage
- 25. Catch stderr e stdout dal programma esterno in C++
- 26. Interpreti Python incorporati indipendenti multipli su più thread del sistema operativo richiamati dal programma C/C++
- 27. Utilizzo del file mat in programma C++
- 28. break termina il programma - C++
- 29. Invio pacchetto UDP in C#
- 30. C# Esecuzione programma pausa
Grazie e scusa per questo ritardo. Sei curioso di sapere se è disponibile da un'app Web ASP.NET? – c00000fd
Non vedo perché no. –
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