StrangeAttractor
@StrangeAttractor

Как сделать так, чтобы использующее SQLite WinForms.Net приложение работало и на 32 и на 64 битных системах?

На сколько я понял библиотеки System.Data.SQLite для своей работы требуют undmanaged SQLite библиотек, которые есть для 64 и 32-битных версий Windows. Как изготовить такое приложение, которое будет подключать соответствующую версию в зависимости от того, на какой машине запущено?
  • Вопрос задан
  • 3247 просмотров
Пригласить эксперта
Ответы на вопрос 2
AxisPod
@AxisPod
Делал 2мя способами, один сейчас описать не смогу, слишком громоздкий (да и в рантайме не позволяет изменить, придется всё равно собирать 2 версии приложения).

Вот вариант попроще stackoverflow.com/questions/11934570/change-c-shar...

Требуется положить x86 и x64 библиотеки в соответствующие папки, и засунуть приведенный код в метод Main как там и указано.

Хотя в принципе можно тут попробовать использовать MEF, но тут понадобится .NET 4.5 как минимум.
Ответ написан
@tsul
Это можно сделать, используя встроенную фичу System.Data.SQLite, которая ищет версию SQLite.Interop.dll кроме как рядом с собой, ещё и в директории, соотв. архитектуре, т.е. x86 или x64 соответственно.
См. Using Native Library Pre-Loading в ихней wiki.

Делал так:
  1. Качал Precompiled Binaries для x86 и x64, которые не mixed-mode, а System.Data.SQLite.dll + SQLite.Interop.dll. В них System.Data.SQLite.dll совпадают.
  2. Клал всё это в директорию cs/Common/SQLite/ так:
    • System.Data.SQLite.dll
    • System.Data.SQLite.pdb
    • System.Data.SQLite.xml
    • x86/
      • SQLite.Interop.dll
      • SQLite.Interop.pdb

    • x64/
      • SQLite.Interop.dll
      • SQLite.Interop.pdb


  3. В проекте делал Private Reference (т.е. Copy Local = True) на System.Data.SQLite.dll, и линки с путями на Interop dll-ки. Линки в csproj выглядят так (кажется, руками правил чтоб пути были x86 и x64):
    <Content Include="..\..\..\cs\Common\SQLite\x86\SQLite.Interop.dll">
          <Link>x86\SQLite.Interop.dll</Link>
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
        <Content Include="..\..\..\cs\Common\SQLite\x86\SQLite.Interop.pdb">
          <Link>x86\SQLite.Interop.pdb</Link>
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
        <Content Include="..\..\..\cs\Common\SQLite\x64\SQLite.Interop.dll">
          <Link>x64\SQLite.Interop.dll</Link>
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
        <Content Include="..\..\..\cs\Common\SQLite\x64\SQLite.Interop.pdb">
          <Link>x64\SQLite.Interop.pdb</Link>
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>

Всё, после сборки в Debug или Release получаются две директории x86 и x64 с соотв. SQLite.Interop.dll, System.Data.SQLite.dll и exe-шник проги, который работает в винде любой битности.

Там еще чуток посложнее было, потому как тот же проект у меня под Mono на Linux шёл, поэтому были еще ссылки на libsqlite3.so.0, но это уже другая история.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы