博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#程序部署到Android
阅读量:5863 次
发布时间:2019-06-19

本文共 5965 字,大约阅读时间需要 19 分钟。

C#是一种优秀的编程语言,语法之优雅,代码之简洁使得众多软粉多年来对她不离不弃。 但是如何将C#程序部署到Linux, Android等平台,这当然是得依靠众所周知的Mono。

本文Demo程序比较简单,实现了通过HttpRequest 查询天气,最终效果如下:
1. 下载并安装 Xamarin
注册Xamarin账号, Role 选择 Academic(学者)即可;
运行 XamarinInstaller.exe在线安装程序,需要一个良好的网络环境,所需的安装程序体积大约 1.44G ,安装过程一路默认即可。
2.破解
网上找的破解:
解压缩后,将文件覆盖到指定位置即可。
3.开发
开发Mono Android程序可以使用Xamarin Studio,也可以使用Visual Studio,建议使用VS,因为Xamarin对 VS提供有强大的插件 再配合VS本身强大的功能,会使开发工作如鱼得水,另外Xamarin Studio目前还不够完善,比如添加引用 之后,需要重 启。 
a.创建 Android项目 ,如下图:
b.项目文件结构,如下图:
c.页面文件

XML/HTML code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?
xml 
version
=
"1.0" 
encoding
=
"utf-8"
?>
<
LinearLayout 
xmlns:android
=
"http://schemas.android.com/apk/res/android"
    
android:orientation
=
"vertical"
    
android:layout_width
=
"fill_parent"
    
android:layout_height
=
"fill_parent"
>
    
<
LinearLayout
        
android:orientation
=
"horizontal"
        
android:layout_width
=
"fill_parent"
        
android:layout_height
=
"wrap_content"
        
android:id
=
"@+id/linearLayout1"
        
android:layout_marginBottom
=
"5dip"
        
android:layout_marginLeft
=
"5dip"
        
android:layout_marginRight
=
"5dip"
        
android:layout_marginTop
=
"5dip"
>
        
<
TextView
            
android:id
=
"@+id/LblCity"
            
android:text
=
"@string/PressCity"
            
android:layout_width
=
"fill_parent"
            
android:layout_height
=
"wrap_content"
            
android:layout_weight
=
"1" 
/>
        
<
EditText
            
android:id
=
"@+id/TxtWeather"
            
android:layout_width
=
"fill_parent"
            
android:layout_height
=
"wrap_content"
            
android:layout_weight
=
"1"
            
android:lines
=
"1" 
/>
    
</
LinearLayout
>

    我们可以看出,所有的控件均放在LinearLayout中,这是一个部局控件,LinearLayout又分为水平布局和垂直布局,比如一行中需要放置多个控件,这时候就需要用到水平布局。
d. cs文件
    我们所熟悉的C#,将在这里大展拳脚,一切看上去都是那么亲切。

C# code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
using 
System;
 
using 
Android.App;
using 
Android.Content;
using 
Android.Runtime;
using 
Android.Views;
using 
Android.Widget;
using 
Android.OS;
using 
System.IO;
 
 
namespace 
AndroidHelloWorld
{
    
[Activity(Label = 
"EasyWeather"
, MainLauncher = 
true
, Icon = 
"@drawable/icon"
)]
    
public 
class 
Activity1 : Activity
    
{
        
protected 
override 
void 
OnCreate(Bundle bundle)
        
{
            
base
.OnCreate(bundle);
 
            
// Set our view from the "main" layout resource
            
SetContentView(Resource.Layout.Main);
 
            
// Get our button from the layout resource,
            
// and attach an event to it
            
Button button = FindViewById<Button>(Resource.Id.MyButton);
            
EditText txtWeather = FindViewById<EditText>(Resource.Id.TxtWeather);
             
            
// 天气查询结果
            
TextView lblCity = FindViewById<TextView>(Resource.Id.LblCityRst);                  
// 城市 
            
TextView lblCurTmp = FindViewById<TextView>(Resource.Id.LabCurTempRst);             
// 当前温度  
            
TextView lblWeather = FindViewById<TextView>(Resource.Id.LabWeatherRst);            
// 天气
            
TextView lblRange = FindViewById<TextView>(Resource.Id.LabRangeRst);                
// 范围
            
TextView lblUptTime = FindViewById<TextView>(Resource.Id.LabUptTimeRst);            
// 更新时间
 
 
            
button.Click += (sender, e) => {
                
HttpHelper helper = 
new 
HttpHelper();
 
                
string 
sUrl = String.Format(
@"http://cgi.appx.qq.com/cgi/qqweb/weather/wth/weather.do?
                                            
retype=1&city={0}&t={1}"
                                            
Uri.EscapeDataString(txtWeather.Text), 
                                            
DateTime.Now.ToFileTime().ToString());
 
                
try
                
{
                    
var v = helper.HttpGetRequest(sUrl, 
null
, 10000, 
null
);
                    
var rst = 
new 
StreamReader(v.GetResponseStream(), System.Text.Encoding.GetEncoding(v.CharacterSet));
 
 
                    
var vWeather = Newtonsoft.Json.JsonConvert.DeserializeObject<EtWeather>(rst.ReadToEnd());
                    
//var vWeather = jss.Deserialize<EtWeather>(rst.ReadToEnd());
 
                    
lblCity.Text = vWeather.city;
                    
lblCurTmp.Text = vWeather.now_temperature;
                    
lblWeather.Text = vWeather.now_pic_name;
                    
lblRange.Text = vWeather.temperature_range;
                    
lblUptTime.Text = vWeather.update_time;
                
}
                
catch 
(Exception Err)
                
{
                    
var builder = 
new 
AlertDialog.Builder(
this
);
                    
builder.SetMessage(Err.Message);
                    
builder.SetCancelable(
false
);
                    
builder.SetPositiveButton(
"OK"
delegate 
{ });
                    
var dialog = builder.Create();
                    
dialog.Show();
 
                
}
                 
            
};
        
}
    
}
}

    需要注意的是,我们怎样使用前台页面所定义的控件?目前我知道的这种方法,比较繁琐,不知道是否还有更直接一点的方式:

C# code
1
TextView lblCity = FindViewById<TextView>(Resource.Id.LblCityRst);

   

    然后编写HttpHelper类:

C# code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public 
class 
HttpHelper
{
private 
readonly 
string 
DefaultUserAgent = 
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
;
 
public 
HttpWebResponse HttpGetRequest(
string 
url, 
string 
referer, 
int
? timeout, CookieCollection cookies)
{
    
HttpWebRequest request = 
null
;  
 
    
if 
(url.StartsWith(
"https"
, StringComparison.OrdinalIgnoreCase))
    
{
        
ServicePointManager.ServerCertificateValidationCallback = 
new 
RemoteCertificateValidationCallback(CheckValidationResult);
        
request = WebRequest.Create(url) 
as 
HttpWebRequest;
        
request.ProtocolVersion = HttpVersion.Version10;
    
}
    
else
        
request = WebRequest.Create(url) 
as 
HttpWebRequest;
 
    
request.Method = 
"GET"
;
    
request.ContentType = 
"application/x-www-form-urlencoded"
;
    
request.UserAgent = DefaultUserAgent;
    
request.CookieContainer = 
new 
System.Net.CookieContainer();
 
    
if 
(!
string
.IsNullOrEmpty(referer))
        
request.Referer = referer;
 
    
if 
(timeout.HasValue)
        
request.Timeout = timeout.Value;
    
else
        
request.Timeout = 25000;
 
    
if 
(cookies != 
null
)
    
{
        
request.CookieContainer = 
new 
CookieContainer();
        
request.CookieContainer.Add(cookies);
    
}
 
    
return 
request.GetResponse() 
as 
HttpWebResponse;  
}
 
private  
bool 
CheckValidationResult(
object 
sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
    
return 
true
;
}

    接下来就是如何将Web Api返回的Json还原为对象,这里需要用到 Newtonsoft.Json,添加引用的方法如下:  1,右击解 决方案中的Components文件夹,选择view datails, 2.找到 jons.Net ,3.点击 Add to Projct(需要账 号验证,使用注册的学者账号即可)。
d. 调试及部署
    按F5运行, 第一次需要创建一个Android模拟器,这里只需要稍微注意一下你所选择Android系统版本,推荐使用2.2, 因为Mono For Android项目默认情况下使用的是2.2 的API。 
    Mono框架没有JIT(个人对这个没有研究,可能表达得不准确,欢迎拍砖),因此在断点调试的时候你会发现与平时调试C#略有不同,无法拖动断点,无法修改代码。
    关于部署,必须使用Release进行编译,将并生成的APK文件传到手机安装后即可运行,UI与速度与Java开发的应用无差。
Mono for Android, Android开发我是新手中的新手,向大家学习,让C# running anywhere.

转载地址:http://iaunx.baihongyu.com/

你可能感兴趣的文章
spring boot打war包发布
查看>>
linux 平台core dump文件生成
查看>>
写在开园时
查看>>
sql处理百万级以上的数据提高查询速度的方法
查看>>
面向对象
查看>>
数据结构-字典
查看>>
Centos下MongoDB数据库的安装以及配置开机自启动(三)
查看>>
二进制基础&JAVA I/O输入输出流
查看>>
elasticsearch系列(四)部署
查看>>
Hacker(13)----搜集目标计算机的重要信息
查看>>
linux查看防火墙状态及开启关闭命令
查看>>
收纳集
查看>>
mybatis 一二事(1) - 简单介绍
查看>>
之前做过的一些笔记整理
查看>>
C#面向对象设计模式纵横谈——1.面向对象设计模式与原则
查看>>
序列---列表 list 的操作
查看>>
redis密码设置、访问权限控制等安全设置 - chuquan.ou - 博客园 http://www.cnblogs.com/langtianya/p/5189234.html...
查看>>
event 事件 自定义滚动条 控制文字滚动
查看>>
【例题收藏】◇例题·I◇ Snuke's Subway Trip
查看>>
自定义SearchView实现即时查询
查看>>