2012-01-11 68 views
4

我正在開發一個使用SQLite3數據庫並需要在Windows和Linux之間交叉兼容的C#項目。在Mono上運行Sqlite

Linux服務器正在使用版本3.2.8,我正在使用Managed Sqlite Library DLL 1.0.66.0。

我抄DLL到服務器和當我運行單myexec.exe它顯示以下錯誤

未處理的異常:System.EntryPointNotFoundException: sqlite3_open_v2在(包裝管理到本機) System.Data.SQLite.UnsafeNativeMethods:sqlite3_open_v2 (字節[],IntPtr的&,整型,IntPtr的)在System.Data.SQLite.SQLite3.Open (System.String strFilename,SQLiteOpenFlagsEnum標誌的Int32 maxPoolSize,布爾usePool) 0x00000] in:0 at System.Data.SQLite.SQLiteConnection.Open() [0x00000]中:0在AudioManagement.DatabaseConnection..ctor()[0x00000] 在:0在 LinuxAudioManager.Configure.startConfiguration()[0x00000]在 :0在LinuxAudioManager.Program.Main (System.String [ ] args)[0x00000] in:0

當它試圖創建數據庫文件或打開連接時會引發此錯誤,我不確定它是哪一個。

下面是我用的,爲了創建連接

conn = new SQLiteConnection("Data Source=database.db"); 
conn.Open() 

感謝您的幫助,您可以提供的代碼。

UPDATE 我剛剛用單聲道記錄執行了我的程序,發現了一些相當奇怪的東西。它似乎有加載lib文件的問題。輸出低於

Mono-INFO:DllImport試圖加載:'libsqlite3.so.0'。 Mono-INFO:

DllImport加載位置:'libsqlite3.so.0.so'。單INFO:的DllImport

加載庫:「libsqlite3.so.0.so:無法打開共享對象

文件:沒有這樣的文件或目錄」。 Mono-INFO:DllImport loading

庫:'./libsqlite3.so.0.so'。單信息:錯誤的DllImport裝載

庫「./libsqlite3.so.0.so:無法打開共享對象文件:沒有這樣的

文件或目錄」。單聲道INFO:DllImport加載:'libsqlite3.so.0'。

單聲道信息:搜索'sqlite3_open_v2'。 Mono-INFO:探測

'sqlite3_open_v2'。 Mono-INFO:探測'sqlite3_open_v2'。單聲道信息:

探測'sqlite3_open_v2A'。 Mono-INFO:探測'sqlite3_open_v2A'。

Mono-INFO:DllImport試圖加載:'libsqlite3.so.0'。 Mono-INFO:

DllImport加載位置:'libsqlite3.so.0.so'。單INFO:的DllImport

加載庫:「libsqlite3.so.0.so:無法打開共享對象

文件:沒有這樣的文件或目錄」。 Mono-INFO:DllImport loading

庫:'./libsqlite3.so.0.so'。單信息:錯誤的DllImport裝載

庫「./libsqlite3.so.0.so:無法打開共享對象文件:沒有這樣的

文件或目錄」。單聲道INFO:DllImport加載:'libsqlite3.so.0'。

單聲道信息:搜索'sqlite3_open_v2'。 Mono-INFO:探測

'sqlite3_open_v2'。 Mono-INFO:探測'sqlite3_open_v2'。單聲道信息:

探測'sqlite3_open_v2A'。 Mono-INFO:探測'sqlite3_open_v2A'。

文件libsqlite3.so.0確實存在,但我不明白爲什麼mono會嘗試加載 libsqlite3.so.0.so。

更新2 我認爲第一個更新的錯誤消息是指向我在錯誤的方向,因爲我已經創建了一個符號鏈接來匹配它找不到LIB文件和單不再說這couldn」加載一些東西。但是原來的EntryPointNotFoundException仍顯示

更新3 感謝@bryanmac我已經改變使用Mono.Data.Sqlite DLL,而不是其下單在Linux上正常工作的代碼。但是,在Windows中使用此DLL現在不再有效。 VS2010將建立它沒有問題,但是當我試着執行它時它會顯示錯誤

無法加載DLL「sqlite3的」:指定的模塊找不到

我下載了一個sqlite3的.exe二進制從sqlite網站和可執行文件到我的程序的可執行文件,但我的程序仍然在Windows上顯示錯誤消息。

+0

您是否在Windows上試過Mono以查看它是否有效? – bryanmac 2012-01-11 18:21:19

+0

http://code.google.com/p/csharp-sqlite/切換到C#SQLite,你會忘記這些原生的混亂。但是,此C#端口確實存在一些已知問題(請查看問題頁面)。 – 2012-05-03 03:01:28

回答

1

看起來它無法在本機sqlite3二進制文件(sqlite3_open_v2)中找到入口點。 System.data.SQLLite是一個託管的ado.net包裝器,可以進行互操作。

你還有本地的sqlite3二進制文件嗎?它們都坐落在這裏:http://sqlite.org/download.html

編輯:

你使用單聲道及以下點你的下載鏈接到Windows DLL下載注意到。試過看過嗎?

http://www.mono-project.com/SQLite

+0

我試過管理和非管理,但他們都似乎拿出相同的錯誤消息 – Boardy 2012-01-11 12:38:32

+0

當您使用託管的一個是從我指定的下載位置的sqlite3二進制文件,並排坐在一起嗎? – bryanmac 2012-01-11 12:40:43

+0

他們有一個託管和非託管包裝層與本機sqlite.org二進制文件互操作... – bryanmac 2012-01-11 12:41:21

4

當你的程序使用不同。將SQLite客戶端程序集的網絡實現添加到單聲道中包含的程序集中,您的新程序集正在調用mono中隨附的sqlite C庫中不存在的未管理的函數。

默認情況下,配置項用於重定向用於請求sqlite和sqlite3時使用的共享庫。這通常是在/etc/mono/config

這是我看到我的機器上:

$ grep -i sqlite /etc/mono/config 
    <dllmap dll="sqlite" target="libsqlite.so.0" os="!windows"/> 
    <dllmap dll="sqlite3" target="libsqlite3.so.0" os="!windows"/> 

這是在http://www.mono-project.com/Config_DllMap描述。

您可以創建一個配置文件來覆蓋爲您自己的程序定義的單聲道默認值。

<!-- myprogram.exe.config --> 
<configuration> 
    <dllmap dll="sqlite3" target="./libsqlite3.so.0"/> 
</configuration> 

請注意./這迫使運行庫查找與庫的exe相同的文件夾。

如果您決定使用不同於Mono.Data.Sqlite的版本,那麼您可能仍然需要這樣做。

+0

對不起,我不明白這是什麼。目前它正在Linux下工作,沒有問題。 Windows現在的問題是它無法找到該模塊。對不起,如果我是一個noob我有點在Linux和Windows上使用Sqlite是非常新的 – Boardy 2012-01-11 15:32:06