VB 2005  - Visual Basic  com FireBird sobre o MONO no Linux


A NETi TECNOLOGIA resolveu instalar e testar a versão 1.2.3.1 do Mono, que promete executar no GNU/Linux aplicativos compilados no Visual Basic 8 .NET. O resultado atendeu as expectativas, sendo assim resolvemos publicar a experiência. O objetivo não é formar uma opinião sobre o produto, pois o suporte do Visual Basic no Mono é um recurso muito recente.

Junto ao Marcelo Prado (desenvolvedor em Visual Basic 8 .NET na NETi TECNOLOGIA), resolvemos testar a primeira versão do Mono (1.2.3.1), que promete rodar aplicativos VB. O Visual Basic é uma linguagem muito utilizada em plataformas Microsoft. Adianto que o resultado atendeu todas as expectativas laboratoriais.

Ressalto que este documento apenas relata os resultados dos testes e como executá-lo, sendo assim não tenho a menor intenção de criar conclusões sobre a linguagem. Mesmo porque o suporte da linguagem Visual Basic .NET no Mono é um recurso relativamente novo.

Resolvemos criar uma tradicional aplicação Ola Mundo! Como não enfrentamos nenhum problema, partimos para um aplicativo que acessa a base de dados Firebird. Assim testaríamos um aplicativo gerado no ambiente Microsoft, um banco de dados que nasceu na Borland rodando no Mono sobre o OpenSuSE 10.2.

O Projeto Mono é uma iniciativa da comunidade onde o principal objetivo é desenvolver uma versão open-source da plataforma Visual Studio .NET da Microsoft.
O projeto criado em 2001 e tem como foco permitir que os desenvolvedores criem aplicações .NET que executem sobre diversas plataforma.

A Ximian, a empresa de Software Livre co-fundada por Miguel de Icaza, lidera o projeto que foi desenhado para facilitar o desenvolvimento entre plataformas, assim automaticamente todos os projetos criados na plataforma .NET passam a serem híbridos, podendo ser executados em qualquer ambiente que possua um framework instalado.

O projeto Mono oferece suporte para em sistemas de 32 e 64 bits nas plataformas de software Linux, Mac OS X, Sun Solaris, BSD e Microsoft Windows (mais informações em http://www.mono-project.com/Supported_Platforms).

Download e instalação

 
Aconselho efetuar o download do código fonte ou binário da sua distribuição favorita em:

No meu caso que utilizo o OpenSuSE, efetuei o download no link abaixo:

Se decidir baixar e compilar os fontes do mono, utilize a receita de bolo abaixo:

$ tar xzvf mono-1.2.3.1.tar.gz
$ cd mono-1.2.3.1
$ ./configure --prefix=/usr/local
$ make
# make install


Instalação:

Para testar o MONO-BASIC, em primeiro lugar atualizei alguns pacotes presente na minha distribuição OpenSuSE 10.2, veja os pacotes atualizados no exemplo abaixo:

  • mono-core
  • mono-data
  • mono-data-sqlite
  • mono-web
  • mono-winforms


# rpm -Uvh mono-core-1.2.3.1-0.novell.i586.rpm

A preparar...       ################################# [100%]
  1:mono-core       ################################# [ 20%]
            

# rpm -Uvh mono-data-1.2.3.1-0.novell.i586.rpm

A preparar...       ################################# [100%]
   2:mono-data      ################################# [ 40%]
            

# rpm -Uvh mono-data-sqlite-1.2.3.1-0.novell.i586.rpm

A preparar...          ################################# [100%]
   3:mono-data-sqlite  ################################# [ 60%]
            

# rpm -Uvh mono-web-1.2.3.1-0.novell.i586.rpm

A preparar...    ################################# [100%]
   4:mono-web    ################################# [ 80%]
            

# rpm -Uvh mono-winforms-1.2.3.1-0.novell.i586.rpm

A preparar...         ################################# [100%]
   5:mono-winforms    ################################# [100%]

 Após a atualização, instalei alguns pacotes e ferramentas úteis para o desenvolvimento de aplicações no Mono. 

# rpm -ivh mono-devel-1.2.3.1-0.novell.i586.rpm 
A preparar...       ################################# [100%]
   1:mono-devel     ################################# [100%]
            

# rpm -ivh mono-extras-1.2.3.1-0.novell.i586.rpm

A preparar...      ################################# [100%]
   1:mono-extras   ################################# [100%]
            

# rpm -ivh mono-jscript-1.2.3.1-0.novell.i586.rpm

A preparar...        ################################# [100%]
   1:mono-jscript    ################################# [100%]
            

# rpm -ivh mono-locale-extras-1.2.3.1-0.novell.i586.rpm

A preparar...            ################################# [100%]
   1:mono-locale-extras  ################################# [100%]
            

# rpm -ivh mono-nunit-1.2.3.1-0.novell.i586.rpm

A preparar...       ################################# [100%]
   1:mono-nunit     ################################# [100%]
            

Finalmente a instalação do MONO-BASIC.

# rpm -ivh mono-basic-1.2.3.1-0.novell.noarch.rpm

A preparar...   ################################# [100%]
   1:mono-basic ################################# [100%]
            

Caso seja a sua decisão instalar o MONO-BASIC a partir do código fonte, use os comandos tradicionais de compilação após o download:

$ ./configure --prefix=/mono
$ make
# make install

 

Os testes com o banco de dados Firebird
 
Antes de iniciar os testes com o Visual Basic 8 .NET, optamos por testar a conexão entre o Mono e o Firebird. Utilizamos o programa abaixo em C# para certificar que a conexão com o banco esteja funcionando corretamente.

Mais informações sobre a classe de conexão com o banco de dados Firebird em:


Para instalar a classe de conexão com o Firebird, utilizei o comando rpm como de costume na distribuição OpenSuSE.

# rpm -ivh mono-data-firebird-1.2.3.1-0.novell.i586.rpm

A preparar...           ################################# [100%]
   1:mono-data-firebird ################################# [100%]
            

Se desejar também fazer o teste, crie um arquivo chamado Test.cs (C#) com o seguinte conteúdo: (Em azul temos o código VB.NET)
 

using System;
using System.Data;
using FirebirdSql.Data.Firebird;

public class Test {
   public static void Main(string[] args) {
   string connectionString =
         "Database=/opt/firebird/examples/empbuild/employee.fdb;" +
         "User=SYSDBA;" + "Password=masterkey;" +
         "Dialect=3;" + "Server=localhost";

   IDbConnection dbcon = new FbConnection(connectionString);
   dbcon.Open();
   IDbCommand dbcmd = dbcon.CreateCommand();
   string sql = "SELECT FIRST 10 * FROM employee";
   dbcmd.CommandText = sql;
   IDataReader reader = dbcmd.ExecuteReader();
   while(reader.Read()) {
      object dataValue = reader.GetValue(0);
      string sValue = dataValue.ToString();
      Console.WriteLine("Value: " + sValue);
      }

   // clean up
   reader.Close();
   reader = null;
   dbcmd.Dispose();
   dbcmd = null;
   dbcon.Close();
   dbcon = null;
   }
}
Imports System
Imports System.Data
Imports FirebirdSql.Data.Firebird

Public Class Test

 Public Shared Sub Main(ByVal args As String())
   Dim connectionString As String = "Database=/opt/firebird/examples/empbuild/employee.fdb;" + "User=SYSDBA;" + "Password=masterkey;" + "Dialect=3;" + "Server=localhost"
   Dim dbcon As IDbConnection = New FbConnection(connectionString)
   dbcon.Open
   Dim dbcmd As IDbCommand = dbcon.CreateCommand
   Dim sql As String = "SELECT FIRST 10 * FROM employee"
   dbcmd.CommandText = sql
   Dim reader As IDataReader = dbcmd.ExecuteReader
   While reader.Read
     Dim dataValue As Object = reader.GetValue(0)
     Dim sValue As String = dataValue.ToString
     Console.WriteLine("Value: " + sValue)
   End While
   reader.Close
   reader = Nothing
   dbcmd.Dispose
   dbcmd = Nothing
   dbcon.Close
   dbcon = Nothing
 End Sub
End Class

Compile o programa em C# utilizando o comando abaixo referenciando a classe System.Data.dll e FirebirdSql.Data.Firebird.dll:

$ mcs Test.cs -r:System.Data.dll -r:FirebirdSql.Data.Firebird.dll

Após a compilação, um arquivo Test.exe será criado na pasta atual. Para testá-lo, basta executar o comando como no exemplo abaixo, veja o resultado:

$ mono Test.exe
Value: 2
Value: 4
Value: 5
Value: 8
Value: 9
Value: 11
Value: 12
Value: 14
Value: 15
Value: 20

Show!!! Até aqui aqui tudo esta funcionando corretamente.
 
Testando o programa em Visual Basic .NET

 
Os programas utilizados neste documento foram escrito em Visual Basic pelo Marcelo Prado e estão disponíveis para download nos links abaixo (Valeu Marcelão)!!!

Ola Mundo: OlaMundo.tar.gz
Conexão com Firebird: ConexaoFirebird.tar.gz

Como não entendo nada de Visual Basic .NET, envie toda e qualquer dúvida sobre os programas acima para o Marcelo em marceloprado@netitec.com.br. Agora para começar a brincadeira, executaremos NO LINUX o binário criado pelo Visual Studio .NET.

Veja no exemplo abaixo como executar o programa Ola Mundo sobre o Mono:

$ mono OlaMundo.exe
 

Execução do programa Ola Mundo no Linux


Execução do programa Ola Mundo no Windows

Já que tudo está funcionando muito bem, partiremos para a segunda parte. Ou seja, executar uma aplicação que utiliza a classe de conexão com o banco de dados Firebird. Neste caso devemos referenciar esta classe no projeto dentro do Visual Studio .NET, veja a ilustração abaixo do nosso amigo Marcelo.
 

Abaixo a visualização do programa sendo executado no Windows.
 

Execução do programa ConexaoFirebird no Windows

Provavelmente ao executar o programa dentro da pasta Release, ocorrerá o seguinte erro como no exemplo abaixo:

$ mono ConexaoFirebird.exe

** (ConexaoFirebird.exe:15033): WARNING **: The following assembly referenced from /home/cabelo/ConexaoFirebird.exe could not be loaded:
     Assembly:   FirebirdSql.Data.Firebird    (assemblyref_index=4)
     Version:    1.7.1.0
     Public Key: fa843d180294369d
The assembly was not found in the Global Assembly Cache, a path listed in the MONO_PATH environment variable, or in the location of the executing assembly (/home/cabelo/).

** (ConexaoFirebird.exe:15033): WARNING **: Could not load file or assembly 'FirebirdSql.Data.Firebird, Version=1.7.1.0, Culture=neutral, PublicKeyToken=fa843d180294369d' or one of its dependencies.

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'FirebirdSql.Data.Firebird, Version=1.7.1.0, Culture=neutral, PublicKeyToken=fa843d180294369d' or one of its dependencies.
  at <0x00000> <unknown method>
  at ConexaoFirebird.My.MyProject+MyForms.get_Form1 () [0x00000]
  at ConexaoFirebird.My.MyApplication.OnCreateMainForm () [0x00000]
  at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun () [0x00000]
  at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run (System.String[] commandLine) [0x00000]
  at ConexaoFirebird.My.MyApplication.Main (System.String[] Args) [0x00000]

Sem pânico, em resumo este erro informa a ausência da classe referenciada. Como a classe não foi encontrada, podemos resolver este problema copiando o arquivo FirebirdSql.Data.Firebird.dll para a pasta da aplicação ou editando a variável ambiental MONO_PATH.

No meu caso, decidi copiar a dll para o diretório. Veja o exemplo abaixo:

$ cp /usr/lib/mono/gac/FirebirdSql.Data.Firebird/\
1.7.1.0__0706f5520aae4ff4/FirebirdSql.Data.Firebird.dll .


Pronto! Agora basta executar novamente o programa ConexaoFirebird.exe:

(Colaboração de : Alessandro Faria - alessandrofaria@netitec.com.br)
 

Veja também o artigo  :  VB.NET - projeto MONO - O que é o projeto MONO e como ele pode afetar sua vida.


José Carlos Macoratti