StrangeAttractor
@StrangeAttractor

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

На сколько я понял библиотеки System.Data.SQLite для своей работы требуют undmanaged SQLite библиотек, которые есть для 64 и 32-битных версий Windows. Как изготовить такое приложение, которое будет подключать соответствующую версию в зависимости от того, на какой машине запущено?
  • Вопрос задан
  • 3295 просмотров
Пригласить эксперта
Ответы на вопрос 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, но это уже другая история.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы