Visual Basic en Xamarin Android e iOS
La aplicación de ejemplo 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:
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.