DbEntry on Mono 测试
2010-01-06 10:42:55 来源:WEB开发网核心提示:Mono 2.6 发行,.Net 兼容性得到很大提高,DbEntry on Mono 测试,据说甚至很多 WinForm 的程序,也可以不修改的编译运行成功了,程序就成功运行了,,Mono 有一个 Mono 兼容性检测工具,叫做 MoMA
Mono 2.6 发行,.Net 兼容性得到很大提高,据说甚至很多 WinForm 的程序,也可以不修改的编译运行成功了。
Mono 有一个 Mono 兼容性检测工具,叫做 MoMA,我用 MoMA 检测了 DbEntry 生成的 dlls,结果显示,有两个地方不兼容,一个是 Mono 不支持 OleDB,一个是 Mono 不支持 ODBC。当然,这是一个很合理的结果,linux 上根本就没有 OleDB 和 ODBC 嘛。
不过,具体兼容性怎么样,还是需要实际测试一下。
一开始,我使用 Ubuntu 9.10 来安装 Mono 和 MonoDevelop,发现,如果你安于使用 Ubuntu 缺省提供的版本,还是可以的,如果你想安装最新版本的 Mono 和 MonoDevelop,还真是需要费不少力气。所以最后还是决定使用 openSUSE,它和 Mono 都是 Novell 出的,在 Mono 和 MonoDevelop 的下载页,都直接有 openSUSE 的版本,安装起来方便不少,比如 MonoDevelop 中对于 boo 和 vala 的支持,在 Ubuntu 里需要自己先安装好,而在 openSUSE 里,它会自动安装。
然后,直接把 DbEntry 的 dlls 和 System.Data.SQLite.dll 复制到项目目录里,程序就是最基本的 CRUD。
在运行中发现两个问题:
1.System.Data.SQLite.dll 会出错,这个在预料之中,因为 System.Data.SQLite.dll 使用的是 Managed C++ 和 Unmanaged C++ 混合编程的方式,在 Linux 下出错也是应该的。
2.抽象 Init 函数出错,说是非法的 IL ret,这个我倒是有印象,在当时反编译 DbEntry 生成的程序集的时候,发现对于 Init 函数,我多 Emit 了一个 ret,.Net 没抱怨,Mono 抱怨了。
对于第二个问题,作为测试,暂时可以先不用 Init 函数,对于第一个问题,试着改用 Mono 提供的 Sqlite PRovider,程序得以运行成功。
配置文件如下:
<?xml version="1.0" encoding="utf-8" ?><configuration> <configSections> <section name="Lephone.Settings" type="Lephone.Util.Setting.NameValueSectionHandler, Lephone.Util" /> </configSections> <Lephone.Settings> <add key="AutoCreateTable" value="true" /> <add key="DataBase" value="@SQLite : @~Test.db" /> <add key="DbProviderFactory" value="Mono.Data.Sqlite.SqliteFactory, Mono.Data.Sqlite, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" /> </Lephone.Settings></configuration>
程序如下:
代码
using System;using Lephone.Data.Definition;namespace testdb{ public abstract class User : DbObjectModel<User> { public abstract string Name { get; set; } public abstract int Age { get; set; } public abstract User Init(string name, int age); } class MainClass { public static void Main (string[] args) { Console.WriteLine ("Create...."); var u = User.New; u.Name = "tom"; u.Age = 20; u.Save(); Console.WriteLine (u); Console.WriteLine (); Console.WriteLine ("Read...."); var u1 = User.FindById(u.Id); Console.WriteLine (u1); Console.WriteLine (); Console.WriteLine ("Update...."); u1.Name = "jerry"; u1.Age = 11; u1.Save(); Console.WriteLine (u1); Console.WriteLine (); Console.WriteLine ("Delete..."); u1.Delete(); Console.WriteLine (User.FindById(u1.Id) == null ? "{null}" : "{not null}"); Console.WriteLine (); } }}
运行结果:
Create....{ Id = 1, Name = tom, Age = 20 }Read....{ Id = 1, Name = tom, Age = 20 }Update....{ Id = 1, Name = jerry, Age = 11 }Delete...{null}
其实,这个结果有些超乎我的预期了,本来我还以为,也许我需要移除对于 OleDB 和 ODBC 引用的部分,并且使用 Mono 编译 DbEntry 的源程序才行,结果是,DbEntry 没有任何修改,直接使用 VS 编译的 dlls,程序就成功运行了。。。
Mono 有一个 Mono 兼容性检测工具,叫做 MoMA,我用 MoMA 检测了 DbEntry 生成的 dlls,结果显示,有两个地方不兼容,一个是 Mono 不支持 OleDB,一个是 Mono 不支持 ODBC。当然,这是一个很合理的结果,linux 上根本就没有 OleDB 和 ODBC 嘛。
不过,具体兼容性怎么样,还是需要实际测试一下。
一开始,我使用 Ubuntu 9.10 来安装 Mono 和 MonoDevelop,发现,如果你安于使用 Ubuntu 缺省提供的版本,还是可以的,如果你想安装最新版本的 Mono 和 MonoDevelop,还真是需要费不少力气。所以最后还是决定使用 openSUSE,它和 Mono 都是 Novell 出的,在 Mono 和 MonoDevelop 的下载页,都直接有 openSUSE 的版本,安装起来方便不少,比如 MonoDevelop 中对于 boo 和 vala 的支持,在 Ubuntu 里需要自己先安装好,而在 openSUSE 里,它会自动安装。
然后,直接把 DbEntry 的 dlls 和 System.Data.SQLite.dll 复制到项目目录里,程序就是最基本的 CRUD。
在运行中发现两个问题:
1.System.Data.SQLite.dll 会出错,这个在预料之中,因为 System.Data.SQLite.dll 使用的是 Managed C++ 和 Unmanaged C++ 混合编程的方式,在 Linux 下出错也是应该的。
2.抽象 Init 函数出错,说是非法的 IL ret,这个我倒是有印象,在当时反编译 DbEntry 生成的程序集的时候,发现对于 Init 函数,我多 Emit 了一个 ret,.Net 没抱怨,Mono 抱怨了。
对于第二个问题,作为测试,暂时可以先不用 Init 函数,对于第一个问题,试着改用 Mono 提供的 Sqlite PRovider,程序得以运行成功。
配置文件如下:
<?xml version="1.0" encoding="utf-8" ?><configuration> <configSections> <section name="Lephone.Settings" type="Lephone.Util.Setting.NameValueSectionHandler, Lephone.Util" /> </configSections> <Lephone.Settings> <add key="AutoCreateTable" value="true" /> <add key="DataBase" value="@SQLite : @~Test.db" /> <add key="DbProviderFactory" value="Mono.Data.Sqlite.SqliteFactory, Mono.Data.Sqlite, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" /> </Lephone.Settings></configuration>
程序如下:
代码
using System;using Lephone.Data.Definition;namespace testdb{ public abstract class User : DbObjectModel<User> { public abstract string Name { get; set; } public abstract int Age { get; set; } public abstract User Init(string name, int age); } class MainClass { public static void Main (string[] args) { Console.WriteLine ("Create...."); var u = User.New; u.Name = "tom"; u.Age = 20; u.Save(); Console.WriteLine (u); Console.WriteLine (); Console.WriteLine ("Read...."); var u1 = User.FindById(u.Id); Console.WriteLine (u1); Console.WriteLine (); Console.WriteLine ("Update...."); u1.Name = "jerry"; u1.Age = 11; u1.Save(); Console.WriteLine (u1); Console.WriteLine (); Console.WriteLine ("Delete..."); u1.Delete(); Console.WriteLine (User.FindById(u1.Id) == null ? "{null}" : "{not null}"); Console.WriteLine (); } }}
运行结果:
Create....{ Id = 1, Name = tom, Age = 20 }Read....{ Id = 1, Name = tom, Age = 20 }Update....{ Id = 1, Name = jerry, Age = 11 }Delete...{null}
其实,这个结果有些超乎我的预期了,本来我还以为,也许我需要移除对于 OleDB 和 ODBC 引用的部分,并且使用 Mono 编译 DbEntry 的源程序才行,结果是,DbEntry 没有任何修改,直接使用 VS 编译的 dlls,程序就成功运行了。。。
[]
赞助商链接