Уже давно использую SQLite совместно с NHibernate для быстрого тестирования приложений, и так же давно мучает проблема совместимости x86/x64. Открывая проект на старой машине приходилось нудно переустанавливать подходящую сборку SQLite. В простом варианте это можно принудительно выставить во всех проектах platform target = x86, но мне такой вариант принципиально не нравился. В общем, сегодня решил эту проблему в относительно приличном виде, используя nuget и немного магии msbuild. Итак, решение по шагам.
1. Используя nuget добавляем в проект ссылку на System.Data.SQLite.MSIL. Эта сборка понадобиться только на этапе компиляции. Лично я предпочитаю делать это через Package Manager Console:
install-package System.Data.SQLite.MSIL
2. Открыть в проекте файл packages.config, и дописать в него пакеты System.Data.SQLite.x64 и System.Data.SQLite.x64. Добавлять через nuget не стоит, т.к. при этом nuget заменит ссылку на msil-сборку ссылкой на платформо-специфичную сборку:
<?xml version="1.0" encoding="utf-8"?><packages><package id="System.Data.SQLite.MSIL" version="1.0.80.0" /><!--Добавить вручную--><package id="System.Data.SQLite.x64" version="1.0.80.0" /><package id="System.Data.SQLite.x86" version="1.0.80.0" /></packages>
3. Настроить восстановление сборок в проекте из контекстного меню файла проекта:
4. Теперь пора немного пошаманить в файле проекта. Для начала из контекстного меню проекта выбираем меню Unload Project:
а затем открываем его на редактирование:
5. Идейно простая часть – определить тип операционной системы, и переписать поверх MSIL сборок платформо-специфичные. Пришлось немного повозиться с переменными окружения, т.к. они отличаются для разных операционных систем. Но теме не менее, проблему удалось успешно победить, добавив в конец файла проекта немного кода:
<PropertyGroup><SQLitePath Condition="$(PROCESSOR_ARCHITEW6432) == 'AMD64'">..\packages\System.Data.SQLite.X64.1.0.80.0\lib\net40\</SQLitePath><SQLitePath Condition="$(PROCESSOR_ARCHITEW6432) == 'X86'">..\packages\System.Data.SQLite.X86.1.0.80.0\lib\net40\</SQLitePath><SQLitePath Condition="$(PROCESSOR_ARCHITEW6432) == '' AND $(PROCESSOR_ARCHITECTURE) == 'AMD64'">..\packages\System.Data.SQLite.X64.1.0.80.0\lib\net40\</SQLitePath><SQLitePath Condition="$(PROCESSOR_ARCHITEW6432) == '' AND $(PROCESSOR_ARCHITECTURE) == 'X86'">..\packages\System.Data.SQLite.X86.1.0.80.0\lib\net40\</SQLitePath></PropertyGroup><Target Name="AfterBuild"><Exec Command="xcopy /s /y "$(SQLitePath)*.*" "$(TargetDir)""/></Target>
6. Снова загрузить проект, и запустить build. После этого всё должно работать.
В завершении хотелось бы сказать несколько замечаний. Все эти сложности нужны только если бы компилирует проект под AnyCPU, под конкретную платформу это всё не надо. Плохо, что путь к сборкам жёстко зашит. Его можно было бы выдернуть из ссылок, но на текущей момент мне не хотелось этим заниматься (программировать на xml всегда неудобно).
Удачной разработки с SQLite.
Комментариев нет:
Отправить комментарий