① mono开发安卓的人多吗
Mono for
Android开发调研笔记
安装完Mono for Android(简称:MonoDroid)之后,可以用MonoDevelop或Visual Studio来开发Mono for
Android应用程序;目前只能在模拟器上调试和部署,必须购买后才能在真机上调试和部署;目前遇到的最大的问题是:模拟器上调试速度非常慢,通过单步调试每一行代码都需要几秒钟。有人开了个帖子抱怨以及一些回复的相关讨论:http://mono-for-android.1047100.n5.nabble.com/Free-version-Emulator-only-Bye-bye-td5091443.html,另外,如果购买了正式版,那支持直接用设备来调试的相关文章介绍:http://docs.xamarin.com/android/tutorials/debug_on_device
MonoDroid应用程序,应该说所有的Android应用程序只要在处理5秒后还未完成,则会自动提示用户“应用程序无响应,是否结束应用”类似这样的提示信息。所以我们一般在处理一些可能比较耗时的操作时,比如与服务器进行通信请求数据或Post数据。这里操作都需要通过异步的方式来完成;
MonoDroid提供的API与原生Java平台下的Android开发基本一致,类的名称以及方法名称都保持一致,这样只要会开发原生的Android应用,那在MonoDroid下也可以开发;
虽然说MonoTouch,
MonoDroid可以允许我们用C#来开发在IOS以及Android应用,但是并不是所有的代码都只要用c#写一次就可以在这两个平台上跑了。实际上,能重用的代码也许只有业务层的代码。因为UI的实现,两种平台不同,MonoDroid下依赖于Mono.Android来实现UI,而MonoTouch下则是用另外一套不同的UI实现方式。实际上Mono更多的是考虑了与原生API一致的方式来开发UI,所以设计了两套不同的类库来实现UI架构;所以UI层的代码无法重用;另外,数据访问层,也不能共用,因为虽然都是访问sqlite,但是Mono在这两个平台上分别对应实现的API不同,MonoTouch下使用:MonoTouch.CoreData,而MonoDroid下使用Mono.Data.Sqlite。当然我们还是可以将数据访问层进行抽象,比如抽象成IRepository,然后业务层调用IRepository的接口即可,IRepository的具体实现需要基于不同平台分别实现;
之前可以在Windows上跑的Castle框架在MonoDroid上不再支持,编译会遇到错误,因为Castle程序集依赖于System.Configuration这个程序集,但是在MonoDroid平台上没有这个程序集;MomoDroid平台上支持的.Net程序集有限,见下面的介绍。基于这个原因,但是又希望能像以前那样使用某个IOC框架,所以找了一个跨各种手机平台的轻量级开源Ioc框架(TinyIoC),该框架非常小,只有一个cs文件就能使用,使用后感觉效果还不错,基本容器功能都支持了。git开源项目地址:https://github.com/grumpydev/TinyIoC
log4net在MonoDroid上也不支持,因为:Log4Net uses classes in .Net namespaces such as
System.Web, and System.Diagnostics that are not yet implemented in Mono for
Android. 不过幸好,Android平台自带了一个Log记录器,在MonoDroid下可以使用Android.Util.Log来记录日志。如果是用Visual
Studio来开发,则可以直接在VS的Output窗口看到日志,另外VS还有一个专门的窗口(View -> Other Windows ->
Android Device Logging)用来查看Android记录的日志。另外,也可以通过命令行的方式查看日志,定位到目录:C:\Program
Files (x86)\Android\android-sdk\platform-tools,执行命令:adb
logcat,详细方法可以参考:http://docs.xamarin.com/android/advanced_topics/android_debug_log
MonoDroid的数据库是用sqlite,目前内置支持两种数据访问方式:原生方式(游标的方式)以及ADO.NET类似的接口,使用起来ADO.NET的方式非常简单,我们只需要引用:Mono.Data.SQLite这个程序集就能像ADO.NET那样来访问sqlite数据库了。
游标方式举例:
//查询数据
ICursor cursor = this.db.Query(DatabaseTable, new[] { KeyRowId, KeyTitle, KeyBody }, null, null, null, null, null);
//新增数据
var initialValues = new ContentValues();
initialValues.Put(KeyTitle, title);
initialValues.Put(KeyBody, body);
this.db.Insert(DatabaseTable, null, initialValues);
//更新数据
var args = new ContentValues();
args.Put(KeyTitle, title);
args.Put(KeyBody, body);
this.db.Update(DatabaseTable, args, KeyRowId + "=" + rowId, null);
//删除数据
this.db.Delete(DatabaseTable, KeyRowId + "=" + rowId, null);
//事务支持
this.db.BeginTransaction(); //Start a transaction.
try {
var result = func(); //Do update db operations.
db.SetTransactionSuccessful(); //tell db the update operations successfully.
return result;
} catch {
//Error in between database transaction
}finally {
//commit the transaction.
//if the setTransactionSuccessful method have not been called, then the transaction will auto rollback.
db.EndTransaction();
}
ADO.NET方式举例,(需要引用:Mono.Data.Sqlite)
//查询数据
public static IEnumerable<Note> GetAllNotes()
{
var sql = "SELECT * FROM ITEMS;";
using (var conn = GetConnection())
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
yield return new Note(reader.GetInt32(0), reader.GetString(1), reader.GetDateTime(2));
}
}
}
}
//新增和更新数据
public static void SaveNote(Note note)
{
using (var conn = GetConnection())
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
if (note.Id < 0)
{
// Do an insert
cmd.CommandText = "INSERT INTO ITEMS (Body, Modified) VALUES (@Body, @Modified); SELECT last_insert_rowid();";
cmd.Parameters.AddWithValue("@Body", note.Body);
cmd.Parameters.AddWithValue("@Modified", DateTime.Now);
note.Id = (long)cmd.ExecuteScalar();
}
else
{
// Do an update
cmd.CommandText = "UPDATE ITEMS SET Body = @Body, Modified = @Modified WHERE Id = @Id";
cmd.Parameters.AddWithValue("@Id", note.Id);
cmd.Parameters.AddWithValue("@Body", note.Body);
cmd.Parameters.AddWithValue("@Modified", DateTime.Now);
cmd.ExecuteNonQuery();
}
}
}
}
//删除数据
public static void DeleteNote(Note note)
{
var sql = string.Format("DELETE FROM ITEMS WHERE Id = {0};", note.Id);
using (var conn = GetConnection())
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
}
}
}
//事务支持
using (var conn = GetConnection ()) {
conn.Open ();
var transaction = conn.BeginTransaction();
try
{
//Do db operations.
transaction.Commit();
}
catch
{
transaction.Rollback();
}
}
ORM,NHibernate不能运行在Mono for
Android上,不过手机应用的业务逻辑相对简单,ORM的需求优先级应该不是很急,暂时可以通过上面的数据访问方式来访问sqlite数据库。
类库方面,目前支持的.net类库有限,主要有以下几个:
1 mscorlib
2 System 包含System.Net命名空间,支持HttpWebRequest, HttpWebResponse,这两个类可以实现与服务器端通信
3 System.Core 包含IO, LINQ, Collections,etc
4 System.Data 该类库实现了ADO.NET的相关基础架构,如DataReader, DataAdapter, Connection, Command, etc.
5 System.Data.Services.Client
6 System.EnterpriseServices
7 System.Json 提供了简单的JSON序列化和反序列化支持
8 System.Numberics
9 System.Runtime.Serialization
10 System.ServiceModel
11 System.ServiceModel.Web
12 System.Transactions 提供事务支持,包括分布式事务
13 System.Web.Services
14 System.Xml
15 System.Xml.Linq
16 Microsoft.CSharp
17 //以下几个是Android开发需要的类库
18 Mono.Android MonoDroid核心类库,该类库中提供的API与原生的JAVA API基本一致,所以使用起来很方便;
19 Mono.Android.Export
20 Mono.Android.GoogleMaps
21 Mono.Android.Support.v4
22 Mono.CompilerServices.SymbolWriter
23 Mono.CSharp
24 Mono.Data.SQLite 提供封装了Sqlite数据库的ADO.NET接口支持
25 Mono.Data.Tds
26 Mono.Security
与服务器通信,可以像平时一样通过HttpWebRequest或WebClient来发送请求。以下代码设计了一个通用的通过异步的方式发送HttpWebRequest
/// <summary>
/// 异步发送HttpWebRequest
/// </summary>
/// <param name="cookie"></param>
/// <param name="url"></param>
/// <param name="postData"></param>
/// <param name="callback"></param>
public static void SendHttpPostRequest(Cookie cookie, string url, string postData, Action<HttpWebResponse> callback)
{
//解决https下的证书问题
HttpRequestCredentialHelper.();
var request = HttpWebRequest.Create(url) as HttpWebRequest;
//设置请求类型为POST
request.Method = "POST";
//设置Post的数据
if (!string.IsNullOrEmpty(postData))
{
request.ContentLength = postData.Length;
request.ContentType = "application/x-www-form-urlencoded";
using (var writer = new StreamWriter(request.GetRequestStream()))
{
writer.Write(postData);
writer.Close();
}
}
//将Cookie放入请求,以让服务器知道当前用户的身份
var container = new CookieContainer();
request.CookieContainer = container;
if (cookie != null)
{
container.SetCookies(new Uri(Constants.ROOT_URL), string.Format("{0}={1}", cookie.Name, cookie.Value));
var logger = DependencyResolver.Resolve<ILoggerFactory>().Create(typeof(HttpWebRequestHelper));
logger.InfoFormat("HttpWebRequest CookieName:{0}, Value:{1}", cookie.Name, cookie.Value);
}
//异步发送请求
request.BeginGetResponse(new AsyncCallback(asyncResult =>
{
var httpRequest = asyncResult.AsyncState as HttpWebRequest;
using (var response = httpRequest.EndGetResponse(asyncResult) as HttpWebResponse)
{
callback(response);
}
}), request);
}
发送请求示例代码:
HttpWebRequestHelper.SendHttpPostRequest(null, url, postData,
response =>
{
var response = HttpWebRequestHelper.GetTextFromResponse(response);
//这里处理HttpWebResponse
//如果要反问UI相关元素,则需要封装为一个委托然后在RunOnUiThread方法内执行
RunOnUiThread(() =>
{
var folders = _taskFolderService.GetAllTaskFolders();
_listView.Adapter = new TaskFolderAdapter(this, Resource.Layout.TaskFolderListItem, folders.ToArray());
});
});
分层架构,我觉得我们可以采用以下的分层架构:
UI 界面层,MonoTouch,MonoDroid分别实现
Model
模型层,实现核心业务逻辑,代码可重用,如果采用DDD领域模型来实现,则可以包括:Service,Aggregate,Entity,VO,IRepository
Model.Infrastructure
基础框架层,实现公共基础代码,供上层调用,如DI,log,configuration,httprequest, constants, etc
Model.Repositories 仓储实现层,对Model层的IRepository接口的实现,不同平台采用不同实现
② Xamarin.Android(或者Android Studio)用的数据库是Microsoft Access还是SQLite的
安卓一直用的是sqlite
③ xamarin.forms怎么实现checkbox
protected void Page_Load(object sender, EventArgs e)
{
CheckBox chk = new CheckBox();
chk.Text = "testall"; // 这里可以换成数据库的内容
chk.CheckedChanged += new EventHandler(chk_CheckedChanged);
chk.AutoPostBack = true;
Page.Form.Controls.Add(chk);
for (int i = 0; i < 10; i++)
{
CheckBox chk2 = new CheckBox();
chk2.Text = "test" + i.ToString(); // 这里可以换成数据库的内容
chk2.Checked = (i % 3 == 0); // 这里可以换成数据库的内容
Page.Form.Controls.Add(chk2);
}
}
void chk_CheckedChanged(object sender, EventArgs e)
{
CheckBox all = sender as CheckBox;
foreach(Control ctl in Page.Form.Controls)
{
if (ctl is CheckBox)
{
CheckBox chk = ctl as CheckBox;
chk.Checked = all.Checked;
}
}
}
④ C# Xamarin 如何将json 转换 dt
对于处理json数据,建议你使用Newton.Json类库
⑤ android开发转什么比较好转
精彩问答
@酱哥哥:目前国内,NET
在winform架构和webform架构的面向企业级单位以及银行还占有一定的市场份额。纵观互联网和移动端相对就比较荒凉一点了。仅仅是几个知名的互
联网企业是不行的。无论在web开发还是在移动都没有明显优势。无论.NET语言升级到什么地步,要崛起目前看来只能依靠win系统的发展。但是随
着.NET逐渐开源以及跨平台的支持,目前互联网圈内对.NET叫好声一片。由此可见.NET前途任然光明。坚持.NET的同时,也不要放弃学习其他语言
的机会。
@洛阳码农:.net平台包含很多技术,你认为.net必学的技术有哪些?怎么从菜鸟成为.net大牛?
@酱哥哥:从菜鸟变成大牛的老梗建议就是:实事求是,一步一个脚印。
首先明确自己选择选择技术方向,web方向、移动app方向、winform客户端方向。
1、.net 平台使用的主流语言就是C#,所以必须学习C#的基本语法
2、基于.net 平台的web方向目前有传统webfrom和mvc两个架构各有优缺点,这两个是必须学习的。
基于.net平台的winform
客户端平台的有传统winform架构和wpf架构的各有优缺点,这两个企业用的也较多所以都需要学习。(本人做web方向的,所以对这两个平台了解甚少,winform的较熟悉,wpf没研究过,你根据自己的方向选择学习)
3、移动app 非必学。
4、ADO.NET 数据访问架构,这个无论哪个方向都要学习,不解释。
5、如果选择web开发,那么http协议的基本原理(最基本的post和get数据传递方式)、html、js、jqeury(框架这个必学不解释了)、css。
6、至于其他的新技术还是新框架,根据自己的需求选择性学习,因为人的精力有限。有些东西哪怕是多么牛B,相对于个人而言做到稍微了解一下即可。
@IT周见智:1)基础先学扎实,C#(或其他.NET语言)基础(比如语法、数据类型、事件委托、对象生命期、lambda等),这是前提
2)着重研究一个方向,web开发,桌面软件开发,或者APP?这是专一 3)剩下来的就是积累经验,平时多总结多谢博客,多学习充电吧。
我觉得学习哪个技术都可以按照这样
@超级奶爸老谭:.NET的大环境下,开源资源比JAVA少得多,这方面令人堪忧啊,特别是现在移动平台的崛起,转移到Android与iOS平台的人越来越多,最近两年公司招聘中,收到.NET相关的简历越来越少。
@IT周见智:前两年好像是这样的。希望接下来情况有所好转 :)
@leoxu:你好,我是外行,请问现在.NET最常见也是在WEB开发领域吗?
@钛元素:我来回答:.net在bs和cs方面都有广泛应用,在嵌入式开发方面也有一定的应用。总之,开始学,现在就开始吧。
@IT周见智:并非只有web方面的 桌面软件也比较多 像1楼说的嵌入式也有 并且随着.NET开源跨平台的流行后 移动开发这块想必也会增加
@钛元素:您好!我想问下IL方面,是否有必要去学,现在已经可以开发bs和cs的系统了,进一步深入是去了解mac和一些开源框架,或者是控件开发,涉及到.net底层的内容,对开发有什么帮助吗?
@IT周见智:当然有必要 这就像学习一门新的语言时 入门完成后 必然要想法子进阶提升 :) 了解底层开发是有用处的
@ViperWhip:Hi,请问如果做Windows 桌面应用,应不应该从传统的winform转向用wpf?
@假正经哥哥:我的建议是别! winform 功能完全可以覆盖wpf糟糕的体验
@Force武装卫队:WPF使用XAML作为界面描述语言,界面与功能分离做的很好
@IT周见智:这个吧 要看什么项目 最终用户是谁 使用场合是什么 这俩适合不同的情况
@noonoo:尽快转移到wpf呀,这是最先进的编程。 学习wpf能顺便吧win8.10的应用一起搞定。
@天下雨天:WPF也在进步。WPF的XAML语言易懂,另外还有一些数据绑定,依赖属性,MVVM等概念,都是比较好的方面,UI模板也可以自己修改,另外还容易定制主题。相比之下winform的开发模式就比较丑陋了,WPF是趋势。
@吴胤琦:您好web开发。.net在未来的跨平台方面会更方便好用吗?据目前的资料来看都是基于mono的方式.
@IT周见智:个人感觉是的 .NET跨平台这块似乎越来越明朗了 目前使用较多的是 http://www.jexus.org/
@SethFeng:SaaS平台,.Net是个好选择嘛?
@IT周见智:虽然使用Java的多一些 但是周期可能要长一些 开发效率等偏低 可以尝试.NET 两个各有优劣吧
@Rwing:你好,请问是否有关注vnext(asp.net 5),你觉得等它出来后会对各大公司的技术选用有很大改变吗?
@酱哥哥:我来回答,是的目前mono对.NET的支持没有做到100%。下个版本VNEXT可以完全支持了。就圈子里面现在用mono+jexus非常的好用。
@南湖船老大:WIN平台一直喜新厌旧,投靠.NET平台对技术投资有保障吗?
@IT周见智:这个问题 网上很多回答哟 :) 我个人没有这种担忧 学好了 哪怕哪天ms倒了 转其它技术也很轻松
@酱哥哥:我来回答下,并非喜新厌旧,而是.NET顺应时代的潮流,一改之前固执己见的思想,就目前.NET的发展形势来看有很大的前景,现在是.NET最光明时代的开始。
@_Elvis:F#会不会成为.net的主力语言?
@IT周见智:就目前来讲 短期内应该不会 其实新版C#现在也越来越支持“函数式”风格编程 我感觉像这样混合式编程风格会成为主流吧
@王洪旭:我在招聘会上,看到的开发岗位,基本都是.net web开发。web开发是潮流吗
@IT周见智:是吧。像桌面软件 嵌入式之类的也是有的,我本人带的项目就是主要从事后者相关开发的。
@宜宾阿布:一直在做.net
web开发,最近都已经想换平台了。想问下1、vnext的前景如何;2、不考虑跨平台的问题,winform做gui,目前是否符合中国最普通网民的需求?
@IT周见智:关于第一个问题,可以看见张善友老师的博客,他比较关注.NET跨平台的问题
http://www.cnblogs.com/shanyou/p/3764070.html,也可以关注他的微信公众号。 第二个 符合
@王涛:据我所知,wpf中很多winform的功能都没有,例如,MDI窗体,SplitContainer等等,为什么还要说wpf做桌面应用比winform做桌面应用有优势,优势又在哪里体现
@IT周见智:不能说谁比谁更有优势 两者重点不一样 你有觉得wpf做出来的界面会更美观吗 :)
@吉良吉影:你好,我想问一下,现在WPF还有必要吗,我项目里正在用,但我总感觉没什么前途
@IT周见智:有需求 还是有必要的 :)
@Booklearn:据说.Net可以开发ios和安卓应用,请问.Net这方面的优势明显吗??
@IT周见智:自从微软宣布.NET开源跨平台后 确实有这样的新闻不断传出 据我所知 微软确实在和mono团队合作 致力于开发跨平台app的实现
相信情况会越来越好
@Force武装卫队:.NET早就支持ios和Android的开发了,解决方案是xamarin提供的.
@酱哥哥:不明显,目前.NET跨平台还是依靠MONO,在web 方面mono支持的相对稳定。但是在移动端还不是很好
@FlashCHen:据微软VS2015跟Win10的介绍说明,以后我大.net会一统天下,对于这点你有什么看法
是乐观态度还是觉得是噱头。再加上现在APP大趋势下 .net
开发的优势已经少了很多了。如果没有整合一套出来,花时间去学习对以后的成长空间有帮助吗
@IT周见智:这个我真不敢下定论 是不是噱头 你懂的 :) 我还是那个观点 学好当下的 基础扎实一些 万变不离其宗
@久永:现在很多企业项目开发时,对于使用EF还相当的反对,一个说差,一个说不灵活,以及对于数据库支持的问题。请问在项目规划时,如何去设计、去取舍,以便能规避EF的劣势而更多的争取能将
EF 使用到项目之中呢?
@乌龟壳:同感,比较不赞成在企业系统里用ORM,这些业务系统基本上查询都很复杂,没有一个明确的Object对表的映射,用XSD节省编辑查询到类的转换工作就好了。有时候甚至XSD只定义DataTable的结构,查询还是在外部写类实现,这样灵活性和效率都还可以。
@Yamazaki:我觉得.NET领域,因为MS得IDE、工具等太强大,集成度太高,UI化的东西太多,导致入门简单。但是深入比较难。因为入门简单,导致.NET的整体薪资被拉低了。你赞成我的看法吗?
@酱哥哥:其实有道理,但是薪资低和因为入门容易导致的可能不一定啊。因为这个和个人水平关系较
大。也是由于.NET入门容易导致较多人的水平比JAVA的要低,所以薪资低也导致整体.NET平均薪资较低。所以选择.NET的人一定要保持学习,好用
的框架和控件一定要知道实现原理才能够对个人能力有提升。
@南湖船老大:PHP入门更低,但是薪资不低。.NET入门不高,但是后续投入太大,整体成本还是很高的。
@IT周见智:.NET职位平均薪资低 确实有一部分该方面的原因 但是也不乏薪资高的 我也见过很多薪水比较高的做.NET方面的
@mocou:大学时编程是从.Net入门的,OSC上难得有关于它的讨论,我想问周先生现在.Net在国内大型互联网公司里的应用多吗?.Net的工作是不是只能在非互联网公司找到?
@IT周见智:有 你上网上可以搜出很多互联网公司使用.NET技术 有很多并不是纯粹地使用单一的技术
@酱哥哥:据了解,国内知名的目前有携程、当当、新蛋、京东(现在改java+.net)、CSDN、博客园。
@橙色卡尔:您好,因为公司现在开始逐步弃用.NET,我现在在学Java。但是自己.NET都还没有学精通,很是纠结,对.NET技术还是抱有很深的情感的,不想就
这么放弃。通过我们公司这种现象,.NET是不是真的开始走下坡路了,还是这这是一个低谷期?想知道你对.NET技术未来发展走向的看法。
@songzu:我作为旁观者回答你。他们都是.net的忠实粉丝,自然希望扩大其阵营。
对职业生涯而言,转JAVA是毫无疑问的正确选择。
全球前一百名的网站,只有极少数是用C#实现的。纯前端领域更偏爱PHP,而涉及到重量级开发通常是Java作主力(都是APACHE的功劳)。C#对WEB的友好程度远不及PHP,作为编译行语言,其资料以及开源参与度远不及JAVA。
C#的语言确实简练。然而其开源的步骤来的太迟了。至少应该在wp7上市的时候就应该铺路的。再者WP的步子迈太大了。扯到用户的蛋了。目前的情况下,他
们会把metro界面走到黑,那破烂毛线权限管理机制也要坚持到破产为止,有指望WP起来是没戏了。移动平台未来的霸主毫无疑问是ANDROID的。而大
型企业的系统,应该是java的,中大型企业的市场是PHP的,小型企业的领域是PYTHON/RUBY/.net等语言的。如果你在二线以下城
市,.NET的市场还是有的。大多数政府机构的网站都是那些只会.net的高校教师搞的单子。
@假正经哥哥:现在看来,.NET还是 大有前途。 但是从业不必拘泥于语言 ,要有良好的编程思想,用什么语言都是可以的,任何一种语言
学到精通都有广阔的天空。
@水母干:你好,想请教一下,单纯用.net做桌面应用的话,需要点微软系的哪些技能?
.net做桌面应用,有什么比较好的轮子,这些轮子跟QT对比有什么优劣?
@IT周见智:.NET系的 winform wpf 可以用
@Minho:.NET做包并发电商平台,能hold住不?我们公司已经转向java了!
@假正经哥哥:不是hold不住的问题,还是缺少行业经验 ,有这方面经验的人少,技术上完全没问题
@ly_bing:做了3年,发现里面东西里面东西太多、太深,在这个信息大爆炸的时代,.net 搞大数据和物联网方面该怎么走?
@IT周见智:微软有自己的云计算平台(azure) 至于物联网 我之前网上认识一个在宁波做跟物联网相关的 .NET开发 这方面具体我没接触过
⑥ freesql表是否存在
存在。
FreeSql是一个功能强大的对象关系映射程序(O/RM),支持NetFramework4.0+、NetCore2.1+、Xamarin等支持NetStandard所有运行平台。
FreeSQL是一个数据库管理和查询工具,采用C#开发,支持MicrosoftAccess,MicrosoftSqlServer,Oracle,MySql和PostgreSql等数据库。