1).Crie um projeto de implantação
1. No menu Arquivo, aponte para Adicionar Projeto e selecione Novo Projeto.
2. Na caixa de diálogo Adicionar Novo Projeto, selecione Projetos de Instalação e Implantação no painel Tipos de Projeto e selecione Projetos de Instalação no painel Modelos. Digite setup1 na caixa Nome.
3. Clique em OK para fechar a caixa de diálogo.
4. O projeto é adicionado ao Solution Explorer e o Editor do sistema de arquivos é aberto.
5. Na janela Propriedades, selecione a propriedade ProductName e digite Information Management System.
2). Adicione a saída do projeto do programa principal ao projeto de implantação.
1. No Editor do sistema de arquivos, selecione Pasta do aplicativo. No menu Ações, aponte para Adicionar e selecione Saída do Projeto.
2. Na caixa de diálogo Adicionar grupo de saída do projeto, selecione Seu programa na lista suspensa Projeto.
3. Clique em OK para fechar a caixa de diálogo.
4. Selecione os grupos Saída Principal e Arquivos de Conteúdo na lista e clique em OK.
3).Crie a classe do instalador
1. No menu Arquivo, aponte para Novo e selecione Projeto.
2. Na caixa de diálogo Novo Projeto, selecione Projeto Visual Basic no painel Tipos de Projeto e selecione Biblioteca de Classes no painel Modelos. Digite installDB na caixa Nome.
3. Clique em “Abrir” para fechar a caixa de diálogo.
4. Selecione Adicionar Novo Item no menu Projeto.
5. Selecione Classe do instalador na caixa de diálogo Adicionar novo item. Digite installDB na caixa Nome.
6. Clique em OK para fechar a caixa de diálogo.
7. O código detalhado está anexado.
4).Crie uma caixa de diálogo de instalação personalizada
1. Selecione o projeto "setup1" no Solution Explorer. No menu Exibir, aponte para Editor e selecione Interface do usuário.
2. No Editor de interface do usuário, selecione o nó Inicialização em Instalação. No menu Ação, selecione Adicionar caixa de diálogo.
3. Na caixa de diálogo Adicionar caixa de diálogo, selecione a caixa de diálogo Contrato de licença e clique em OK para fechar a caixa de diálogo.
4. Na caixa de diálogo Adicionar caixa de diálogo, selecione a caixa de diálogo Caixa de texto (A) e clique em OK para fechar a caixa de diálogo.
5. No menu Ação, selecione Mover para Cima. Repita esta etapa até que a caixa de diálogo Caixa de texto (A) esteja acima do nó Pasta de instalação.
6. Na janela Propriedades, selecione a propriedade BannerText e digite: instalar banco de dados.
7. Selecione a propriedade BodyText e digite: O instalador instalará o banco de dados na máquina de destino
8. Selecione a propriedade Edit1Label e digite: nome do banco de dados:
9. Selecione a propriedade Edit1Property e digite CUSTOMTEXTA1
10. Selecione a propriedade Edit1Value e digite: dbservers
11. Selecione a propriedade Edit2Label e digite: nome do servidor:
12. Selecione a propriedade Edit2Property e digite CUSTOMTEXTA2
13. Selecione a propriedade Edit2Value e digite: (local)
14. Selecione a propriedade Edit3Label e digite: nomedeusuario:
15. Selecione a propriedade Edit3Value e digite: sa
16. Selecione a propriedade Edit3Property e digite CUSTOMTEXTA3
17. Selecione a propriedade Edit4Label e digite: Senha:
18. Selecione a propriedade Edit4Property e digite CUSTOMTEXTA4
19. Selecione as propriedades Edit2Visible, Edit3Visible e Edit4Visible e defina-as como true
5).Crie operações personalizadas
1. Selecione o projeto "setup1" no Solution Explorer. No menu Exibir, aponte para Editor e selecione Ações Personalizadas.
2. Selecione o nó Instalar no editor de ações customizadas. No menu Ações, selecione Adicionar ação personalizada.
3. Na caixa de diálogo Selecionar itens no projeto, clique duas vezes em Pasta do aplicativo.
4. Selecione o item "Saída principal do installDB (ativo)" e clique em "OK" para fechar a caixa de diálogo.
5. Na janela Propriedades, selecione a propriedade CustomActionData e digite "/dbname=[CUSTOMTEXTA1] /server=[CUSTOMTEXTA2] /user=[CUSTOMTEXTA3] /pwd=[CUSTOMTEXTA4] /targetdir="[TARGETDIR]"".
Anexo: /targetdir="[TARGETDIR]" é o caminho de destino após a instalação Para obter o caminho após a instalação na classe installDB, definimos este parâmetro.
6). Adicione a função de desinstalação ao empacotar:
Método um:
1. Adicione o arquivo msiexec.exe ao projeto empacotado (geralmente encontrado em c:windowssystem32)
2. Selecione a pasta do aplicativo na visualização do sistema de arquivos, clique com o botão direito em msiexec.exe, selecione Criar atalho e renomeie o atalho para “Desinstalar”.
3. Altere os argumentos deste atalho para "/x {product id}", e o valor do id do produto é o valor do atributo ProductCode do projeto empacotado.
Método 2: (recomendado)
1. Primeiro gere o pacote de instalação e anote o ProductCode (selecione o diretório raiz do explorador de soluções, como setup1, e depois verifique o rótulo das propriedades, não as propriedades no clique com o botão direito), que será usado abaixo
2. Use VS.net para criar um novo arquivo uninst.exe do programa de console
'poder por: senhorio
'para 2000,xp,2003
Desinstalação do módulo
Subprincipal()
Dim myProcess As Process = Novo Processo
Se System.Environment.OSVersion.ToString.IndexOf("NT 5") Então
myProcess.Start("msiexec", "/X{2B65D4A9-C146-4808-AB4B-321FB0779559}") 'Mude para seu próprio ProductCode
Terminar se
meuProcesso.Close()
Finalizar sub
Módulo final
3. Adicione o arquivo exe no diretório BIN do programa de console ao arquivo de programa empacotado e crie um atalho para uninst.exe no grupo de programas.
classe installdb.vb, para adicionar referência a system.configuration.install.dll:
using System;
usando System.Collections;
usando System.ComponentModel;
usando System.Configuration.Install;
usando System.Reflection;
usando System.IO;
usando System.Data;
usando System.Data.SqlClient;
instalação de namespace
{
/// <resumo>
/// Descrição resumida para Installer1.
/// </sumário>
[RunInstaller (verdadeiro)]
classe pública Installer1: System.Configuration.Install.Installer
{
/// <resumo>
/// Variáveis de designer obrigatórias.
/// </sumário>
componentes privados System.ComponentModel.Container = null;
publicInstaller1()
{
// Esta chamada é exigida pelo designer.
InitializeComponent();
// TODO: Adicionar qualquer inicialização após a chamada de InitializeComponent
}
/// <resumo>
/// Limpa todos os recursos em uso.
/// </sumário>
substituição protegida void Dispose( bool disposing)
{
se (descartando)
{
if (componentes! = nulo)
{
componentes.Dispose();
}
}
base.Dispose(disposição);
}
#region Código gerado pelo designer do componente
/// <resumo>
/// O Designer suporta métodos necessários - não use o editor de código para modificar
/// O conteúdo deste método.
/// </sumário>
privado vazio InitializeComponent()
{
componentes = novo System.ComponentModel.Container();
}
#endregion
string privada GetSql (string Nome)
{
// //Chama osql para executar o script
//
// System.Diagnostics.Process sqlProcess = new System.Diagnostics.Process();
//
//sqlProcess.StartInfo.FileName = "osql.exe";
//
// sqlProcess.StartInfo.Arguments = String.Format(" -U {0} -P {1} -d {2} -i {3}db.sql", this.Context.Parameters["usuário"], este .Context.Parameters["pwd"],"master", this.Context.Parameters["targetdir"]);
//
// sqlProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
//
//sqlProcess.Start();
//
// sqlProcess.WaitForExit() ;//Aguardando execução
//
//sqlProcess.Close();
tentar
{
// Montagem Asm = Assembly.GetExecutingAssembly();
// System.IO.FileInfo FileInfo = new System.IO.FileInfo(Asm.Location);
// string path=FileInfo.DirectoryName+@""+Name ;
string path=this.Context.Parameters["targetdir"]+Nome;
FileStream fs=new FileStream(caminho,FileMode.Open,FileAccess.Read,FileShare.Read);
Leitor StreamReader = novo StreamReader(fs,System.Text.Encoding.Default);
//System.Text.Encoding.ASCII;
retornar leitor.ReadToEnd();
}
pegar (exceção ex)
{
Console.Write("Em GetSql:"+ex.Message);
jogue ex;
}
}
private void ExecuteSql(string DataBaseName,string Sql)
{
SqlConnection sqlConnection1=new SqlConnection();
sqlConnection1.ConnectionString =string.Format("servidor={0}; ID do usuário={1}; senha={2}; Banco de dados=mestre",this.Context.Parameters["servidor"],this.Context.Parameters[ "usuário"],this.Context.Parameters["pwd"]);
Comando System.Data.SqlClient.SqlCommand = novo System.Data.SqlClient.SqlCommand(Sql,sqlConnection1);
tentar
{
Command.Connection.Open();
Command.Connection.ChangeDatabase(NomeBancoDeDados);
Command.ExecuteNonQuery();
}
catch(Exceção ex)
{
Console.Write("No manipulador de exceção:"+ex.Message);
}
finalmente
{
Command.Connection.Close();
}
}
void protegido AddDBTable(string strDBName)
{
tentar
{
ExecuteSql("master","CREATE DATABASE "+ strDBName);
ExecuteSql(strDBName,GetSql("sql.txt"));
ExecuteSql("master","exec sp_addlogin 'myoamaster','myoamaster','"+strDBName+"',Null,Null");
ExecuteSql(strDBName,"EXEC sp_grantdbaccess 'myoamaster', 'myoamaster'");
ExecuteSql(strDBName,"exec sp_addrolemember 'db_owner','myoamaster'");
}
catch(Exceção ex)
{
Console.Write("No manipulador de exceção:"+ex.Message);
}
}
substituição pública void Install (System.Collections.IDictionary stateSaver)
{
base.Install(estadoSaver);
AddDBTable(this.Context.Parameters["nomedobd"]);
}
}
}
Há sql.txt aqui, que é o script sql do banco de dados. Claro, você pode chamar osql para executar o script sql.
O arquivo sql.txt deve ser adicionado durante o empacotamento, caso contrário não será executado.
Caso queira anexar o arquivo mdf e o arquivo ldf do banco de dados, utilize o seguinte programa:
private void CreateDataBase(string strSql,string DataName,string strMdf,string strLdf)
{
Cadeia de caracteres;
SqlConnection minhaConn = novo SqlConnection (strSql);
//EXEC sp_detach_db @dbname = 'BX_FreightMileage_2'//Você precisa separar o banco de dados primeiro
str = "EXEC sp_attach_db @dbname = '"+ DataName +"', @filename1 = '"+ strMdf +"',@filename2='"+strLdf+"'";
SqlCommand meuComando = new SqlCommand(str, minhaConn);
myConn.Open();
meuCommand.ExecuteNonQuery();
minhaConn.Close();
}
Claro, esses dois arquivos de banco de dados também devem ser adicionados durante o empacotamento.