Xamarin Android 和 iOS 中的 Visual Basic

该示例应用程序演示了编译到 .NET Standard 库中的 Visual Basic 代码如何与 Xamarin 结合使用。 下面是 iOS 和 Android 上运行的生成应用的一些屏幕截图:

运行使用 Visual Basic 生成的应用的 Android 和 iOS

示例中的 Android 和 iOS 项目都采用 C# 编写。 每个应用程序的用户界面都是使用本机技术生成的,而 TodoItem 管理由使用 XML 文件的 Visual Basic .NET Standard 库提供(供演示,非完整数据库)。

示例演练

本指南讨论如何在适用于 iOS 和 Android 的 TaskyVB Xamarin 示例中实现 Visual Basic。

注意

在继续阅读本指南之前,请查看有关 Visual Basic 和 .NET Standard 的说明。

请参阅使用 Visual Basic 的 Xamarin.Forms 说明,了解如何使用共享用户界面 Visual Basic 代码生成应用。

VisualBasicNetStandard

Visual Basic .NET Standard 库只能在 Windows 上的 Visual Studio 中创建。 示例库包含以下 Visual Basic 文件中应用程序的基础知识:

  • TodoItem.vb
  • TodoItemManager.vb
  • TodoItemRepositoryXML.vb
  • XmlStorage.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”。 它为 TodoItem 类提供基本的 CRUD 操作,但不会实现这些操作。

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

构造函数采用 IXmlStorage 实例作为参数。 这允许每个平台提供自己的工作实现,同时仍允许可移植代码描述可共享的其他功能。

TodoItemRepository.vb

存储库类包含用于管理 TodoItem 对象列表的逻辑。 完整的代码如下所示 - 逻辑主要用于在 TodoItems 中管理唯一 ID 值,因为它们是从集合中添加和删除的。

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 库中即可允许在 iOS 和 Android 应用中包含使用 Visual Basic 编写的代码。