Xamarin Android 和 iOS 中的 Visual Basic

Download Sample 下載範例

TaskyVB 範例應用程式示範如何搭配 Xamarin 使用 Visual Basic 程式代碼編譯成 .NET Standard 連結庫。 以下是在 Android 和 iOS 執行之結果應用程式的一些螢幕快照:

Android and iOS running an app built with Visual Basic

範例中的 Android 和 iOS 專案全都以 C# 撰寫。 每個應用程式的使用者介面都是使用原生技術所建置,而 TodoItem 管理是由Visual Basic.NET Standard 連結庫使用 XML 檔案提供(基於示範目的,而非完整資料庫)。

範例逐步解說

本指南討論如何在 iOS 和 Android 的 TaskyVB Xamarin 範例中實作 Visual Basic。

注意

請先檢閱 Visual Basic 和 .NET Standard 上的指示,再繼續進行本指南。

請參閱使用 Visual BasicXamarin.Forms 指示,瞭解如何使用共用使用者介面 Visual Basic 程式代碼建置應用程式。

VisualBasicNetStandard

Visual Basic .NET Standard 連結庫只能在 Windows 上的 Visual Studio 中建立。 範例連結庫包含下列 Visual Basic 檔案中應用程式的基本概念:

  • TodoItem.vb
  • TodoItemManager.vb
  • TodoItemRepositoryXML.vb
  • Xml 儲存體.vb

TodoItem.vb

這個類別包含要在整個應用程式中使用的商務物件。 它會在 Visual Basic 中定義,並與以 C# 撰寫的 Android 和 iOS 項目共用。

類別定義如下所示:

Public Class TodoItem
    Property ID() As Integer
    Property Name() As String
    Property Notes() As String
    Property Done() As Boolean
End Class

此範例會使用 XML 串行化和取消串行化來載入和儲存 TodoItem 物件。

TodoItemManager.vb

Manager 類別會呈現可攜式程式代碼的 『API』。 它提供 類別的基本 CRUD 作業 TodoItem ,但不會實作這些作業。

Public Class TodoItemManager
    Private _repository As TodoItemRepositoryXML
    Public Sub New(filename As String)
        _repository = New TodoItemRepositoryXML(filename, storage)
    End Sub
    Public Function GetTask(id As Integer) As TodoItem
        Return _repository.GetTask(id)
    End Function
    Public Function GetTasks() As List(Of TodoItem)
        Return New List(Of TodoItem)(_repository.GetTasks())
    End Function
    Public Function SaveTask(item As TodoItem) As Integer
        Return _repository.SaveTask(item)
    End Function
    Public Function DeleteTask(item As TodoItem) As Integer
        Return _repository.DeleteTask(item.ID)
    End Function
End Class

建構函式會採用IXml的實例 儲存體 做為參數。 這可讓每個平臺提供自己的工作實作,同時仍讓可攜式程式代碼描述可共用的其他功能。

TodoItemRepository.vb

存放庫類別包含管理 TodoItem 物件清單的邏輯。 以下顯示完整的程序代碼 – 邏輯主要是為了管理 TodoItems 中唯一的標識符值,因為它們會從集合中新增和移除。

Public Class TodoItemRepositoryXML
    Private _filename As String
    Private _storage As IXmlStorage
    Private _tasks As List(Of TodoItem)

    ''' <summary>Constructor</summary>
    Public Sub New(filename As String)
        _filename = filename
        _storage = New XmlStorage
        _tasks = _storage.ReadXml(filename)
    End Sub
    ''' <summary>Inefficient search for a Task by ID</summary>
    Public Function GetTask(id As Integer) As TodoItem
        For t As Integer = 0 To _tasks.Count - 1
            If _tasks(t).ID = id Then
                Return _tasks(t)
            End If
        Next
        Return New TodoItem() With {.ID = id}
    End Function
    ''' <summary>List all the Tasks</summary>
    Public Function GetTasks() As IEnumerable(Of TodoItem)
        Return _tasks
    End Function
    ''' <summary>Save a Task to the Xml file
    ''' Calculates the ID as the max of existing IDs</summary>
    Public Function SaveTask(item As TodoItem) As Integer
        Dim max As Integer = 0
        If _tasks.Count > 0 Then
            max = _tasks.Max(Function(t As TodoItem) t.ID)
        End If
        If item.ID = 0 Then
            item.ID = ++max
            _tasks.Add(item)
        Else
            Dim j = _tasks.Where(Function(t) t.ID = item.ID).First()
            j = item
        End If
        _storage.WriteXml(_tasks, _filename)
        Return max
    End Function
    ''' <summary>Removes the task from the XMl file</summary>
    Public Function DeleteTask(id As Integer) As Integer
        For t As Integer = 0 To _tasks.Count - 1
            If _tasks(t).ID = id Then
                _tasks.RemoveAt(t)
                _storage.WriteXml(_tasks, _filename)
                Return 1
            End If
        Next
        Return -1
    End Function
End Class

注意

此程式代碼是非常基本的數據儲存機制範例。 它提供來示範 .NET Standard 連結庫如何針對介面撰寫程式代碼,以存取平臺特定功能(在此案例中,載入和儲存 XML 檔案)。 它不打算是生產質量的資料庫替代方案。

Android 和 iOS 應用程式專案

iOS

在 iOS 應用程式中, TodoItemManagerXmlStorageImplementation 會在 AppDelegate.cs 檔案中建立,如此代碼段所示。 前四行只是建置將儲存數據之檔案的路徑;最後兩行顯示要具現化的兩個類別。

var xmlFilename = "TodoList.xml";
string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); // Documents folder
string libraryPath = Path.Combine(documentsPath, "..", "Library"); // Library folder
var path = Path.Combine(libraryPath, xmlFilename);

TaskMgr = new TodoItemManager(path);

Android

在Android應用程式中,TodoItemManagerXmlStorageImplementation 會在Application.cs檔案中建立,如此代碼段所示。 前三行只是建置將儲存數據之檔案的路徑;最後兩行顯示要具現化的兩個類別。

var xmlFilename = "TodoList.xml";
string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
var path = Path.Combine(libraryPath, xmlFilename);

TaskMgr = new TodoItemManager(path);

應用程式程式代碼的其餘部分主要與使用者介面有關,並使用 TaskMgr 類別來載入和儲存 TodoItem 類別。

Visual Studio 2019 for Mac

警告

Visual Studio for Mac 不支援編輯 Visual Basic 語言 – 沒有用來建立 Visual Basic 專案或檔案的功能表項。 如果您開啟 .vb 沒有語言語法醒目提示、自動完成或 IntelliSense。

Visual Studio 2019 for Mac 可以 編譯在 Windows 上建立的 Visual Studio .NET Standard 專案,因此 iOS 應用程式可以參考這些專案。

Visual Studio 2017 完全無法 建置 Visual Basic 專案。

摘要

本文示範如何使用 Visual Studio 和 .NET Standard 連結庫,在 Xamarin 應用程式中取用 Visual Basic 程式代碼。 即使 Xamarin 不支援 Visual Basic,將 Visual Basic 編譯成 .NET Standard 連結庫,還是允許將以 Visual Basic 撰寫的程式代碼包含在 iOS 和 Android 應用程式中。