Visual Basic en Xamarin Android e iOS

Download SampleDescargar el ejemplo

La aplicación de ejemplo TaskyVB muestra cómo se puede usar el código de Visual Basic compilado en una biblioteca de .NET Standard con Xamarin. Estas son algunas capturas de pantalla de las aplicaciones resultantes que se ejecutan en Android e iOS:

Android and iOS running an app built with Visual Basic

Los proyectos de Android e iOS del ejemplo se escriben en C#. La interfaz de usuario de cada aplicación se crea con tecnologías nativas, mientras que la administración de TodoItem la proporciona la biblioteca de .NET Standard de Visual Basic mediante un archivo XML (con fines de demostración, no una base de datos completa).

Tutorial de ejemplo

En esta guía se describe cómo se ha implementado Visual Basic en el ejemplo de Xamarin TaskyVB para iOS y Android.

Nota:

Revise las instrucciones de Visual Basic y .NET Standard antes de continuar con esta guía.

Consulte las instrucciones de Xamarin.Forms con Visual Basic para ver cómo compilar una aplicación con código de Visual Basic de interfaz de usuario compartido.

VisualBasicNetStandard

Las bibliotecas de .NET Standard de Visual Basic solo se pueden crear en Visual Studio en Windows. La biblioteca de ejemplo contiene los conceptos básicos de nuestra aplicación en estos archivos de Visual Basic:

  • TodoItem.vb
  • TodoItemManager.vb
  • TodoItemRepositoryXML.vb
  • XmlStorage.vb

TodoItem.vb

Esta clase contiene el objeto de negocio que se va a usar en toda la aplicación. Se definirá en Visual Basic y se compartirá con los proyectos de Android e iOS escritos en C#.

La definición de clase se muestra aquí:

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

En el ejemplo se usa la serialización y la deserialización XML para cargar y guardar los objetos TodoItem.

TodoItemManager.vb

La clase Manager presenta la "API" para el código portátil. Proporciona operaciones CRUD básicas para la clase TodoItem, pero ninguna implementación de esas operaciones.

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

El constructor toma una instancia de IXmlStorage como parámetro. Esto permite que cada plataforma proporcione su propia implementación de trabajo, a la vez que permite que el código portátil describa otras funcionalidades que se pueden compartir.

TodoItemRepository.vb

La clase de repositorio contiene la lógica para administrar la lista de objetos TodoItem. El código completo se muestra a continuación: la lógica existe principalmente para administrar un valor de identificador único en TodoItems a medida que se agregan y quitan de la colección.

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

Nota:

Este código es un ejemplo de un mecanismo de almacenamiento de datos muy básico. Se proporciona para demostrar cómo una biblioteca de .NET Standard puede codificar en una interfaz para acceder a la funcionalidad específica de la plataforma (en este caso, cargar y guardar un archivo XML). No pretende ser una alternativa de base de datos de calidad de producción.

Proyectos de aplicaciones de Android e iOS

iOS

En la aplicación de iOS, se crean TodoItemManager y XmlStorageImplementation en el archivo AppDelegate.cs como se muestra en este fragmento de código. Las cuatro primeras líneas simplemente crean la ruta de acceso al archivo donde se almacenarán los datos; las dos líneas finales muestran las instancias que se crean de las dos clases.

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

En la aplicación Android, se crean TodoItemManager y XmlStorageImplementation en el archivo Application.cs tal y como se muestra en este fragmento de código. Las tres primeras líneas simplemente crean la ruta de acceso al archivo donde se almacenarán los datos; las dos líneas finales muestran las instancias que se crean de las dos clases.

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

TaskMgr = new TodoItemManager(path);

El resto del código de la aplicación se ocupa principalmente de la interfaz de usuario y del uso de la clase TaskMgr para cargar y guardar las clases TodoItem.

Visual Studio 2019 para Mac

Advertencia

Visual Studio para Mac no admite la edición del lenguaje Visual Basic: no hay elementos de menú para crear proyectos o archivos de Visual Basic. Si abre un archivo .vb, no hay ningún resaltado de sintaxis de lenguaje, autocompletar o IntelliSense.

Visual Studio 2019 para Mac puede compilar proyectos de .NET Standard de Visual Studio creados en Windows, por lo que las aplicaciones iOS pueden hacer referencia a esos proyectos.

Visual Studio 2017 no puede compilar proyectos de Visual Basic en absoluto.

Resumen

En este artículo se ha mostrado cómo consumir código de Visual Basic en aplicaciones de Xamarin mediante bibliotecas de Visual Studio y .NET Standard. Aunque Xamarin no admite Visual Basic directamente, la compilación de Visual Basic en una biblioteca de .NET Standard permite incluir código escrito con Visual Basic en aplicaciones iOS y Android.