msdn06_capa.JPG

Clique aqui para ler todos os artigos desta edição

 

Desenvolvendo Aplicações Conectadas

Parte III – Instalando a aplicação

por Wallace Cézar Sales dos Santos

Nos artigos anteriores, definimos como seria a aplicação. Montamos o projeto utilizando o Microsoft Visio, aplicamos os diagramas definidos na UML (Unified Modeling Language) e finalizamos com a geração dos esqueletos dos tipos a serem utilizados na aplicação.

Em seguida, inciamos nossas atividades no Visual Studio .Net, criando uma solução chamada ActivityManager, e adicionamos os projetos necessários para a implementação do modelo:

·         User Interface, projeto tipo Windows Application denominado ActivityManagerUI, que realiza todas as interações com o usuário;

·         objetos de negócio, projeto tipo Class Library denominado ActivityManagerBO, onde encapsulamos as regras necessárias ao funcionamento da aplicação abstraídas da UI (permitindo assim flexibilidade ao sistema e aos objetos para acesso ao banco de dados);

·         projeto tipo Class Library denominado ActivityManagerData, que retira as preocupações relativas ao gerenciamento de acesso ao banco de dados das classes de negócios.

Adicionalmente, criamos um projeto do tipo Database Project denominado ActivityManagerDB, onde são armazenados todos os scripts necessários para a criação do banco de dados.

Definidos os projetos necessários no Visual Studio .Net, desenhamos o banco de dados utilizando os recursos disponíveis na ferramenta e implementamos os objetos de negócio e da user interface. Agora, é hora de finalizarmos, disponibilizando a aplicação para o usuário final.

Criando o projeto de instalação

Dentre os novos projetos fornecidos pelo Visual Studio .Net, um é voltado para a instalação de Softwares definido como Setup and Deployment Projects. Para acessar este tipo de projeto, selecione o menu File à New. Na lista Project Types, selecione o tipo de projeto citado anteriormente e, na lista Templates, selecione o modelo Setup Project. Defina o nome do projeto como ActivityManagerInstaller e selecione a opção Add to Solution, conforme a Figura 1. Em seguida, clique em OK para criar o projeto.

 

image002.jpg

Figura 1: Criando o projeto de instalação

 

A Figura 2 apresenta a aplicação de instalação criada pelo Visual Studio. A opção escolhida nos obriga a definir manualmente todos os arquivos que deverão fazer parte da instalação e contém 3 pastas principais, a fim de permitir que sejam alteradas e/ou adicionadas outras mais:

·         Application Folder – é o diretório onde será instalada a aplicação. Coloque os arquivos da aplicação

·         User’s Desktop – é o desktop do usuário, onde poderemos definir atalhos para acesso à aplicação

·         User’s Programs Menu – é o menu de programas do Windows, onde serão adicionados os menus para a aplicação

 

Com o projeto de instalação aberto, temos na barra de menus do Visual Studio .Net uma nova opção de menu: Action. Essa opção permite customizar o instalador de acordo com o item selecionado na lista de pastas definidas para a aplicação. Dentre as possibilidades destacam-se:

·         Add Special Folder – permite definir a criação de pastas especiais durante a instalação, como, por exemplo, um diretório de templates;

·         Add – permite adicionar outras pastas, arquivos, saídas do projeto ou assemblies ao instalador;

·         Create New Shortcut – permite criar atalhos.

 

Também é adicionado ao menu View do Visual Studio .Net a opção Editor, que nos permite editar as seguintes opções:

·         File System – são os arquivos e diretórios criados pelo instalador. É a imagem apresentada na Figura 2;

·         Registry – permite configurar chaves e valores a serem criados no registry do Windows pela instalação;

·         File Types – permite definir as associações das extensões de arquivos criados pela aplicação, assim como especificar ações customizadas;

·         User Interface – permite especificar e configurar propriedades para caixas de diálogo predefinidas, a serem apresentadas durante a execução do instalador;

·         Custom Actions – permite especificar ações a serem executadas pelo instalador durante sua execução. Essas ações precisam ser definidas em arquivos .dll, .exe, .vbs ou assemblies;

·         Launch Conditions – permite definir condições que precisam ser satisfeitas antes da execução da instalação, como, por exemplo, ter o .Net Framework instalado no computador.

 

image004.jpg

Figura 2: Projeto de instalação criado no Visual Studio .Net

Customizando uma classe para instalação

Para adicionar dinamicamente o banco de dados ao sistema, é necessário customizar a instalação. Veja os passos necessários:

1.    Crie um objeto Installer

Um objeto Installer é um objeto constituído por uma classe que herda a classe System.Configuration.Install.Installer, permitindo que esta interaja com o instalador que estamos criando. Para fazer isso, siga estes passos:

a.     Crie um novo projeto tipo Class Library com o nome InstallDB e adicione-o ao projeto existente;

b.     Remova a classe padrão adicionada ao projeto (Class1). Na janela Solution Explorer, no projeto InstallDB, clique com o botão direito do mouse sobre o arquivo Class1.vb e selecione Delete. Confirme a exclusão do arquivo;

c.      Selecione o projeto InstallDB. Clique no menu Project à Add New Item... do Visual Studio .Net. Na janela Add New Item, na lista Templates, selecione um modelo Installer Class, defina o nome como DBCustomAction e clique em OK.

 

2.    Crie arquivos de texto com os scripts do banco de dados

No primeiro artigo desta série, desenvolvemos os scripts de criação do banco de dados. Iremos agora customizá-los para adicioná-los ao instalador. Para cada script existente, precisaremos criar um arquivo texto correspondente, onde colocaremos o script de criação do objeto referente ao banco de dados:

a.     Adicione ao seu projeto InstallDB os arquivos de script gerados no projeto ActivityManagerDB;

b.     Altere todas as extensões dos arquivos para “.txt”;

c.      Altere o conteúdo dos arquivos para que eles contenham somente os scripts de criação dos objetos, conforme vemos na Figura 3;

d.     Altere a propriedade Build Action de cada arquivo “.txt” de Content para Embedded Resource. Essa propriedade determina como o arquivo será relacionado com os processos de build e deployment;

 

image006.jpg

Figura 3: Alterando os scripts do banco de dados

 

3.    Programando a classe DbCustomAction

Na janela Solution Explorer, selecione o arquivo DBCustomAction.vb e, em seguida, menu View à Code (ou tecle F7) para visualizar o código da classe, conforme a Listagem 1:

a.     Adicione as diretivas de importação (Imports) dos namespaces System.IO, System.Reflection e System.Data.SqlClient;

b.     Crie uma variável interna do tipo SqlConnection, como vemos:
Dim cn as new SqlConnection(

"server=(local)database=master;trusted_connection=true");

c.      Adicione à sua classe os snippets de código conforme a Listagem 1. O método GetSql é responsável por retornar uma string com a sentença SQL a ser executada (armazenada nos arquivos “.txt” criados no item 2); O método ExecuteSql executa a sentença sobre o banco de dados; O método MakeDatabase dispara a construção de todos os objetos do banco de dados;

d.     No método Install sobrescrito da classe Base, adicione a seguinte chamada ao método MakeDatabase: Me.MakeDataBase(Me.Context.Parameters.Item("dbname")).
Me.Context.Parameters.Item(“dbname”) é o nome do banco de dados que o instalador informará à nossa classe;

e.     Adicione ao método Finalize sobrescrito da classe Base uma sentença para fechamento do acesso ao banco de dados:

If (Me.cn.State = ConnectionState.Open) Then Me.cn.Close()

Listagem 1: Métodos da classe DBCustomAction

Private Function GetSql(ByVal name As String) As String

  Try

    Dim Asm As [Assembly] = [Assembly].GetExecutingAssembly()

    Dim strm As Stream = Asm.GetManifestResourceStream(Asm.GetName().Name + "." + name)

    Dim reader As StreamReader = New StreamReader(strm)

    Return reader.ReadToEnd()

  Catch ex As Exception

    Throw ex

  End Try

End Function

 

Private Sub ExecuteSql(ByVal databaseName As String, ByVal sql As String)

  Dim Command As New SqlClient.SqlCommand(sql, cn)

  Try

    If Not (Me.cn.State = ConnectionState.Open) Then Command.Connection.Open()

    Command.Connection.ChangeDatabase(databaseName)

    Command.ExecuteNonQuery()

  Catch ex As Exception

    Throw ex

  End Try

End Sub

 

Protected Sub MakeDataBase(ByVal strDBName As String)

  Try

    ExecuteSql("master", "CREATE DATABASE " + strDBName)

    ExecuteSql(strDBName, GetSql("Activity.txt"))

    ExecuteSql(strDBName, GetSql("Attachment.txt"))

    ExecuteSql(strDBName, GetSql("ActivityPK.txt"))

    ExecuteSql(strDBName, GetSql("ActivityConst.txt"))

    ExecuteSql(strDBName, GetSql("AttachmentPK.txt"))

    ExecuteSql(strDBName, GetSql("AttachmentFK.txt"))

    ExecuteSql(strDBName, GetSql("up_DeleteActivity.txt"))

    ExecuteSql(strDBName, GetSql("up_DeleteAttachment.txt"))

    ExecuteSql(strDBName, GetSql("up_InsertActivity.txt"))

    ExecuteSql(strDBName, GetSql("up_InsertAttachment.txt"))

    ExecuteSql(strDBName, GetSql("up_LoadActivities.txt"))

    ExecuteSql(strDBName, GetSql("up_LoadActivity.txt"))

    ExecuteSql(strDBName, GetSql("up_LoadAttachment.txt"))

    ExecuteSql(strDBName, GetSql("up_LoadAttachmentFromActivity.txt"))

    ExecuteSql(strDBName, GetSql("up_UpdateActivity.txt"))

    ExecuteSql(strDBName, GetSql("up_UpdateAttachment.txt"))

  Catch ex As Exception

    MsgBox("In exception handler: " & ex.Message)

  End Try

End Sub

 

Salve o projeto e compile em modo de release. Para isso, clique no menu Build à Configuration Manager e altere a opção. Em seguida, clique em Build à Build InstallDB para realizar a compilação. Depois, adicione uma referência ao projeto de instalação (Add / Add Reference). Selecione o projeto ActivityManagerInstaller na janela Solution Explorer e abra o editor File System, clicando em View à Editor à File System. Selecione o nó Application Folder e clique no menu Action à Add à Project Output. A janela Add Project Output Group disponibilizará os projetos existentes. Na caixa Project, selecione InstallDB e clique em OK para fechar a janela.

Customizando o instalador

Nosso próximo passo é criar uma caixa de diálogos customizada em nosso instalador. Por padrão, o instalador é configurado para instalação local e instalação administrativa (a partir de um servidor) e possui as seguintes telas:

·         Welcome – tela de boas-vindas

·         Installation Folder – tela para informar onde o software deverá ser instalado

·         Confirm Installation – tela para confirmar os dados para instalação

·         Progress – tela que apresenta o progresso da instalação

·         Finished – tela que apresenta a mensagem de finalização da instalação.

 

Precisamos agora adicionar uma tela que permita ao usuário informar o nome do banco de dados a ser instalado. Para isso, seguiremos estes passos:

a.      Abra a janela User Interface do instalador (selecione o projeto ActivityManagerInstaller e vá para o menu View à Editor à User Interface);

b.      Na opção Install de instalação existente no editor, selecione Start. Selecione o menu Action, à Add Dialog e, na janela Add Dialog, selecione a opção Textboxes (A) disponível, clicando depois em OK;

c.       Na lista de User Interfaces existentes sob a opção Start, temos a janela Textboxes (A) disponível. Reposicione-a de forma a colocá-la no segundo lugar na lista, logo após a janela Welcome. Para executar esta ação, selecione a janela Textboxes (A) e clique no menu Action à Move Up até que ela esteja na posição desejada. Também é possível executar essa tarefa com uma simples ação de “clicar e arrastar” até a posição desejada.

 

Ainda na janela Textboxes (A), altere algumas propriedades. Abra a janela Properties do Visual Studio .Net para a customização necessária. A Tabela 1 apresenta as propriedades que necessitam de alteração, com o respectivo valor.

 

Tabela 1. Propriedades e seus valores a serem alterados na janela Textboxes (A).

   BannerText

Informe o nome do Banco de Dados

   BodyText

Este passo serve para você poder informar o nome do banco de dados a ser criado no servidor de bancos de dados.

   Edit1Label

Nome do banco de dados:

   Edit1Property

CUSTOMTEXTA1

   Edit1Value

ActivityManager

   Edit2Visible

False

   Edit3Visible

False

   Edit4Visible

False

 

A Figura 4 mostra-nos como ficará esta janela quando o usuário executar o instalador:

 

image008.jpg

Figura 4:  Janela Textboxes (A) durante a instalação

Criando uma ação customizada

Uma ação customizada (Custom Action) tem por objetivo definir quando o instalador irá interagir com um objeto externo. No caso de nosso instalador, criamos a classe InstallDB, conforme já vimos, para automatizar a criação do banco de dados durante o processo de instalação. Porém, é necessário definirmos quando essa ação será realizada. Para customizar essa atividade:

a.        Abra a janela Custom Action. Para isso, selecione o projeto ActivityManagerInstaller na janela Solution Explorer, vá ao menu View à Editor à Custom Action;

b.        No editor, selecione o nó Install. Selecione o menu Action à Add Custom Action para adicionar uma ação customizada;

c.        Na janela Select Item in Project, dê um duplo clique em Application Folder, selecione Primary Output from InstallDB(Active) e clique em OK para fechar a janela;

d.        Na janela Properties, selecione a propriedade CustomActionData e adicione o seguinte valor: /dbname=[CUSTOMTEXTA1]

Finalizando o instalador

Após definirmos todas as customizações do instalador, vamos finalizá-lo. Para isso, devemos adicionar os arquivos que serão instalados no cliente, bem como seus respectivos atalhos e diretórios. Primeiramente, adicione um item ao menu padrão User’s Program Menu, existente no editor File System. Selecione o folder citado e clique no menu Action à Add à Folder. Defina o nome como Gerenciador de Atividades. Desta forma, sua aplicação terá uma estrutura de menus própria, a partir do menu padrão do Windows.

Agora, vamos adicionar o projeto ActivityManagerUI ao instalador, pois ele corresponde ao software que será acessado por nossos usuários. Selecione o nó Application Folder do editor File System e, da mesma forma como fizemos para adicionar o projeto InstallDB, clique no menu Action à Add à Project Output. A janela Add Project Output Group disponibilizará os projetos existentes. Na caixa Project, selecione ActivityManagerUI. A opção Primary Output deve permanecer selecionada, porém, na caixa Configuration, selecione Release .Net. Clique em OK para fechar a janela. Note que os arquivos ActivityManagerBO.dll e ActivityManagerData.dll são adicionados automaticamente ao projeto. Isso ocorre porque o projeto ActivityManagerUI depende deles.

É necessário adicionar atalhos para o aplicativo. No nó Application Folder, selecione o item Primary Output from ActivityManagerUI (Release.Net) e clique no menu Action à Create Shortcut to Primary Output from ActivityManagerUI (Release.Net), repetindo em seguida a operação para adiconar outro atalho. Clique e arraste os atalhos para os nós User’s Desktop e Gerenciador de Atividades, criados anteriormente.

Por fim, crie o executável de instalação e seu respectivo arquivo “.msi”. Para executar essa ação, realize o Build do projeto através do menu Build à Build ActivityManagerInstaller. Faça alguns builds de teste, avaliando as configurações e testando sua execução. Quando finalizar, realize o build final, definindo sua configuração para Release.

Conclusão

Finalizamos nosso projeto revendo todas as fases ocorridas desde o planejamento até a instalação da aplicação. Neste artigo, verificamos como utilizar os recursos do Visual Studio .Net para disponibilizar aos nossos usuários o sistema desenvolvido.