LINUX.ORG.RU

C# Mono, SQLite в Win и Linux

 , ,


1

2

Добрый вечер! Как сделать что бы приложение-бд работало и в windows и в linux(opensuse), c System.Data.SQLite не получается что-то: (в винде код работает, а вот в линукс при нажатии на кнопку зависает, а потом программа закрывается)

using System;
using System.Windows.Forms;
using System.Data.SQLite;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{


SQLiteConnection conn = new SQLiteConnection();
MessageBox.Show(conn.State.ToString());
conn.ConnectionString = "data source=|DataDirectory|\\SQLiteMono.sqlite3";
conn.Open();
MessageBox.Show(conn.State.ToString());
conn.Close();
MessageBox.Show(conn.State.ToString());
}
}
}

Может надо использовать Mono.Data.SQLite? Пытаюсь, но следующий код не работает в виндус: (код с сайта http://www.mono-project.com/SQLite)

using System;
using System.Data;
using System.Windows.Forms;
using Mono.Data.Sqlite;
namespace MonoSqlite
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string connectionString = "Data Source=|DataDirectory|SQLiteMono.sqlite3, version=3";
IDbConnection dbcon;
dbcon = (IDbConnection)new SqliteConnection(connectionString);
dbcon.Open();
MessageBox.Show(dbcon.State.ToString());
dbcon.Close();
}
}
}

Второй код работает в linux (opensuse), но в винде выдает ошибку - «System.TypeLoadException: Правила безопасности наследования нарушены типом: „Mono.Data.Sqlite.SqliteConnectionHandle“. Производные типы должны либо соответствовать по доступности в контексте безопасности базовому типу, либо быть менее доступными.»

Вообщем, реально ли сделать что бы один код работал и в винде и в линукс?



Последнее исправление: cetjs2 (всего исправлений: 1)

Запусти первый код в отладчике либо гугли английский вариант текста исключения во втором коде.

quiet_readonly ★★★★
()

Проблема скорее всего в System.Data.SQLite, который может быть mixed assembly. Я брал с http://system.data.sqlite.org/ который после обработки напильником можно заставить жрать системный sqlite3. Как оно сейчас я не знаю.

ebantrop
()

Вообщем, реально ли сделать что бы один код работал и в винде и в линукс?

Конечно, самое простое это выкинуть шарп т.е. либо переписать полностью, либо запускать только под моно.

ya-betmen ★★★★★
()

SQLiteConnection conn = new SQLiteConnection();

1. этот объект реализует IDisposable не забывай об этом. за такой код стреляют.

conn.ConnectionString = «data source=|DataDirectory|\\SQLiteMono.sqlite3»;

2. поменяй data source на :memory:, теста ради
3. версию System.Data.Sqlite.dll в студию.
4. запускай mono --debug, смотри выхлоп в консоли. и да, софтину собери mcs, бинарник с винды тянуть не стоит.

dib2 ★★★★★
()
Ответ на: комментарий от dib2

Пробывал разные варианты, создавал код и в VS win, и в MonoDevelop lin, итог - win не хочет работать с Mono.Data.SQLite, lin не хочет работать с System.Data.SQLite, ругаются на *.dll.

Версия System.Data.SQLite - Interop Assembly, 1.0.89.0 Версия Mono.Data.SQLite - 4.0.0.0

*.dll я скачивал готовые, то есть сам их не собирал (вроде как я понял это можно сделать самому, но я еще нуб)

Конечно я нашел решение проблемы, но думаю что это плохой вариант, но все же - подключить две библиотеки и в зависимости от ос использовать нужную.

using System;
using System.Data;
using System.Data.SQLite;
using Mono.Data.Sqlite;

namespace MonoLast
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			String str = "Data Source=|DataDirectory|SQLiteMono.sqlite3, version=3";
			OperatingSystem os = Environment.OSVersion;
			switch (os.Platform)
			{
			case PlatformID.Unix:
				IDbConnection dbcon;
				dbcon = (IDbConnection)new SqliteConnection(str);
				Console.WriteLine(dbcon.State);
				dbcon.Open();
				Console.WriteLine(dbcon.State);
				dbcon.Close();
				Console.WriteLine(dbcon.State);
				break;
			case PlatformID.Win32NT:
				SQLiteConnection connWin = new SQLiteConnection(str);
				Console.WriteLine(connWin.State);
				connWin.Open();
				Console.WriteLine(connWin.State);
				connWin.Close();
				Console.WriteLine(connWin.State);
				break;
			}
			Console.ReadLine();
		}
	}
}
Эта программа работает на обеих ОС, но буду пробывать другие варианты)

Aleksy
() автор топика

Правильно советуют - собирай в линуксе на Mono - в винде работать будет, но не наоборот. Лучше так.

I-Love-Microsoft ★★★★★
()

подозреваю, что Mono.Data.Sqlite - кроссплатформенная либа, поэтому: 1) скомпиль свое приложение в mono вместе с Mono.Data.Sqlite 2) перенеси на винду свой exe и dll в которой лежит этот Mono.Data.Sqlite

должно помочь

EugeneBas ★★
()
Ответ на: комментарий от EugeneBas

Вообщем разобрался путем многочисленных попыток. Собрал System.Data.Sqlite в линуксе, но получилась на полная библиотека.

Что бы работало приложение в винде и было переносимо на другой комп нужно кинуть в папку с прогой как я понял ядро файл Sqlite3, скачать System.Data.Sqlite Introp Library и переименовать в Sqlite3.

Что бы работало в linux необходимо наличие установленного libsqlite3.so на ОС, на которой запускается прога.

Таким методом все работает, получается конечно кроссплатформенное приложение, но все таки требующая установленного файла в самом Linuxe, полностью переносимое приложение не требующее никаких дополнительно установленных файлов создать похоже не получится.

Aleksy
() автор топика
Ответ на: комментарий от Aleksy

ну так тебе нужно будет тогда в установочном пакете прописать зависимость на пакет с libsqlite3.so и проблема решена

EugeneBas ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.