Visual Studio 2019调试 安卓和IOS开发的app 
上图为C# 同一份源码在红米note 1S 的真机上运行安卓app,和iphone 13 模拟器运行ios版app。 (因为ios要在Iphone真机中调试,还需要其它操作开发环境配置,会在后续文中详解。)
写在最前:
本文将以最简单明了阐述 C#一份源码同时开发出ios和android的app, 为让不懂技术小白和初学者都一看就懂,故会跳过其它博主已经发布的xamarin建项目每步步骤,要学习可以参考他们。
1、在VS2019中项目解决方案结构:
在Visual Studio 2019中项目模板选择 移动应用(Xamarin.Forms)创建项目,会获得上图中的解决方案结构。
解决方案结构有三个项目组成,它们是
重点在这里,不需要同时编写安卓项目和ios项目的源代码,只需要在第一个源码项目中完成,即一份c#代码同时完成安卓和ios app开发。
2、展开第一个项目开发UI,如下图

1) 新建Views文件夹,
2) 在该文件夹下,添加新项,选择内容页,取名“CalcT.xaml”
3) 在CalcT.xaml中编写代码如上图,该部分代码就是app的UI 部分
至此 安卓app和ios app 的UI 界面就同时完成了!
3、编写C# 代码完成实际功能

如上图,点开CalcT.xaml在它对应的 CalcT.xaml.cs文件中编写C#代码
代码原理:计算差价,差价是负数,显示金额并以绿色显示,否则红色显示,并保留2数小数。
4、运行调试安卓app

1) 如上图选择 “Android设备管理器”

2) 在打开窗口中,新建一个安卓仿真器。 (过程中会连网下载安卓调试缺失的环境,会因为国内连接GOOGLE服务器不畅问题导致创建失败。根据对应错误网上查找解决办法)
3) 将第二个安卓项目设为启动项目

4) 从创建的安卓仿真器运行 app

5) 运行过程VS2019会自动编译,并启动仿真器,将app部署进安卓仿真器中,显示运行结果:

5、安卓app放到安卓手机中安装运行
1) 当完成上述过程,仿真器运行后在安卓项目文件夹下已经生成了apk安装包,那能直接拿去用呢?
答案是可以,但是需要改变VS2019编译方式从Debug模式改Release模式,再重新编译一次。要问为什么,原因就是本人亲测不这样做直接在安卓手机中可以安装,但运行会闪退!

右击第二个安卓项目,点击属性。显示上图。 取消两处勾选,将改为Release模式
2) 更改安卓app最低支持的安卓版本

如果最低版本选择安卓5.0,这样安卓4以下都无法安装此安装包。博主要在老手机安卓4.4.4红米note1s 的MIUI中运行,所以这里选择了4.3。 另外有小米MIX4 miui12 同样可以运行
6、生成ios app并运行调试
安卓的C#代码 开发的app可直接生成ios app并调试,但因为苹果设备特殊限制,Winddows电脑需要无线连着苹果电脑, 同时苹果电脑已经安装相应的XCODE 版本。
为了实现这个调试,VS2019需要 XCODE 12以上 苹果电脑进行协同工作,不同的XCODE 版本有最低限度支持的macOS版本。所以,本人的苹果电脑macOS版本不支持运行XCODE 12,不得不将苹果电脑系统升级为了macOS 11.7, 这样就能运行 XCODE 13.1 比 XCODE12 高肯定支持。 经过一番折腾终于让苹果电脑系统和开发环境达到要求。
1)连接苹果电脑,右击第三个项目,设置为启动设备,点击VS2019调试按钮,VS2019提示远程连接苹果电脑的步骤后进入状态,


VS2019会自动检测苹果电脑的Mono版本,

并检查Xamarin SDK版本,如果版本不一致或缺失会自动安装。
最后会检查XCODE版本,这个不一致,则需要我们开发者手动在苹果电脑上安装!~
一切通过后,则显示苹果ios设备仿真器

7、生成ios app在iPhone和ipad中部署

在苹果设备真机中部署ios app则需要C#编码以外的工作,则不在本文详解中,具体做法如上图所述。并会在后述文中进行阐述。
写在最后:
本文开宗明义,以最简单直白的图文让技术小白和初学者能快速了解C#的强大和跨平台特性,一份代码同时生成安卓和IOS app。在开发中遇到的情况和避坑文中已尽量做到详细。
针对软件产品经理和软件公司老板,或者有意外包的客户。请不要因为如此觉得程序员的工作量得到的降低。应该看到是一个开发团队同时完成了两个开发团队的工作量。 这样的好处是让app开发效率提高,不是工作量的降低,让app程序在后续中的维护和二次开发、版本管理,相应的统一。这样的好处不是针对程序员本身,恰恰这优点是针对软件公司老板,和产品源码交付给客户后的管理和二次开发。
也会有人质疑这种C#开发的跨平台app没有JAVA原生开发安卓,objectiveX原生开发的IOS 执行效率好。关于这悖论从C# 在20年前诞生在与C++的程序上就一直存在。就揪着这一点对C#进行打压,而无视它本身的优点。如今.NET开源, 并在跨平台上得到很全面的发展,C#做为.NET顶流开发语言,它的优点,跨平台性、类库丰富性从PC到移动端开发,可以说是一枝独秀。值得初学者明白和学习,开发者在真实的工作中多了一个强有力的移动平台开发语言和工具!
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我