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”参数调用“打开”的异常:“尝试加载格式不正确的程序。(来自 HRESULT 的异常:0x8007000B)”

尝试加载x86程序集会导致:

使用“1”参数调用“LoadFrom”的异常:“无法加载文件或程序集 'file:///C:\projects\PSScripts\lib\System.Data.SQLite.DLL' 或其依赖项之一。试图加载格式不正确的程序。”

有什么想法或想法吗?

4

3 回答 3

4

您的 x64 二进制文件是否可能已损坏?我可以使用以下代码在新下载的 system.data.sqlite.dll 副本上成功使用 add-type,并且可以实例化所有相关对象。我还能够无错误地打开数据库,并成功执行查询。在您的数据库中尝试这种技术(本质上是使用 Add-Type 而不是 LoadFrom)并告诉我。

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 的文件中,并将其放在模块路径中的某个位置。然后将您下载的两个 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 也将使用 .Net 3.5。如果您跳过其他环节(在其他地方讨论过),您可以在 Powershell 中使用 .NET 4.0。

从以下网址下载 ADO SQLite 包:
http ://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

查找64 位 Windows (.NET Framework 3.5 sp1) 的预编译二进制文件。选择适当的 zip(带或不带 VC++ 运行时)。不要让文件名中的 2008(或 2010)欺骗您。它是对用于编译的 VC++ 版本的引用。该项目是当前的。撰写本文时的版本是 1.0.79.0,日期为 2012 年 1 月 28 日。不幸的是,此软件包不附带帮助文件。有用的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,则powershell.exe.configpowershell.exe's 目录中,请注意 x86 和 x64 的位置不同):

<?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 回答