Установка другой версии сборки на основе платформы? - PullRequest
1 голос
/ 07 августа 2010

Я создаю программу установки в VS2008 для приложения C #, использующего SQLite, для которого требуются разные версии сборки для сред x86 и x64.Каков наилучший способ, чтобы программа установки автоматически установила правильную сборку в зависимости от среды?

1 Ответ

0 голосов
/ 01 января 2011

В конце концов мне пришлось немного взломать это. Проект установки теперь включает zip-файл с версиями SQLite для x86 и x64. Перехватчики класса моего проекта переопределяют метод OnBeforeInstall, а затем распаковывают zip-файл во временную папку, проверяют среду и копируют правильную версию в папку установки приложения.

Код - что-то вроде этого, хотя регистрация и обработка ошибок были удалены из этого примера, чтобы сохранить код релевантным.

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);
}
...