Desenvolvimento de Componentes e Acesso a dados com ADO.NET.NET Apprentice Maio de 2004 José António Tavares jrt@isep.ipp.pt 1
Requisitos Conhecimentos de Base de Dados (Relacionais) Programação: De preferência VB ou C/C++ ou C# ou Java Paradigma OOP Estar familiarizado com Microsoft SQL Server ou outras aplicações como o Microsoft Access Conhecer o ADO embora não seja fundamental Estar familiarizado com o desenvolvimento de aplicações para o ambiente Microsoft Windows 2
Agenda 1. Programação com ADO.NET 2. Componentes na Framework.NET 3. Exemplos de Aplicação: Componentes + ADO.NET 4. Instalação de componentes Deployment 3
PARTE I Programação com ADO.NET 4
Conteúdo 1. Desenho de aplicações centradas em dados 2. Arquitectura ADO.NET 3. Ligação a Base de Dados 4. Operações ligadas à Base de Dados 5. Construção de Data Sets 6. Ler e Escrever XML com ADO.NET 7. Construir Data Sets a partir de Bases de Dados 5
1. Desenho de aplicações centradas em dados 2. Arquitectura ADO.NET 3. Ligação a Base de Dados PARTE I Programação com ADO.NET 4. Operações ligadas à Base de Dados 5. Construção de Data Sets 6. Ler e Escrever XML com ADO.NET 7. Construir Data Sets a partir de Bases de Dados 6
Cenários Conectados Um cenário conectado é aquele no qual os utilizadores estão permanentemente ligados à bases de dados Vantagens: É mais fácil exercer segurança ao nível do ambiente A concorrência é mais fácil de controlar Os dados estão mais actualizados que nos outros cenários Desvantagens É necessário haver uma ligação constante ao servidor Escalabilidade 7
Cenários Desconectados Num ambiente desconectado, um sub-conjunto de dados pode ser copiado e modificado independentemente e mais tarde as alterações podem ser introduzidas de novo na base de dados Vantagens Pode-se trabalhar a qualquer altura e pode-se efectuar uma ligação à base de dados apenas quando necessário Outros utilizadores podem usar os recursos Este tipo de ambientes aumenta a escalabilidade e desempenho das aplicações Desvantagens Os dados nem sempre estão actualizados Podem ocorrer conflitos de dados que têm que ser resolvidos 8
O que é o ADO.NET? ADO.NET é a solução de acesso a dados em.net Faz parte integrante Framework.NET Substitui completamente o ADO clássico Constitui uma evolução ao clássico ADO Existem similaridades mas mudou muito Suporta os modelos conectados e desconectados DataReaders para acesso conectados a dados DataSets e DataAdapters para desconectados Baseado em pluggable Data Providers SQL Server, Oracle, OLE DB & ODBC standard 9
ADO.NET A nível do armazenamento de Dados, o ADO.NET suporta vários tipos: Não estruturados; Estruturados, não-hierárquicos Ficheiros CSV (Comma Separated Value), Folhas Microsoft Excel, Ficheiros Microsoft Exchange, Hierárquicos Documentos XML e outros Bases de Dados Relacionais SQL Server, Oracle, Access, ODBC, 10
Visão.net 11
ADO.NET e a Framework.NET VB C++ C# Perl Python Web Services ASP.NET User Interface ADO.NET: Data and XML.NET Framework Class Library Common Language Runtime Message Queuing COM+ (Transactions, Partitions, Object Pooling) IIS WMI Win32 12
Evolução do ADO para ADO.NET Connection XxxConnection XxxTransaction ADO Command XxxCommand DataSet ADO.NET Recordset XxxDataReader XxxDataAdapter 13
ADO vs. ADO.NET 1/2 ADO Desenhado para acessos conectados Amarrado ao modelo físico dos dados RecordSet é o contentor central de dados RecordSet é uma (1) tabela que contem todos os dados Obter dados de > 1 tabela requer um comando JOIN Os dados "são planos": perde relações e a navegação é sequencial Os tipos de dados estão limitados aos tipos de dados COM/COM+ A partilha de dados é via COM marshalling Problemas com marshalling através firewalls (DCOM, binários) 14
ADO vs. ADO.NET 2/2 ADO.NET Desenhado acessos desconectados Pode modelar dados logicamente (em memória)! DataSet substitui o RecordSet DataSet pode conter múltiplas tabelas Obter dados de > 1 tabela não requer um comando JOIN Relações são preservadas e a navegação é relacional Os tipos de dados estão apenas limitados por esquemas (schema) XML Não é necessário conversão de tipo de dados XML, tal como HTML, é texto: Firewall friendly 15
Beneficios do ADO.NET Interoperacionalidade através do uso de XML Standard aberto Texto legível e compreensível pelos humanos Dados descrevem-se a si mesmos (XML) Usado transferir todos os dados em ADO.NET Escalabilidade através de DataSet desconectados Conecções não são mantidas por longos periodos Database locking não existe Works the way the Web works: Hit and Run! Maintainability Separação entre o tratamento de dados e a user interface 16
1. Desenho de aplicações centradas em dados 2. Arquitectura ADO.NET 3. Ligação a Base de Dados PARTE I Programação com ADO.NET 4. Operações ligadas à Base de Dados 5. Construção de Data Sets 6. Ler e Escrever XML com ADO.NET 7. Construir Data Sets a partir de Bases de Dados 17
Arquitectura do ADO.NET Managed Provider Classes DataReader Database Connection Command DataAdapter Company: Northwind Traders DataTables DataSet 18
Usar as classes ADO.NET num cenário conectado SqlDataReader SqlCommand SqlConnection Num cenário conectado, os recursos são mantidos no servidor até a ligação ser fechada 1. Abrir ligação 2. Executar comando 3. Processar linhas no reader 4. Fechar reader 5. Fechar ligação SQL Server 7.0 (e posterior) 19
Usar as classes ADO.NET num cenário desconectado DataSet SqlDataAdapter SqlConnection SQL Server 7.0 (and later) Num cenário desconectado, os recursos não são mantidos no servidor durante o processamento dos dados 1. Abrir a ligação 2. Encher o DataSet 3. Fechar a ligação 4. Processar o DataSet 5. Abrir a ligação 6. Actualizar a fonte de dados 7. Fechar a ligação 20
Arquitectura do ADO.NET Esta animação descreve a arquitectura do ADO.NET considerando ambos os modelos: conectado e desconectado 21
ADO.NET e XML O ADO.NET é totalmente integrado com XML Cliente XML Web Services Data Source 11 44 Request data XML DataSet 22 33 SQL query Results 55 Updated XML DataSet 66 SQL updates Utilização do XML numa aplicação ADO.NET desconectada 22
1. Desenho de aplicações centradas em dados 2. Arquitectura ADO.NET 3. Ligação a Base de Dados PARTE I Programação com ADO.NET 4. Operações ligadas à Base de Dados 5. Construção de Data Sets 6. Ler e Escrever XML com ADO.NET 7. Construir Data Sets a partir de Bases de Dados 23
O que são.net Data Providers Definição Um.NET data provider é um conjunto de classes que pode ser usado para efectuar ligações a bases de dados, manipular e actualizar os dados Tipos de.net data providers SQL Server.NET Data Provider OLE DB.NET Data Provider ODBC.NET Data Provider Outros (DB2/400, MySQL, ) 24
Modelo de objectos do ADO.NET DataSet SQL Server.NET Data Provider OLE DB.NET Data Provider SQL Server 7.0 (e posterior) OLEDB sources (SQL Server 6.5) 25
Os Namespaces System.Data System.Data.Common System.Data.SqlClient System.Data.OleDb System.Data.SqlTypes System.Xml 26
Classes do.net Data Provider XxxConnection exemplo, SqlConnection XxxTransaction exemplo, SqlTransaction XxxException exemplo, SqlException XxxError exemplo, SqlError XxxCommand exemplo, SqlCommand XxxParameter exemplo, SqlParameter XxxDataReader exemplo, SqlDataReader XxxDataAdapter exemplo, SqlDataAdapter XxxPermission exemplo, SqlClientPermission 27
Gestão de conecções Abrir e fechar conexões explicitamente: Open Close Abrir e fechar ligações implicitamente: Os Data Adapters podem abrir e fechar as ligações automaticamente sempre que necessário O método Dispose: Remove a conexão da pool de conexões 28
OleDbConnection e SQLConnection Criação, abertura e fecho de uma conecção a uma fonte de dados Exemplo OleDbConnection : String constr="provider=microsoft.jet.oledb.4.0;" + "Data Source=NWIND_RW.MDB"; OleDbConnection aconn = new OleDbConnection(conStr); aconn.open(); // acesso, inserção e actualização de dados aconn.close(); 29
Pooling de Conecções A abordagem desconectada melhora significativamente a escalabilidade No entanto, requisitar frequentemente conecções degrada o desempenho das aplicações O pooling de conecções permite uma pool de conecções idênticas partilhadas por múltiplos utilizadores/aplicações Escalável e rápido Os maiores benefícios são para as aplicações Web / n-tier ADO.NET usa pooling por defeito 30
Pooling de Conecções com o SQL Server Esta animação descreve como é que o pooling de conecções funciona com o Microsoft SQL Server 2000 31
1. Desenho de aplicações centradas em dados 2. Arquitectura ADO.NET 3. Ligação a Base de Dados PARTE I Programação com ADO.NET 4. Operações ligadas à Base de Dados 5. Construção de Data Sets 6. Ler e Escrever XML com ADO.NET 7. Construir Data Sets a partir de Bases de Dados 32
O objecto COMMAND O objecto command é uma referência a uma instrução de SQL ou Stored Procedure Propriedades (Name), Connection, CommandType, CommandText, Parameters Métodos ExecuteScalar, ExecuteReader, ExecuteNonQuery ExecuteXmlReader (só para o SqlCommand) 33
Retornar só um registo O ADO.NET é mais eficiente que o ADO clássico, dado que este retorna um RecordSet completo Exemplos de utilização: Obter as unidades em stock para um determinado produto Contar os produtos COUNT, MAX, MIN, AVERAGE Exemplo 34
Retornar múltiplos registos DataReader Read-only Forward-only O método ExecuteReader retorna um DataReader 35
Exemplo Data Reader Dim cmproducts As New SqlCommand( _ "SELECT ProductName, UnitsInStock " & _ "FROM Products", cnnorthwind) cnnorthwind.open() Dim rdrproducts As SqlDataReader rdrproducts = cmproducts.executereader() Do While rdrproducts.read() ListBox1.Items.Add(rdrProducts.GetString(0)) Loop rdrproducts.close() 36
Instruções de Inserção e Actualização de Dados Dim cmd As SqlCommand = New SqlCommand(_ "dbo.increaseproductprices", cnnorthwind) cmd.commandtype = CommandType.StoredProcedure cnnorthwind.open() Dim affected As Integer = cmd.executenonquery() cnnorthwind.close() MessageBox.Show( Registos Afectados: " & affected) 37
Transacções XxxConnection por exemplo, SqlConnection BeginTransaction XxxTransaction por exemplo, SqlTransaction Commit Rollback Exemplo 38
DEMO 01 Criar uma solução em Visual Studio.NET do tipo Database Criar uma pequena aplicação que ilustra o modelo conectado 39
1. Desenho de aplicações centradas em dados 2. Arquitectura ADO.NET 3. Ligação a Base de Dados PARTE I Programação com ADO.NET 4. Operações ligadas à Base de Dados 5. Construção de Data Sets 6. Ler e Escrever XML com ADO.NET 7. Construir Data Sets a partir de Bases de Dados 40
Como é constituído o DataSet DataSet DataTable DataTable Connection Stored Procedure DataColumn Database DataTable DataRelation Constraints DataRow 41
Modelo de Objectos do DataSet DataSet DataTableCollection DataTable DataColumnCollection DataColumn DataRowCollection DataRow ConstraintCollection Constraint DataRelationCollection DataRelation 42
DataSet, DataTable, DataColumn Criar um DataSet Arrastar o controlo DataSet da Toolbox Criar uma DataTable Editar a colecção de Tables de um DataSet usando a janela de propriedades Criar uma DataColumn e adicioná-la a uma DataTable Editar a colecção de Columns de uma DataTable usando a janela de propriedades 43
System.Data DataSet e DataTable Criar DataTable e adicionar a um DataSet DataSet ds = new DataSet(); // Create DataTable object: Customers. DataTable dt= new DataTable( Customers ); // Create and add columns to the table // 1. Explicitly create and Add a DataColumn DataColumn dc = new DataColumn( CustID, Int16 ); dt.columns.add( dc ); // 2. Implicitly Create and Add columns (DataColumn). dt.columns.add( First_Name, String ); dt.columns.add( Last_Name, String ); // Add the DataTable object to the DataSet ds.tables.add( dt ); 44
Restrição de Chave Primária Usar a propriedade PrimaryKey da DataTable Seleccionar as colunas pela ordem desejada Não permite mudar o nome à restrição Editar a colecção de Constraints da DataTable Adicionar uma UniqueConstraint Dar o nome à restrição Seleccionar as colunas Activar a caixa de chave primária 45
Expressões Customisadas As expressões Custom são colunas cujos valores são originados em cálculos e não em valores guardados Usar a propriedade Expression da DataColumn Sum([Unit Price] * [Quantity]) As funções de agregação podem usar relações pai/filho Avg, Count, Sum, Max, Min 46
DEMO 02 Um pequena aplicação que ilustra programaticamente, no modelo desconectado, a criação de DataSets 47
Inserir registos Criar uma linha nova DataRow drnovoempregado = dtempregados.newrow(); Preencher a nova linha drnovoempregado["empregadoid"] = 11; drnovoempregado["nome"] = "Nuno"; Adicionar a linha a uma DataTable dtempregados.rows.add(drnovoempregado); Criar, preencher e adicionar numa só instrução dtempregados.rows.add(new Object[]{11, "Nuno"}); 48
Modificar registos O método BeginEdit da classe DataRow Desliga o lançamento de eventos e excepções Os métodos EndEdit e CancelEdit da classe DataRow Ligam de novo o lançamento de eventos e excepções 49
Apagar registos O método Remove da classe DataRowCollection apaga completamente o registo da colecção dtempregados.rows.remove(drempregado); O método Delete da classe DataRow marca o registo como apagado. Este fica escondido, mas acessível, se necessário drempregado.delete(); 50
Alterações de dados no DataSet Uma DataRow pode guardar múltiplas versões de valores para cada coluna: DataRowVersion.Current O valor actual da coluna DataRowVersion.Original O valor da coluna antes de qualquer alteração ter ocorrido DataRowVersion.Proposed O valor da coluna durante o ciclo BeginEdit / EndEdit DataRowVersion.Default O valor por defeito em função do row s state 51
Processamento de Versões de linha datarow.beginedit(); datarow[ "au_lname" ] = "Brown"; CURRENT ORIGINAL PROPOSED White White N/A White White Brown datarow.endedit(); Brown White N/A datarow[ "au_lname", DataRowVersion.Current ] // Brown datarow[ "au_lname", DataRowVersion.Original ] // White 52
Processamento do Row State CURRENT ORIGINAL ROW STATE White White Unchanged dr["au_lname"] = "Brown"; Brown White Modified dr.acceptchanges(); Brown Brown Unchanged 53
Actualizações com o DataAdapter Actualizações são escritas na base de dados usando o método Update do DataAdapter DataAdapter analisa o Row State para cada linha Executa a acção apropriada (insert, update or delete) de acordo com o seu row state Usa os objectos Command atribuidos às suas propriedades InsertCommand, UpdateCommand e DeleteCommand DataRows in DataTable DataAdapter Action RowState = Unchanged RowState = Added RowState = Modified RowState = Deleted Ignore Use INSERT command Use UPDATE command Use DELETE command 54
Optimização de actualizações Objectos do tipo DataSet e DataTable suportam o método GetChanges GetChanges sem argumentos Extrai todas as linhas cujo RowState não é Unchanged dschanges = ds.getchanges(); GetChanges com argumento do tipo RowState Extrai apenas as linhas com um RowState especificado Permite controlar a ordem em que os inserts, updates e deletes são efectuados à base de dados changes = ds.getchanges( DataRowState.Added ); 55
Usar o método SELECT As DataTables têm um método de Select que permite filtrar as DataRows de modo a cumprir com restrições de ordenação e de estado Três parâmetros opcionais Expressões de filtragem, como por exemplo, "City= Porto'" Ordenar, por exemplo, "City ASC" DataViewRowState, por exemplo, Deleted 56
Criar um DataView Criar um DataView através da utilização dos controlos Criar um DataView programaticamente DataView dvprodutos = new DataView(dsNorthwind.Tables["Products"]); dvprodutos.sort = "UnitPrice"; dvprodutos.rowfilter = "CategoryID > 4"; grdproducts.datasource = dvprodutos; Aplicar um DataView a um DataTable dvprodutos.table = dsnorthwind.tables("products"); 57
Objectos DataView - Exemplo // Code for mytable Customers with // Name column not shown DataView view1 = new DataView( mytable ); DataView view2 = new DataView( mytable ); // Creates Ascending view of Customers by Name view1.sort = Name ASC ; // Set the view to show only modified (original) rows view2.rowstatefilter= DataViewRowState.ModifiedOriginal; // Bind to UI element(s)... DataGrid mygrid = new DataGrid(); mygrid.setdatabinding( view1, Customer ); //... 58
DEMO 03 Considerando a aplicação do DEMO 02 e programaticamente: Adicionar e actualizar registos Criar DataViews 59
1. Desenho de aplicações centradas em dados 2. Arquitectura ADO.NET 3. Ligação a Base de Dados PARTE I Programação com ADO.NET 4. Operações ligadas à Base de Dados 5. Construção de Data Sets 6. Ler e Escrever XML com ADO.NET 7. Construir Data Sets a partir de Bases de Dados 60
ADO.NET: Data e XML ADO.NET: Data and XML System.Data System.Xml OleDb SqlClient XSL Serialization Common SQLTypes XPath 61
XML e ADO.NET Método ReadXML dsnorthwind.readxml(@"c:\xml\teste.xml", XmlReadMode.InferSchema); Método WriteXML dsnorthwind.writexml(@"c:\xml\teste.xml", XmlWriteMode.WriteSchema); 62
DEMO 04 Utilização de XML Um pequena aplicação que ilustra a persistência de DataSets 63
1. Desenho de aplicações centradas em dados 2. Arquitectura ADO.NET 3. Ligação a Base de Dados PARTE I Programação com ADO.NET 4. Operações ligadas à Base de Dados 5. Construção de Data Sets 6. Ler e Escrever XML com ADO.NET 7. Construir Data Sets a partir de Bases de Dados 64
DataAdapter Pode-se preencher um DataSet através de um DataAdapter Invoca-se o método Fill do DataAdapter O método Fill executa o SelectCommand Preenche o DataSet com a estrutura e conteúdo do resultado do inquérito Para optimizar o desempenho adataset.enforceconstraints=false Chamar o método BeginLoadData do DataTable 65
DataAdapter - Exemplo // Visual C# DataSet dscustomers = new DataSet(); dscustomers.tables.add(new DataTable("Customers")); dscustomers.tables[0].beginloaddata(); dacustomers.fill(dscustomers, "Customers"); dscustomers.tables[0].endloaddata(); datagrid1.datasource = dscustomers.tables[0].defaultview; 66
Algumas operações do DataAdapter Deve-se usar o método Merge para juntar dois DataSets um original e um que contenha apenas as mudanças ao original O método de Update de um DataAdapter chama o comando apropriado para cada linha alterada (INSERT, UPDATE, DELETE) numa DataTable específica O método AcceptChanges de um DataSet efectua o Commit a todas as alterações efectuadas a um DataSet específico desde o seu último carregamento ou desde que foi chamado este método pela última vez 67
DEMO 05 Um pequena aplicação que mostra como criar e preencher DataSets a partir de fontes de dados e como persistir as alterações dos DataSets para fontes de dados BD em MS Access 68
Typed DataSets Visual Studio.NET pode gerar strongly typed DataSets Classes customisadas derivadas de DataSet Proporciona toda a funcionalidade dos DataSet Contem classes, métodos, eventos e propriedades especificas relacionadas com os dados em questão Por exemplo, um typed DataSet pode conter: Uma classe chamada Customers deriveda de DataTable Uma classe chamada CustomerRow deriveda de DataRow com propriedades CustomerID e Name 69
Typed DataSets - Vantagens Compile-time type checking Funcionalidades adicionais Por exemplo, o método FindByCustomerID Código mais legível e manutenção facilitada Total suporte pelo IntelliSense Torna o código mais legível e menos sujeito a erros string s = customerdataset.customers[ 1 ].Name; comparado com : string s = (string) customerdataset. Tables["Customers"]. Rows[ 1 ].Item[ "Name" ]; 70
Typed DataSets - Criar Visual Studio gera typed DataSets a partir definições XML schema (XSD) Visual Studio oferece varias formas de gerar definições XML schema A forma mais fácil é: Seleccionar o Add New Item wizard Seleccionar a template Data Set para adicionar um ficheiros XSD Arrastar uma table ou uma stored procedure do Server Explorer para a área de trabalho E é tudo! 71
DEMO 06 As mesma aplicação do DEMO 04, mas agora com Typed DataSets 72
PARTE II Componentes na Framework.NET 73
Criação Componente para a Framework.NET Pontos a considerar 1. Uso de Namespaces e declaração de classes 2. Implementação de classes 3. Implementação estruturada de gestão de excepções 4. Criação de propriedades 5. Compilação de componentes 74
Criação Componente para a Framework.NET Componente simples que contem apenas um método que valida utilizadores. O utilizador e a respectiva palavra chave estão numa tabela da Base de Dados. Exemplo de demonstração no Visual Studio 75
Criar uma Simples Aplicação Cliente Pontos a considerar 1. Uso das Libraries 2. Instanciação dos Componentes 3. Chamar os Componentes 4. Contruir a aplicação Cliente 76
Criar uma Simples Aplicação Cliente para a Consola Exemplo de demonstração no Visual Studio 77
Criar uma Simples Aplicação Cliente do tipo Windows Forms Exemplo de demonstração no Visual Studio 78
PARTE III Exemplos de Aplicação: Componentes + ADO.NET 79
Loja de Informática Componente simples que implementa as regras de negócio de uma loja de equipamentos e artigos de informática. 80
Loja de Informática Desenvolvimento em duas camadas Apresentação Interface com utilizador Aplicação local Acesso via Web Outras Regras de Negócio - Componente 81
Loja de Informática Funcionalidades do componente: Validação de utilizador/ password ; Inserir / actualizar clientes; Verificar se um determinado cliente / produto existe; Actualizar a quantidade de produtos quando é feita uma venda; Inserir vendas (transacções) com validação da existência dos produtos em stock. 82
Loja de Informática Exemplo de demonstração no Visual Studio 83
PetShop - Microsoft Microsoft.NET Pet Shop http://msdn.microsoft.com/library/en-us/dnbda/html/bdasamppet.asp 84
PetShop - Microsoft.NET Pet Shop high-level logical architecture 85
PetShop - Microsoft.NET Pet Shop 2.0 Architecture 86
PetShop - Microsoft.NET Pet Shop 3.0 Architecture 87
PARTE IV Instalação de componentes Deployment 88
Instalação de componentes Deployment 1. Conceitos Comuns 2. Aplicações Simples 3. Aplicações Baseadas em Componentes 4. Configuração e Distribuição 89
Conceitos Comuns Classes and Types Used in.net Framework Applications Are: Organized in a hierarchy of namespaces Stored in PE files, such as DLLs and EXEs Fully described by metadata Assemblies: Are made up of one or more PE files Contain a manifest that identifies the assembly and its files Specify exported and imported classes and types Are units of deployment, reuse, and versioning 90
Aplicações Simples Require.NET Runtime Be Installed on Local Computer Can Be Run Directly from a File Server or Copied Locally Make No Registry Entries Cannot Break Another Application Eliminate DLL Hell Can Be Uninstalled by Deleting Locally Copied File(s) 91
Aplicações baseadas em componentes Assemblies Private to an Application Same as a simple application Assemblies Private to Related Applications Deployed into a common subdirectory Assemblies Shared with Other Unrelated Applications Require a strong name and version information Deployed into the global assembly cache 92
Configuração e Distribuição Configuration Maintained in plain-text files Deployment Common distribution formats, such as a.cab file or a.msi file Common distribution mechanisms, such as Windows 2000 IntelliMirror or Microsoft Systems Management Server 93
Cenários de Instalação A Simple Application A Componentized Application Specifying a Path for Private Assemblies A Strong-Named Assembly Deploying Shared Components A Versioned Assembly Creating Multiple Versions of a Strong-Named Assembly Binding Policy Deploying Multiple Versions of a Strong-Named Assembly 94
A Simple Application Use the Microsoft Intermediate Language Disassembler (Ildasm.exe) to Examine the Assembly Manifest Version information Imported types Exported types Deploy the Application by: Running the executable file directly from a file server, or Installing it locally by copying the file Uninstall the application by deleting the file 95
Componentized Application Assembly Component to Be Used by Application Assembly Stringer.dll is built from Stringer.cs as follows: csc csc /target:library Stringer.cs Client Needs to Reference Assembly csc csc /reference:stringer.dll Client.cs Deployment by File Server or Local Copy 96
Specifying a Path for Private Assemblies Specifying a Directory From Which to Load Private Assemblies. Client.exe.config file specifies a privatepath tag <configuration> <configuration> <runtime> <runtime> <assemblybinding <assemblybinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing <probing privatepath= MyStringer"/> </assemblybinding> </runtime> </runtime> </configuration> </configuration> Configuration File s XML Tags Are Case-Sensitive 97
Strong-Named Assembly Global Assembly Cache Contains assemblies shared by unrelated applications Strong Names Are Required for Assemblies in the Cache Generate a public-private key pair: sn sn k k orgkey.snk Add code to source file to specify version and key information: #if #if STRONG STRONG [assembly: [assembly: System.Reflection.AssemblyVersion("1.0.0.0")] [assembly: [assembly: System.Reflection.AssemblyKeyFile("orgKey.snk")] #endif #endif Compile: csc csc /define:strong /define:strong /target:library /target:library /out:areverser.dll AReverser.cs AReverser.cs 98
Deploying Shared Components Installing the Strong-Named Component in the Global Assembly Cache gacutil /i /i AReverser.dll Examining the Global Assembly Cache gacutil /l /l Removing a Shared Component File gacutil /u /u AReverser 99
A Versioned Assembly Applications Need to Bind to a Suitable Version of a Shared Assembly The Version Number Is Represented by a 4-Part Number <major version>.<minor version>.<revision>.<build number> Applications Get the Versions of Assemblies with Which They Were Built and Tested Unless overridden by explicit policy rules 100
Creating Multiple Versions of a Strong-Named Assembly Building Two New Versions of AReverser with a New Key Pair Specify version 2.0.0.0 for one and 2.0.1.0 for the other For AReverser_v2.0.0.0\AReverser.cs: Build #if #if STRONG STRONG [assembly: [assembly: System.Reflection.AssemblyVersion("2.0.0.0")] System.Reflection.AssemblyVersion("2.0.0.0")] [assembly: [assembly: System.Reflection.AssemblyKeyFile("orgVerKey.snk")] System.Reflection.AssemblyKeyFile("orgVerKey.snk")] #endif #endif csc csc /define:strong /define:strong /target:library /target:library /out:areverser_v2.0.0.0\areverser.dll /out:areverser_v2.0.0.0\areverser.dll AReverser_v2.0.0.0\AReverser.cs AReverser_v2.0.0.0\AReverser.cs Use Ildasm.exe to Examine Different Versions Note the publickey and version numbers.assembly.assembly AReverser AReverser { {.......publickey.publickey = = (00 (00 24 24...... 82 82 B1 B1 F2 F2 A0 A0 ) ).hash.hash algorithm algorithm 0x00008004 0x00008004.ver.ver 2:0:1:0 2:0:1:0 101
Binding Policy Policy Resolution Allows an assembly reference, specified at compile time, to be modified after the application has been deployed without recompiling Happens in the Following Stages: 1. Application-policy resolution 2. Publisher-policy resolution 3. Administrator-policy resolution In Each Stage, an XML Configuration File Is Read Note: XML is case-sensitive Version Numbers of Assemblies That Are Not Strong-Named Are Not Checked Configuration File Tag Examples privatepath bindingredirect 102
Deploying Multiple Versions of a Strong-Named Assembly Install Both Versions of AReverser.dll into the Global Assembly Cache gacutil /i /i AReverser_v2.0.0.0\AReverser.dll gacutil /i /i AReverser_v2.0.1.0\AReverser.dll Compile the VerClient Executable and Specify Version 2.0.0.0 of the AReverser Component csc csc /reference:mystringer\stringer.dll /reference:areverser_v2.0.0.0\areverser.dll VerClient.cs Use Version Policies to Control Assembly Binding at Run Time 103
Packaging and Deployment Tools Assembly Linker (Al.exe) Global Assembly Cache tool (Gacutil.exe) MSIL Disassembler (Ildasm.exe) Strong Name (Sn.exe) Native Image Generator (Ngen.exe) Assembly Binding Log Viewer (Fuslogvw.exe).NET Framework Configuration Tool (Mscorcfg.msc) Code Access Security Policy Tool (Caspol.exe) 104
Perguntas & Respostas 105
Mais Informação... MSDN Library http://msdn.microsoft.com/library.net framework center http://msdn.microsoft.com/netframework/ C# http://msdn.microsoft.com/vcsharp/ ASP.net http://www.asp.net Laboratório.net do ISEP/IPP http://www.dei.isep.ipp.pt/labdotnet/ 106
Desenvolvimento de Componentes e Acesso a dados com ADO.NET.NET Apprentice Maio de 2004 José António Tavares jrt@isep.ipp.pt 107