Visual Studio 跨平台開發實戰 (1) -- Hello Xamarin!

前言

應用程式發展的腳步,從來沒有停過。從早期的 Windows 應用程式, 到網路時代的 web 應用程式,再到近幾年相當盛行的行動裝置應用程式 (Mobile Application),身為 C# 的開發人員與 Visual Studio 的使用者,除了開發 Windows Phone 與 Windows Store App 外,如果能夠讓你使用 C# 及 Visual Studio 熟悉的開發環境來開發 iOS 及 Android 的 app,是否能再度喚醒你的開發魂?Xamarin 正是為了這樣的需求而生的 framework。

Xamarin 簡介

Xamarin 是由早期的 Mono 專案演變而來,原本是在 Linux 上執行 C# 程式的一個開放原始碼專案。後來陸續發表支援 iOS 的 Mono Touch framework 以及 Mono For Android Framework。因此它在市場上並不是一個新的產品。2011 年,原本在 Novell 的 Mono 專案團隊獨立成立一家公司,正式將名稱改為 Xamarin,此為 Xamarin 的由來。Xamarin 具有以下特點:

  • 快速建立原生 (Native) 的行動裝置應用程式 - 透過 C# 親和且功能齊全的語言特性,搭配 .NET Framework 的 Base Class Library(BCL) 的便利性。讓開發人員能以最高的生產力開發行動裝置應用程式。目前 Mono 支援 C# 5.0 的語言規範,這意味著開發人員可以用您熟悉的 Lambda Expression,LINQ 甚至是 Async/Await 的非同步處理。

  • 程式碼共用 - 現行由 Objective-C 所開發的 iOS 應用程式以及由 Java 所開發的 Android 應用程式,無法達到程式碼共用。Xamarin 則是採用 C# 撰寫,因此透過良好的設計,可以在不同平台間共用商業邏輯以及資料存取等程式,毋需重新撰寫。除了省下重新撰寫的時間成本外,對於版本維護及一致性也有相當大的助益。

  • 與 Visual Studio 整合 – Xamarin 提供了 Visual Studio 2010 / 2012 的 plug - in,讓原本就熟悉 Visual Studio 的開發者不用再熟悉其他的開發工具。在建立專案時,可以直接建立 iOS 及 Android 的專案範本。當然,開發團隊也可以將 iOS 及 Android 的程式碼納入到 ALM,使用 Team Foundation Server 進行版本及建置的管理。

  • 確保第一時間更新 – Xamarin 對於 iOS 及 Android 的版本更新不遺餘力,在 iOS SDK 5.0,6.0 以及 6.1,都與 Apple 在同一天發表對應的 Framework 版本,7.0 也承諾會在同一天發表。而 Android 方面,Xamarin 甚至將 Android 的原始碼,從原本的 Java 改由 C# 重新撰寫,而且效能也得到大幅的提升。

  • 原生的應用程式效能 – Xamarin 針對 iOS 及 Android 平台開發編譯器。將 C# 程式碼直接編譯成 ARM CPU 的機器碼。因此效能將與原生模式開發的應用程式相比,沒有不同。而在 Android 系統上,由於 Xamarin 不使用 Android 的 Dalvik 虛擬機器,改為採用 CLR,經測試其效能更甚於原生的應用程式。

系統需求

  • iOS:由於 Apple 限制 iOS 應用程式編譯都需要透過 Xcode,因此需要 1 台 MAC 的機器作為 Build Host:

    • Windows 7 或更新的作業系統版本
    • Visual Studio 2010 / 2012
    • OS X Lion 或更新的作業系統版本
    • Xcode IDE 以及 iOS SDK
  • Android:對於 Android 開發,則可以完全在 Windows 上進行。其系統需求如下:

    • Windows 7 或更新的作業系統版本
    • Java SDK
    • Android SDK
    • Xamarin、Android for Visual Studio

安裝 Xamarin

無論是在 Windows 或是 MAC 上安裝 Xamarin 都相當簡單,只要在 http://xamarin.com / download 上填入名稱及 Email 帳號,便可以進行下載。而只要依照安裝精靈點選下一步,就可以將 Android SDK 等相關元件裝好。

Windows 版安裝晝面:
MAC 版安裝晝面:

Xamarin 是一個商業的 Framework,但您可以完整試用 30 天,或是使用免費版本。但免費版本限制開發人員編譯後的 IL code 大小不能超過 32 K,且無法使用 Visual Studio 進行開發 ( 只能使用 Xamarin 提供的 Xamarin Studio )。

安裝好 Xamarin 之後,需要註冊一個 Xamarin 帳號進行啟動。

  1. 開啟 Visual Studio,點選工具 -- Xamarin Account
  2. 若先前已經註冊過 Xamarin 帳號 ( 請注意,Xamarin 帳號與先前下載所填的 Email 不同),請直接輸入帳號密碼登入,若您是第一次使用,請申請新的 Xamarin 帳號。

    登入後便可以開始開發 Android 及 iOS 應用程式囉!

使用 Visual Studio 開發 Android HelloWorld!

使用 Xamarin 開發 Android 應用程式可說是相當的方便,不僅支援在 Visual Studio 中使用拖曳的方式設計使用者介面,還整合如 AVD 及 SDK Manager 等工具。廢話不多說,開始我們在 Visual Studio 上的第 1 支 Android 程式吧 ~

  1. 在 Visual Studio 中新增專案,在專案範本中,請展開 C# 節點,你會發現專案範本會多出 Android 及 iOS 類型的專案範本,我們在這個範例中選擇 " Android Application ",並在名稱中輸入 " HelloDroid " ( 當然您可以改成任何您想要的名稱 )
  2. 專案建立後,您會發現工具列中多出幾個項目:

    說明如下 ( 由左至右 ):
    • 目標裝置:可以選擇將目前的專案部署到哪一個裝置,預設的 " Prompt for Device " 則是會在開始除錯/部署時,彈出視窗供使用者選擇。若有接上實體裝置,也會出現在此選單中。
    • 裝置記錄:可以挑選裝置並顯示目前裝置的活動記錄。
    • 開啟 Android 虛擬裝置管理員 (AVD),透過此管理員,您可以新增,開啟或編輯 Android 模擬器。
    • Android SDK 管理員:由於 Android 版本 (API Level) 眾多,您可以在這個管理介面,安裝所需的 SDK 版本及元件。
  3. 預設的專案中會內建一個 Button 控制項並寫著 " Hello World,Click Me ",開啟專案下的 Resources -- Layout -- Main.axml 可以進行頁面的設計。
  4. 而此範例的主要程式碼則是 Activity1.cs,直接透過下圖的註解來說明:

    看到這樣的程式碼,我想大家應該都不會感到陌生。筆者有一些學員跟我說,感覺跟開發 Windows Form 應用程式好像 ~~ Activity1.cs 相當於 MVC 分層的 Controller。透過 SetContentView 方法,告訴系統要載入哪一個頁面。接著透過 FindViewById 方法取得畫面上按鈕的物件實體。接著便可以針對按鈕的屬性或方法撰寫相關的程式碼,或是處理按鈕的事件。如上圖所示,預設的範例是使用匿名方法,我們將它註解後,改用 Lambda Expression 來撰寫。
  5. 接著按下 F5,便可以開始進行除錯,若沒有預先開啟 Android 模擬器,則 Running devices 列表會是空的,這時可以點擊下方的 " Start emulator image " 連結來啟動模擬器。
  6. 執行結果如下:

    是不是相當簡單呢? 接下來我們來開始 iOS 的 Hello World。

使用 Visual Studio 開發 iOS HelloWorld!

與開發 Android 不同,目前 Xamarin 尚未支援在 Visual Studio 中設計應用程式頁面,但官方表示目前已在研發當中,並會在不久之後的版本提供此功能。因此目前 iOS 專案的 UI 設計必須透過 MAC 的 Interface Builder ( XCode 的一部份 ),或是直接在程式中宣告控制項的位置及大小,Visual Studio 中的 HelloWorld Application 便是使用此方法。

  1. 在 Visual Studio 中新增專案,在專案範本中選擇 iOS 下的 iPhone,並在右邊的範本中選擇 HelloWorld Application,接著指定專案名稱 ( 此處為 HelloIOS )
  2. 第一次開啟 iOS 專案時,Xamarin 會提示使用者只有在商業版或更高的版本才能在 Visual Studio 中開發 iOS 專案。

    接著 Xamarin 便會自動啟用試用版本的授權,啟動完畢後,會提示使用者 Visual Studio 將會重新啟動。

    若您 MAC 上的 Xamarin 授權尚未啟動,將會看到系統提示,說明 Build Server ( 也就是 MAC ) 尚未啟用授權。此時按下 Activate 按鈕可能沒有作用,請依照下面的步驟,在 MAC 上啟用 Xamarin 授權。
  3. 由於 Xamarin 在 MAC 上預設是以免費版本開啟。因此可以透過以下方法強制啟用 Xamarin 試用授權。首先在 MAC 的 Finder 開啟 Xamarin Studio

    新增一個專案,選擇 iPhone -- Single View Application。專案建立後,點擊功能表中的專案 -- Profile - Mono

    此時會看到授權啟用的畫面。當完成啟用後,我們就可以回到 Visual Studio 來指定我們的 Build Host。
  4. 在 Visual Studio 的工具 -- 選項中,可以看到多出了一個 Xamarin 節點,點擊 Xamarin 下的 iOS Settings,在右邊可以指定 Mac Build Host。您可以直接輸入 MAC 的電腦名稱或 IP 位址,或按下 Configure 進行設定。

    在設定視窗中,Xamarin 會搜尋同一網段中已安裝並啟用 Xamarin 的 MAC 機器。若狀態顯示為 "Ready",請按下 Connect 進行連線。

    若狀態不是 "Ready",可以按下 Diagnose 按鈕進行連線診斷。如下圖所示,若某一個或多個項目無法通過連線診斷,則會出現 failed,您可以展開 failed 的項目了解失敗的原因。
  5. 請在組態管理中,將平台設定為 iPhoneSimulator,預設為部署至實體機器,但這需要向 Apple 申請付費的開發者帳號。

    接著在工具列中,可以選擇 iOS 模擬器的版本,右邊綠色打勾的符號表示已與 MAC Build Host 的連線正常,若是反灰的狀態,請按一下右邊的 圖示重新與指定的 Build Host 連線。
  6. 開啟專案中的 MyViewConrtoller.cs 檔。在此範例中,同樣是在畫面中間放置一個 Button 控制項 ( 在 iOS 中的類別名稱為 UIButton ) 並顯示點擊的次數。由於我們是在程式中產生控制項,因此有部份程式碼是在宣告物件的佈局屬性,請參考下圖中程式碼的註解:
  7. 接下來才是範例程式的重點,若您是在 XCode 中設計好 UI,則可以取代上面的程式。

    如同先前 Android 的 HelloWorld,在 iOS 中,按鈕的點擊事件不叫 Click,而是 TouchUpInside,因此我們透過此事件的處理,在使用者點擊了按鈕後,改變按鈕的顯示文字 ( 使用 UIButton 的 SetTitle 方法 )。最後將 Button 控制項透過 View.AddSubview 方法加入到畫面當中。

    執行結果如下:

跨平台開發簡介

作為一個跨平台的解決方案,使用 Visual Studio 搭配 Xamarin 開發行動裝置應用程式具有以下特色:

    • 可以在同一個方案中包含所有平台的專案:包括 Windows Phone,Windows 8 Store App,iOS 以及 Android。如下圖所示:
    • 程式碼共享:在設計時,將與平台無關的商業邏輯、服務存取、資料存取以及資料層從介面抽離出來,如下圖所示:

      底下說明如何才能達成上述的專案整合以及程式碼共用,首先來看看架構示意圖:

      從上述的示意圖,我們可以看到,左半邊是可以抽離出來的共用程式碼,這部份將獨立成一個專案,並只加入常用的組件 ( 如 Base Class Library ),若有部份程式碼使用到與平台相關的組件或技術,可以在程式碼中加入 條件式編譯的指示詞,供各平台直接使用,不需要進行修改。

      而在各平台的專案中,可以透過檔案連結的方式,將共用程式碼的部份連結到各平台專案。但由於目前 Visual Studio 並沒有提供可以同時設定多個檔案或整個資料夾連結的方式,因此若每個檔案都要手動連結,其實是較不實際的。而且日後共用程式碼專案若有檔案的異動,如新增或刪除。各平台專案並不會同步更新。此時我們可以透過 1 個叫做 " Project Linker 2012 " 的擴充功能進行協助 ( 它也有對應 Visual Studio 2010 的版本 )。

      安裝好 Project Linker 後,我們便可以在各平台專案點擊滑鼠右鍵 -- Add project link

      接著選擇來源專案,之後便會為來源專案的每個資料夾及檔案進行連結。

      連結的檔案在 Visual Studio 中都會有個藍色箭頭的圖示

      透過上述的設定後,便可以在各平台專案共用程式碼。在開發平台專案時,只要針對使用者介面以及針對控制項的操作撰寫程式即可。對於商業邏輯,資料存取的部份則可以在各平台共用,這是使用原生的開發方式 ( Objective - C,Java ) 所無法達到的。實際執行結果如下:

Visual Studio + C# + Xamarin = iOS/Android/Windows Apps的更多相关文章

  1. [Xamarin.iOS] Visual Studio中Xamarin.iOS项目,无法加入PCL项目参考、NuGet组件参考

    [Xamarin.iOS] Visual Studio中Xamarin.iOS项目,无法加入PCL项目参考.NuGet组件参考 解决方案 目前Visual Studio中最新版本的Xamarin.iO ...

  2. 【Xamarin】Visual Studio 2013 Xamarin for Android开发环境搭建与配置&Genymotion

    Xamarin Xamarin是基于Mono的平台. Xamarin旨在让开发者可以用C#编写iOS, Android, Mac应用程序,也就是跨平台移动开发. 下载资源 1,进入Xamarin官方网 ...

  3. Visual Studio 2013 Xamarin for iOS 环境搭建

    原文:Visual Studio 2013 Xamarin for iOS 环境搭建 一.Mac安装Xamarin.iOS 1,我的Mac 环境:OSX 10.10.3.Xcode 6.3.2 (使用 ...

  4. 【Xamarin】Visual Studio 2013 Xamarin for iOS 环境搭建

    一.Mac安装Xamarin.iOS 1,我的Mac 环境:OSX 10.10.3.Xcode 6.3.2 (使用虚拟机亲测也成功  VMware 11 安装 Mac OS X10.10  ) Xam ...

  5. Visual Studio 开始支持编写 Android 程序并自带 Android 模拟器【转载】

    原文地址 本文内容 为什么需要一个 Android 模拟器 针对 Visual Studio Android 模拟器的调试 Visual Studio Android 模拟器的传感器模拟和其他功能 A ...

  6. Introducing Visual Studio’s Emulator for Android

    visual studio 2015支持Android开发了. Microsoft released Visual Studio 2015 Preview this week and with it ...

  7. Visual Studio 2017 and Apache Cordova mobile apps | Andrés Zsögön

    原文:Visual Studio 2017 and Apache Cordova mobile apps | Andrés Zsögön 以下是使用Microsoft Visual Studio 20 ...

  8. 微软云平台媒体服务实践系列 2- 使用动态封装为iOS, Android , Windows 等多平台提供视频点播(VoD)方案

    文章微软云平台媒体服务实践系列 1- 使用静态封装为iOS, Android 设备实现点播(VoD)方案  介绍了如何针对少数iOS, Android 客户端的场景,出于节约成本的目的使用媒体服务的静 ...

  9. 用Visual Studio 2012+Xamarin搭建C#开发Andriod的环境

    第一步:安装Visual Studio: Visual Studio 2012(或者Visual Studio 2010),原因是目前为止Xamarin for Visual Studio的插件只支持 ...

随机推荐

  1. 如何快速上手.net下单元测试工具NUnit?

    NUnit基本使用 准备知识: 读此博文需要了解单元测试基本概念及NUnit的的安装. 传送门:单元测试之道(使用NUnit) 1.常见的错误 当学习一个新东西时,先学习错误,是最快的方式. 1.1 ...

  2. fpga产生伪随机序列

    1,一位模二加法法则:加减法等同于异或,没有进位. 2,将移位寄存器的某几级作为抽头进行模二加法后作为反馈输入,就构成了有反馈的动态移位寄存器.此方法产生的序列是有周期的. 3,假设移位寄存器的级数为 ...

  3. 十九、python沉淀之路--装饰器

    一.实现装饰器的预备知识 装饰器 = 高阶函数 + 函数嵌套 + 闭包 1.高价函数定义: 1.函数接收的参数是一个函数名    2.函数的返回值是一个函数名    3.满足上述条件任意一个,都可称之 ...

  4. 利用bat合并两个hex文件

    单片机程序如果有IAP功能的话,就会生成两个hex文件,一个是Boot,一个是App,如果给让生产烧录两个文件,就会降低生产效率,所以在烧录前最好将两个文件合并成一个文件,烧录一次即可,合并方法如下: ...

  5. 【Python学习笔记】在OSX下搭建opencv+python环境

    https://jjyap.wordpress.com/2014/05/24/installing-opencv-2-4-9-on-mac-osx-with-python-support/ 参照以上b ...

  6. asp.net数据分页方法

    /// <summary> /// 数据分页方法 /// </summary> /// <param name="PageIndex">当前页& ...

  7. java.sql.SQLException: 无法转换为内部表示

    1. 我出这个错代码:wfef.setRow_num(rs.getInt(rs.getInt(12))); 2. 分析:rs.getInt(12)  得到的是int类型,rs.getInt(rs.ge ...

  8. Spring Boot Oauth2

    Oauth2是描述无状态授权的协议(授权框架),因为是无状态,所以我们不需要维护客户端和服务器之间的会话. Oauth2的工作原理: 此协议允许第三方客户端代表资源所有者访问受保护资源,Oauth2有 ...

  9. NOIP2008普及组第3题 传球游戏

    NOIP2008普及组第3题 传球游戏 时间限制: 1 Sec  内存限制: 128 MB提交: 29  解决: 16[提交][状态][讨论版][命题人:外部导入] 题目描述 上体育课的时候,小蛮的老 ...

  10. js中如何将字符串转化为时间,并计算时间差

    在前台页面开发时通常会用到计算两个时间的时间差,先在此附上实现方法 //结束时间 end_str = ("2014-01-01 10:15:00").replace(/-/g,&q ...