4

Windows 7 x64 で PowerShell から System.Data.SQLite.dll を読み込もうとして苦労しています。

# x64
[void][System.Reflection.Assembly]::LoadFrom("C:\projects\PSScripts\lib\System.Data.SQLite.x64.DLL")
# x86
#[void][System.Reflection.Assembly]::LoadFrom("C:\projects\PSScripts\lib\System.Data.SQLite.DLL")

$conn = New-Object -TypeName System.Data.SQLite.SQLiteConnection
$conn.ConnectionString = "Data Source=C:\temp\PSData.db"
$conn.Open()
$command = $conn.CreateCommand()
$command.CommandText = "select DATETIME('NOW') as now, 'Bar' as Foo"
$adapter = New-Object -TypeName System.Data.SQLite.SQLiteDataAdapter $command
$dataset = New-Object System.Data.DataSet
[void]$adapter.Fill($dataset)

x64アセンブリとの接続を開こうとすると、次のようになります。

"0" 個の引数を指定して "Open" を呼び出し中に例外が発生しました: "不正な形式のプログラムを読み込もうとしました。(HRESULT からの例外: 0x8007000B)"

x86アセンブリを読み込もうとすると、次のようになります。

"1" 個の引数を指定して "LoadFrom" を呼び出し中に例外が発生しました: "ファイルまたはアセンブリ 'file:///C:\projects\PSScripts\lib\System.Data.SQLite.DLL' またはその依存関係の 1 つを読み込めませんでした。不正な形式のプログラムを読み込もうとしました。」

考えやアイデアはありますか?

4

3 に答える 3

4

x64 バイナリが破損している可能性はありますか? 以下のコードを使用して、新しくダウンロードした system.data.sqlite.dll のコピーで add-type を正常に使用でき、関連するすべてのオブジェクトをインスタンス化できます。また、エラーなしでデータベースを開き、クエリを正常に実行できます。データベースでこの手法 (基本的には LoadFrom の代わりに Add-Type を使用) を試して、私に知らせてください。

SQLite PowerShell モジュールのサンプル コード:

function Add-SqliteAssembly {
    # determine bitness (32 vs. 64) of current PowerShell session
    # I'm assuming bitness = system architecture here, which won't work on IA64, but who cares
    switch ( [intptr]::Size ) {
        4   { $binarch = 'x86' }
        8   { $binarch = 'x64' }
    }
    $modPath = $MyInvocation.MyCommand.Module.ModuleBase
    $SQLiteBinName = 'System.Data.SQLite.dll'
    $SQLiteBinPath = "$modPath\$binarch\$SQLiteBinName"
    Add-Type -Path $SQLiteBinPath 
}

このモジュールを使用するには、sqlite.psm1 という名前のファイルに保存し、モジュール パスのどこかに配置します。次に、ダウンロードした 2 つの System.Data.SQLite.dll をサブフォルダーに配置し、それぞれを適切なフォルダー (x86 または x64) に配置します。次に、PowerShell で次のように入力します。

Import-Module sqlite

そして、実際にアセンブリをロードするには:

Add-SqliteAssembly

これで、最初のコード (loadfrom を除く) が機能するはずです。

于 2010-12-30T02:21:13.370 に答える
3

System.Data.SQLite.dllがビット(32または64)と.Netバージョンの両方で正しいことを確認する必要があります。Win 7 x64の場合、デフォルトでインストールされている.Netは3.5です。4.0(またはそれ以降)のクライアントをインストールしている場合でも、Powershellは.Net3.5を使用します。他のフープ(他の場所で説明)をジャンプする場合は、Powershellで.NET4.0を使用できます。

http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wikiからADOSQLiteパッケージをダウンロードします。

64ビットWindows(.NET Framework 3.5 sp1)用のプリコンパイル済みバイナリを探します。適切なzipを選択します(VC ++ランタイムの有無にかかわらず)。ファイル名の2008(または2010)にだまされてはいけません。これは、コンパイルに使用されるVC++バージョンへの参照です。プロジェクトは現在のものです。この記事の執筆時点でのバージョンは、2012年1月28日付けの1.0.79.0です。残念ながら、ヘルプファイルはこのパッケージに付属していません。便利なSQLite.Net.chmファイルは、docs\フォルダーの別のソースパッケージにあります。

zipが抽出されたら(インストールやレジストリのハッキングは必要ありません)、次を使用してPowerShellスクリプトでdllを指定します。

Add-Type -Path "<drive> <path> \ System.Data.SQLite.dll"

例:
Add-Type -Path "C:\ sql \ sqliteFx35x64 \ System.Data.SQLite.dll"

残りのテストコードは機能するはずです

于 2012-03-23T06:03:55.140 に答える
0

YourApp.exe.configアプリケーションのホーム ディレクトリにファイルを作成しようとします( PowerShell の場合は のディレクトリに、x86 と x64 では場所が異なることに注意してください) powershell.exe.configpowershell.exe

<?xml version="1.0"?>
<configuration>
 <runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
   <probing privatePath="C:\projects\PSScripts\lib"/>
  </assemblyBinding>
 </runtime>
</configuration>

問題が解決しない場合は、すべての SQLite DLL が正しくインストールされていることを再確認してください。マニュアルを参照してください (私は SQLite ADO .NET プロバイダーについてあまり知りません)。

于 2010-12-29T10:43:21.683 に答える