Je crée un programme d'installation dans VS2008 pour une application C# qui utilise SQLite, ce qui nécessite différentes versions de l'assemblage pour les environnements x86 et x64. Quel est le meilleur moyen pour que le programme d'installation installe automatiquement l'assemblage correct en fonction de l'environnement?Installation d'une version différente de l'assemblage en fonction de la plateforme?
1
A
Répondre
0
Finalement, j'ai fini par devoir bidouiller un peu. Le projet d'installation inclut désormais un fichier zip avec les versions x86 et x64 de SQLite. Mes hooks de classe de programme d'installation de projet remplacent la méthode OnBeforeInstall, puis décompresse le fichier zip dans un dossier temporaire, vérifie l'environnement et copie la version correcte dans le dossier d'installation de l'application.
Le code est quelque chose le long de ces lignes, bien que la journalisation et la gestion des erreurs aient été supprimées de cet exemple pour garder le code pertinent.
protected override void OnBeforeInstall(IDictionary savedState)
{
base.OnBeforeInstall(savedState);
UnzipSQLite();
}
private void UnzipSQLite()
{
// Installation directory
string targetDir = Context.Parameters["TargetDir"];
// SQLite.zip is saved in the temp folder by the installer
// This is setup via the GUI in Visual Studio
string zipFile = Path.Combine(TempFolder, "SQLite.zip");
// Folder where it will be unzipped to
string tempDir = Path.Combine(TempFolder, Guid.NewGuid().ToString());
// Unzip it. Requires SharpZipLib
FastZip fz = new FastZip();
fz.ExtractZip(zipFile, tempDir, FastZip.Overwrite.Always, null, string.Empty, string.Empty, true);
// Check if OS is x86 or x64
// http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/24792cdc-2d8e-454b-9c68-31a19892ca53
string subDir = (OSChecker.Is64BitOperatingSystem) ? "x64" : "x86";
// Source and destination paths
string src = Path.Combine(tempDir, subDir + "\\System.Data.SQLite.DLL");
string dest = Path.Combine(targetDir, "System.Data.SQLite.DLL");
// Move the SQLite DLL
File.Move(src, dest);
// All done. Delete our temp folder.
Directory.Delete(tempDir, true);
}