web-dev-qa-db-ja.com

x86 / x64アーキテクチャ用のSQLite dll

私はVB.netでプログラムを開発していて、 System.Data.SQLite .NETのプリコンパイル済みバイナリを使用していますが、x64アーキテクチャでは機能せず、従来のカルチャの問題が発生してロードされません正しいファイル。

System.BadImageFormatException: 
Could not load file or Assembly 'System.Data.SQLite, Version=1.0.65.0, Culture=neutral,
 PublicKeyToken=db937bc2d44ff139' or one of its dependencies. An attempt was made to load a program with an incorrect format.
File name: 'System.Data.SQLite,
 Version=1.0.65.0,
 Culture=neutral, 
 PublicKeyToken=db937bc2d44ff139'

DLLを1つだけ使用する方法はありますか?

  1. #IFDEF(x86はコードの一部を含む)またはx64コードのようないくつかのディレクティブを追加します
  2. DLLを結合して1つだけにします。
  3. VB.netでこのDLLを参照する

X32用とx64用ではなく、コンパイルを1つだけ作成したいので、他のより良いアイデアだと思いますか。

たとえば(32ビット):

Private Shared Sub OpenConection(ByRef Conn As SQLite.SQLiteConnection)
    Conn = New SQLite.SQLiteConnection("Data Source=" & System.Environment.CurrentDirectory & "\database.db")
    Conn.Open()
End Sub

Private Shared Sub CloseConection(ByRef Conn As SQLite.SQLiteConnection)
    Conn.Close()
    Conn.Dispose()
    Conn = Nothing
End Sub

Public Shared Function ReturnSelect(ByVal DataTAbleName As String, ByVal sQuery As String, ByVal sWhere As String) As Data.DataTable
    Dim lDT As New DataTable
    Dim lTA As New SQLite.SQLiteDataAdapter
    If DataTAbleName Is Nothing Then Return New DataTable(DataTAbleName)
    Try
        OpenConection(conexion)
        lTA = New SQLite.SQLiteDataAdapter("SELECT " & sQuery & " FROM  " & DataTAbleName & IIf(sWhere <> String.Empty, " WHERE ", "") & sWhere, conexion)
        lTA.Fill(lDT)
    Catch ex As Exception
        Throw ex
    Finally
        CloseConection(conexion)
        lTA.Dispose()
        lTA = Nothing
    End Try
    Return lDT
End Function

64ビットアーキテクチャで動作するように変更するにはどうすればよいですか?多分32と64の両方のdllを含み、関数には次のようなものがあります

Try
    Instance = Me
    'Check If Homidom Run in 32 or 64 bits
    If IntPtr.Size = 8 Then _OsPlatForm = "64" Else _OsPlatForm = "32"
    'continue code

Catch ex As Exception
    ' ex.Message
End Try
14
cMinor

.NETアセンブリからSQLiteを使用するためのさまざまなオプションがあります。最初のステップは、古代の1.0.65バージョンよりも新しいものに移行することです。現在のバージョンはここからダウンロードできます: http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki または SQLite NuGetパッケージを介して

32ビットと64ビットの両方で実行できるようにする必要がある場合、1つのオプションはネイティブライブラリのプリロードオプションを使用することです。ネイティブバイナリを個別のディレクトリに配布すると、次のようになります。

  • \ App.exe(オプション、管理のみのアプリケーション実行可能アセンブリ)
  • \ App.dll(オプション、管理のみのアプリケーションライブラリアセンブリ)
  • \ System.Data.SQLite.dll(必須、管理のみのコアアセンブリ)
  • \ System.Data.SQLite.Linq.dll(オプション、管理のみのLINQアセンブリ)
  • \ x86\SQLite.Interop.dll(必須、x86ネイティブ相互運用機能アセンブリ)
  • \ x64\SQLite.Interop.dll(必須、x64ネイティブ相互運用機能アセンブリ)

別のオプションは、アプリの2つのバージョンをビルドすることです。各バージョンでは、適切な混合モードアセンブリを参照します。その後、2つのバージョンが作成されますが、追加のサブディレクトリとネイティブの* .Interop.dllが必要ないため、処理が少し簡単です。

これらの場合、32ビットと64ビットのコードの違いやオプションのコンパイルは必要ありません。異なるNuGetパッケージからインストールすると、おそらく最も簡単に開始できます。

最後のオプションは、C#-SQLite: https://code.google.com/p/csharp-sqlite/ と呼ばれる管理専用クローンを使用することです。これはSQLiteエンジンをマネージC#に移植したものであるため、すべてがAnyCPUとして実行され、ビット数は問題になりません。

24
Govert

私は数年前に同じ問題を抱えていましたが、私にとって最善の解決策は次のとおりです。

  • ライブラリの 最新バージョン をダウンロード
  • あなたのビンパスにはSystem.Data.SQLite.dllのみを入れ、最終的にはSystem.Data.SQLite.Linq.dllを入れてください
  • x86 SQLite.Interop.dllライブラリをc:\Windows\SysWOW64に入れます
  • x64 SQLite.Interop.dllライブラリをc:\Windows\System32に入れます
  • Any CPUのみを参照してプロジェクトをSystem.Data.SQLiteとしてコンパイルします(binパスへのdll)
  • 楽しい

このようにして、.NETフレームワークは、GACなどに何も登録せずに、実行時に正しい(x86 vs x64)ライブラリを自動的にロードします。

お役に立てれば。

6
Tobia Zambon

最先端の質問は Nuget を使用して簡単に解決できます。インストール後、次のように検索してください SQLite

PM> Install-Package System.Data.SQLite 

私はこれを新しいコンピュータとVSを使用して実行しました。SQLiteが必要で、これを実行すると、すべてが正常に機能しました。

1
cMinor

いいえ、ありません。

これは、これらの* .dllがネイティブc/c ++ * .dllの単なるラッパーであるためです。また、32ビットの.NETアプリケーションは32ビットのc/c ++ dllを使用する必要があり、64ビットの.NETアプリケーションは64ビットのc/c ++ dllを使用する必要があります。

私はvb.netを長い間使用していません。C#のようにターゲットプラットフォームを構成できるかどうかはわかりません。可能であれば、そうする必要があり、適切な相互運用DLLを使用する必要があります。また、32ビットと64ビットのどちらが必要かを決定する必要があります。

1
user743414

@Govertと@TobiaZambonによる他の回答は、正しい方法です。しかし、他の人が読んでいる場合、別のオプションは、System.Data.Sqlite dllのx86バージョンを使用して、x86プラットフォーム用にアプリケーションをコンパイルすることです。つまり、AnyCPUにコンパイルしないでください。つまり、x64マシンウィンドウで実行すると、32ビットモードで実行され、32ビットのdllをロードできるようになります。

これが役立つかどうかは状況によって異なりますが、ワークステーションにデプロイされるアプリを構築する場合は、非常にシンプルなソリューションです。

1
Rory