Devart.SQLite.DLLで使用するために、実行時に適切なx86/x64バージョンのSQLite3.DLLを動的にロードしようとしています。事前に適切なバージョンのDLLをアプリケーションルートにインストールすることを制御できないため、アプリケーションルートの/x86または/x64サブディレクトリから正しいバージョンを取得する必要があります。
これを達成する方法について何かアイデアはありますか?確かに、私はここで完全に迷子になっています。これまでの私のコードは次のとおりです。
Public Sub New()
LoadAssembly("sqlite3.dll", True)
End Sub
Private Function GetAssemblyPath(ByVal assembly As String, ByVal version As String) As String
Return Path.GetDirectoryName(Reflection.Assembly.GetExecutingAssembly().Location) & "\" & version & "\" & assembly
End Function ' GetAssemblyName
<Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint:="LoadLibraryW")> _
Public Shared Function LoadLibraryW(<Runtime.InteropServices.InAttribute()> <Runtime.InteropServices.MarshalAsAttribute(Runtime.InteropServices.UnmanagedType.LPWStr)> lpLibFileName As String) As IntPtr
End Function
Private Sub LoadAssembly(ByVal myAssembly As String, Optional ByVal doLoadLibrary As Boolean = False)
Dim an As AssemblyName
Dim filename As String
Dim version As String
If UIntPtr.Size = 8 Then version = "x64" Else version = "x86"
filename = GetAssemblyPath(myAssembly, version)
Try
If doLoadLibrary Then
HostLog.WriteEntry(filename, EventLogEntryType.Information)
Dim ptr As IntPtr = LoadLibraryW(filename)
HostLog.WriteEntry(ptr.ToString(), EventLogEntryType.Information)
Else
an = AssemblyName.GetAssemblyName(filename)
AppDomain.CurrentDomain.Load(an)
End If
Catch ex As Exception
HostLog.WriteEntry(ex.Message, EventLogEntryType.Error)
End Try
End Sub ' LoadAssembly
編集 コメントで述べたように、sqlite3.dllをロードしようとしたときに受け取った実際のエラーを特定できませんでした。結局のところ、App.Configに次のものがありませんでした。
<system.data>
<DbProviderFactories>
<remove invariant="Devart.Data.SQLite" />
<add name="dotConnect for SQLite"
invariant="Devart.Data.SQLite"
description="Devart dotConnect for SQLite"
type="Devart.Data.SQLite.SQLiteProviderFactory, Devart.Data.SQLite, Version=4.2.122.0, Culture=neutral, PublicKeyToken=09af7300eec23701" />
</DbProviderFactories>
</system.data>
これをApp.Configに追加すると、以前のコードサンプルは期待どおりに機能しました。みんなの助けに感謝します。