我在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'或其依赖项之一。一个 尝试加载格式不正确的程序。“
有什么想法或想法吗?
答案 0 :(得分: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的文件中,并将其放在module path中的某个位置。然后将您have downloaded的两个System.Data.SQLite.dll放入子文件夹中,每个文件夹位于正确的文件夹(x86或x64)中。然后,在PowerShell中,键入:
Import-Module sqlite
然后实际加载程序集:
Add-SqliteAssembly
现在,你的初始代码(减去来自东西的负载)应该有效。
答案 1 :(得分: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 ++版本的引用。该项目是最新的。本文撰写时的版本是2012年1月28日的1.0.79.0。不幸的是,该软件包没有附带帮助文件。有用的 SQLite.Net.chm 文件位于docs \文件夹中的单独源包中。
提取zip后(无需安装或注册表黑客攻击),使用以下命令将您的powershell脚本指向dll:
添加类型-Path“< drive>< path> \ System.Data.SQLite.dll”
例:
Add-Type -Path“C:\ sql \ sqliteFx35x64 \ System.Data.SQLite.dll”
其他测试代码应该可以正常工作
答案 2 :(得分:0)
我会尝试在应用程序主目录(YourApp.exe.config
目录中powershell.exe.config
创建powershell.exe
文件,如果它是PowerShell,请注意x86的位置不同, 64):
<?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提供程序了解不多)。