一步一步将你的C#程序部署到Android.......

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

本文Demo程序比较简单,实现了通过HttpRequest 查询天气,最终效果如下:



1. 下载并安装 Xamarin
http://xamarin.com/download
注册Xamarin账号, Role 选择 Academic(学者)即可;
运行 XamarinInstaller.exe在线安装程序,需要一个良好的网络环境,所需的安装程序体积大约 1.44G ,安装过程一路默认即可。

2.破解
网上找的破解:http://download.csdn.net/detail/flydoos/5820325
解压缩后,将文件覆盖到指定位置即可。

3.开发
开发Mono Android程序可以使用Xamarin Studio,也可以使用Visual Studio,建议使用VS,因为Xamarin对VS提供有强大的插件 再配合VS本身强大的功能,会使开发工作如鱼得水,另外Xamarin Studio目前还不够完善,比如添加引用 之后,需要重启。

a.创建 Android项目 ,如下图:


b.项目文件结构,如下图:


c.页面文件

<?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#,将在这里大展拳脚,一切看上去都是那么亲切。

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();

}

};
}
}
}

需要注意的是,我们怎样使用前台页面所定义的控件?目前我知道的这种方法,比较繁琐,不知道是否还有更直接一点的方式:
TextView lblCity = FindViewById<TextView>(Resource.Id.LblCityRst);


然后编写HttpHelper类:

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.
...全文
64524 321 打赏 收藏 转发到动态 举报
写回复
用AI写文章
321 条回复
切换为时间正序
请发表友善的回复…
发表回复
恠娃-_- 2016-02-23
  • 打赏
  • 举报
回复
感谢分享,楼主辛苦
u010195703 2016-02-22
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
楼主有几个问题需要请教一下:
1、Vs2010不支持这个的调试吧,我使用的是真机,不是模拟器;
2、怎么老提示我未连接网络,wifi和4G手机网络我都试了,所以一直都查不出天气来,2G网络也不得行,是不是手机的问题,未连接4G如下:
未连接wifi如下:

但是我的网络正常的啊,请教谢谢。
sinat_21289405 2014-09-26
  • 打赏
  • 举报
回复
网速真心好慢
alanchan_ch 2014-08-14
  • 打赏
  • 举报
回复
jifen 积分积分啊 啊啊啊 啊
alanchan_ch 2014-08-14
  • 打赏
  • 举报
回复
今天下载下来试试。没用过
kingredapple 2014-05-27
  • 打赏
  • 举报
回复
Mark先标记一下,有时间试试
zapdos 2014-05-27
  • 打赏
  • 举报
回复
引用 229 楼 hyblusea 的回复:
[quote=引用 228 楼 Tom_and_Jerry_zhao 的回复:] 说Java山寨C#?还不是不要带太强烈的个人主义!这样只会显得自己的水平很次。连起码的语言发展史都没了解。另外建议楼猪要是真的C#牛B,就勇敢的做出牛B的东西出来晒晒。效率要靠数据说话。否则好意西出来大谈语言优劣逞口舌之快。 PS:C++路过
玩C++的, 好了不起, 但是你可知计算机专业, C或C++是每个大学生必修课,每个人都是从C++走过来的。那么为什么有了C, C++还为什么会继续出现 Java, C#?自己Google其中的必然性。 很多人喜欢拿性能说事,也可以自己Google一下, C++ 与C#在各个方面的性能比较,凡事没有绝对。 另外我确实不才,没什么拿得出手的东西可以炫耀的, 只是分享一些有趣的,玩好的东西。 我就觉得Java已经落后C#了, 事实就是如此啊, 哪天 Java在语法上超越C#了, 我相信C#也会去学习Java,就是这样一个循环的过程。有不同观点可以绕道。[/quote] 说来说去不就是个语法合你口味而已,JAVA在各种领域上的表现足以让.NET望尘莫及 不单是移动系统,分布式计算方面JAVA也已甩开.NET好几条街了 语法这种东西要抄还不简单,但是在实际应用方面.NET永远也赶不上
引用 141 楼 hyblusea 的回复:
[quote=引用 140 楼 jiuchongtiann 的回复:] 很不错,没想到C#还可以这样。其实想起来原理也很简单,编写C#程序后,在发布的时候根据不同的目标平台生成不同的代码即可,没想到真的做到了。
微软设计 C#的初衷就是如此...[/quote] 这不也是抄JAVA的吗
叶黑 2014-05-27
  • 打赏
  • 举报
回复
lj_a_b 2014-05-12
  • 打赏
  • 举报
回复
有时间学学。。。
修仙之人 2014-05-09
  • 打赏
  • 举报
回复
开发模式完全跟andriod的一模一样嘛,只是用了C#的语法,但是这个过程中,并不是C#代码直接编译后andriod就能运行,其中是把C#代码编译成和JAVA一样的代码然后在打包成APK文件,其中C#转android就是MONO干的事.
灵影葬 2014-05-03
  • 打赏
  • 举报
回复
怎么使用release编译,然后部署到手机啊?
caoqinghua 2014-04-29
  • 打赏
  • 举报
回复
感谢分享,希望微软收了它
多啦A孟 2014-04-29
  • 打赏
  • 举报
回复
学习,刘明,谢谢
XXSingle 2014-04-29
  • 打赏
  • 举报
回复
先收藏了啊,以后用
紫色蚂蚁 2014-04-29
  • 打赏
  • 举报
回复
好东西 ,值得收藏和顶起来。
lvsezhufu 2014-04-29
  • 打赏
  • 举报
回复
学习~~~~~~~~~~~~~~~~~~~
SomethingJack 2014-04-28
  • 打赏
  • 举报
回复
引用 楼主 hyblusea 的回复:
C#是一种优秀的编程语言,语法之优雅,代码之简洁使得众多软粉多年来对她不离不弃。 但是如何将C#程序部署到Linux, Android等平台,这当然是得依靠众所周知的Mono。 本文Demo程序比较简单,实现了通过HttpRequest 查询天气,最终效果如下: 1. 下载并安装 Xamarin http://xamarin.com/download 注册Xamarin账号, Role 选择 Academic(学者)即可; 运行 XamarinInstaller.exe在线安装程序,需要一个良好的网络环境,所需的安装程序体积大约 1.44G ,安装过程一路默认即可。 2.破解 网上找的破解:http://download.csdn.net/detail/flydoos/5820325 解压缩后,将文件覆盖到指定位置即可。 3.开发 开发Mono Android程序可以使用Xamarin Studio,也可以使用Visual Studio,建议使用VS,因为Xamarin对VS提供有强大的插件 再配合VS本身强大的功能,会使开发工作如鱼得水,另外Xamarin Studio目前还不够完善,比如添加引用 之后,需要重启。 a.创建 Android项目 ,如下图: b.项目文件结构,如下图: c.页面文件

<?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#,将在这里大展拳脚,一切看上去都是那么亲切。

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();

                }
				
			};
		}
	}
}
需要注意的是,我们怎样使用前台页面所定义的控件?目前我知道的这种方法,比较繁琐,不知道是否还有更直接一点的方式:
TextView lblCity = FindViewById<TextView>(Resource.Id.LblCityRst);
然后编写HttpHelper类:

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.
这个东西最后生存的也是apk文件?还是?
arSavior 2014-04-28
  • 打赏
  • 举报
回复
过来学习下,楼主辛苦了
苦逼de小Coder 2014-04-28
  • 打赏
  • 举报
回复
mark 收藏一下
加载更多回复(301)
基于简化的微服务架构和Docker容器的Microsoft由Microsoft提供的示例.NET Core参考应用程序。   免责声明 重要说明:此示例应用程序的当前状态是ALPHA,认为这是版本0.1版本的基础,因此,很多方面还有待改进和改变显著而重构当前的代码和实现新的功能。对社区的改进和反馈将受到高度的赞赏和接受。 该参考应用程序提出了一个简化的面向服务的体系结构实现,通过综合应用程序引入诸如.NET Core与Docker容器之类的技术。然而,这个引用应用程序并不是要解决大型和关键任务的分布式系统中的所有问题,只是让开发人员轻松开始使用.NET Core的Docker容器和微服务器的开始。 例如,在了解Docker容器和使用.NET Core开发微服务器之后,下一步(eShopOnContainers还没有涵盖),就是选择像Docker Swarm,Kubernetes或DC / OS(Azure容器服务)或Azure中的微服务集群/协调器在大多数情况下,服务结构将需要对应用程序的配置进行额外的部分更改(尽管当前体系结构应适用于大多数具有较小更改的业务流程)。或将数据库移动到HA云服务,或者在Azure Service Bus或任何其他生产就绪的服务总线市场上实施EventBus。 在将来,我们可能会分配此项目,并针对特定的微服务集群/协调者加上多个版本,并使用额外的云基础架构。 有关可能的新实施的更多信息,请阅读Wiki中未来版本的eShopOnContainers的计划路线图和里程碑,并在ISSUES部分提供反馈,如果您希望看到任何特定的方案得到实施或改进。此外,请随时讨论任何当前的问题。 架构概述:本参考应用程序是在服务器端和客户端的跨平台两种,由于能够根据您的码头工人主机上的Linux或Windows容器运行的.NET的核心服务,并为Xamarin的Android,iOS或正在运行的移动应用Windows / UWP加上客户端网络应用程序的任何浏览器。该架构提出了一种简化的面向服务的架构实现,其中包含多个自主的微服务器(每个拥有自己的数据/ db),并使用Http作为当前的通信协议,在每个微服务器(简单的CRUD vs. DDD / CQRS模式)中实现不同的方法。 它还支持异步通信,用于基于集成事件和事件总线以及路线图中定义的其他功能的多个服务的数据更新传播。 微服务的类型不同,这意味着不同的内部架构模式取决于其目的,如下图所示。   最终将添加与其他框架和No-SQL数据库的其他miroservice样式。这是一个很好的机会,来自社区的拉动请求,例如使用Nancy的新微服务,或者甚至其他语言,如Node,Go,Python或具有MongoDB Azure DocDB兼容性的数据容器,PostgreSQL,RavenDB,Event Store,MySql等。) 数据库服务器/容器的重要说明 在该解决方案当前的开发环境配置中,SQL数据库将自动部署样本数据到单个SQL Server for Linux容器(SQL数据库的单一共享Docker容器),因此整个解决方案可以启动并运行,而无需任何依赖任何云或特定的服务器。每个数据库也可以部署为单个Docker容器,但是在开发机器中,您需要将8GB或更多的内存RAM分配给Docker才能在Docker Linux主机中运行3个SQL Server Docker容器, Docker for Windows“或”Docker for Mac“开发环境。 在将Redis缓存作为开发环境的容器运行时,定义了类似的情况。 但是,在实际的生产环境中,建议您将数据库(在本例中为SQL Server和Redis)设置为HA(高可用性)服务,如Azure SQL数据库,Redis服务或任何其他集群系统。如果要更改为生产配置,只需在HA云或内部部署服务器后更改连接字符串即可。 相关文档和指导 在开发这个参考应用,我们正在创造一个参考指南/电子书名为“构建和开发集装箱和微服务基于.NET应用程序”,其详细阐述了如何开发这种建筑风格(微服务,多克尔容器,领域驱动设计某些微服务)以及其他更简单的架构风格,如可以作为Docker容器生活的单片应用程序。 还有其他电子书专注于容器/ Docker生命周期(DevOps,CI / CD等)与Microsoft Tools,已经发布,另外还有一本关于使用Xamarin.Forms的企业应用程序模式的电子书。您可以下载它们,并在这里开始审查这些指南/电子书:   建筑与发展 集装箱生命周期和CI / CD 应用程序模式与Xamarin.Forms 下载(初稿,在进行的工作) 下载(自2016年后期第一版) 下载(初稿,在进行的工作) 发送反馈给cesardl@microsoft.com 然而,我们鼓励下载和审查“架构与开发电子书”,因为在指导中解释的架构风格和架构模式和技术在解释许多模式实现时使用此参考应用程序,因此您将更好地了解上下文,设计以及在当前架构和内部设计中采取的决策。 应用程序代码概述 在这种回购,你可以找到一个样本参考应用,将帮助您了解如何实现用微服务架构的应用.NET的核心和多克。 示例业务域或场景基于作为多容器应用实现的eShop或电子商务。每个容器都是使用.NET Core运行的ASP.NET Core开发的一个微服务部署(如basket-microservice,catalog-microservice,ordering-microservice和identity-microservice),因此可以在Linux Containers和Windows Containers 。下面的屏幕截图显示了这些微服务器/容器和客户端应用程序的VS Solution结构。 (推荐入门时)开放eShopOnContainers-ServicesAndWebApps.sln为仅包含相关的微服务和Web应用程序的服务器端项目的解决方案。 开放eShopOnContainers-MobileApps.sln为仅包含所述客户端的移动应用项目的解决方案(仅Xamarin移动应用)。它也是基于mocks独立工作的。 打开eShopOnContainers.sln包含所有项目(所有的客户端应用和服务)的解决方案。 最后,这些微服务由多个客户端网络和移动应用程序消耗,如下所述。 MVC应用程序(ASP.NET核心):它的一个MVC应用程序,你可以找到关于如何消费有趣的场景基于HTTP的从C#在服务器端运行的微服务,因为它是一个典型的ASP.NET MVC的核心应用。由于它是一个服务器端应用程序,因此内部Docker Host网络内部名称解析可以访问其他容器/微服务器。 SPA(单页应用):提供了类似的“网上商店的业务功能”,而是开发了角2,打字稿及轻微使用ASP.NET MVC的核心。这是客户端Web应用程序的另一种方法,当您希望拥有更现代的客户端行为时,其行为与每个操作上的典型浏览器往返行为不同,但表现为类似于单页应用程序的单页面应用程序桌面应用使用体验。基于HTTP的微服务的消耗由客户端浏览器中的TypeScript / JavaScript完成,因此客户端调用微服务器来自Docker Host内部网络(从您的网络甚至从互联网)。 Xamarin移动应用(对于iOS,Android和Windows / UWP) :这是一个客户端移动应用程序支持最常见的移动操作系统平台(的iOS,Android和Windows / UWP)。在这种情况下,微服务的消耗是从C#完成的,但是在客户端设备上运行, 为eShopOnContainers设置开发环境 Visual Studio 2017和Windows 这是更直接的入门方式:https://github.com/dotnet/eShopOnContainers/wiki/02.-Setting-eShopOnContainer-solution-up-in-a-Visual-Studio-2017- environment  CLI和Windows 对于喜欢Windows的CLI的用户,使用dotnet CLI,Docker CLI和Windows的VS代码: https://github.com/dotnet/eShopOnContainers/wiki/03.-Setting-the-eShopOnContainers-solution-up-in-a-Windows-CLI-environment-(dotnet-CLI,-Docker-CLI-and-VS-Code) CLI和Mac 对于那些喜欢在Mac上使用CLI的用户,使用dotnet CLI,Docker CLI和VS代码(说明仍然TBD,但类似于Windows CLI):https://github.com/dotnet/eShopOnContainers/wiki/04.-设置eShopOnContainer-in-a-Mac,-VS-Code-and-CLI-environment - (dotnet-CLI,-Docker-CLI-and-VS-Code) 关于测试的Docker容器/图像的注意事项 大部分项目的开发和测试的是(如三月初2017)完成对码头工人的Linux容器在开发机器与“泊坞的Windows”运行,默认是“泊坞的Windows”已安装的Hyper-V的Linux VM(MobiLinuxVM) 。该窗口的容器方案,目前正在实施/测试还没有。应用程序应该能够在基于不同Docker基础映像的Windows Nano Containers上运行,因为.NET Core服务也已经在普通Windows(没有Docker)上运行。该应用程序也使用安装了.NET Core和VS代码的开发MacOS机器在“Docker for Mac”中进行了部分测试,这仍然是使用在Mac上的VM安装程序上运行的Linux容器的“Docker for Windows” 建立。但是,来自社区的Mac环境和Windows Containers的进一步测试和反馈将不胜感激。 发送反馈和建议 如上所述,我们非常感谢您的反馈,改进和想法。您可以在问题部分创建新问题, 或发送电子邮件至eshop_feedback@service.microsoft.com 问题 问题列表:https://github.com/dotnet/eShopOnContainers/issues/107 标签:docker  微服务

110,329

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧