• Портирование на Linux с помощью MonoDevelop. Проблемма с NuGet пакетом System.Data.SQLite... в Mono не находит SQLite.Interop.dll. Что делать?

    @tsul
    System.Data.SQLite.dll под Linux должен использовать не SQLite.Interop.dll, а libsqlite3.so
    Т.е.
    1. либо нужен предустановленный пакет sqlite3 (libsqlite3, sqlite3-dev), чтобы библиотека libsqlite3.so была в системных,
    2. либо компилировать исходники sqlite3 на конкретной системе и класть libsqlite3.so.0 рядом с System.Data.SQLite.dll вместо SQLite.Interop.dll.

    В первом случае версия системной библиотеки может быть старее, чем нужна для System.Data.SQLite, могут быть проблемы с новыми фичами. Я делал по второму варианту. Пришлось еще перекомпилировать сам System.Data.SQLite:
    SET MSBUILD_ARGS=/property:UseInteropDll=false /property:UseSqliteStandard=true
    set NETFX35ONLY=1
    call build.bat ReleaseManagedOnly

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

    @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, но это уже другая история.
    Ответ написан
    Комментировать
  • Почему консольные приложения, запущенные через mono, потребляют много оперативной памяти?

    @tsul
    Хорошо бы подробности типа версии .NET, Mono, и какой тип памяти меряете/сопоставляете.
    Только что проверил на UDP-ресивере у себя (Windows7 x64 .NET 3.5 vs. Fedora Linux 12 x86-64 Mono 2.10.2)
    -- одинаково.
    Ответ написан
    Комментировать