Desenvolvimento de
Componentes e Acesso a
dados com ADO.NET
.NET Apprentice
Maio de 2004
José António Tavares jrt@isep.ipp.pt
Requisitos
z
Conhecimentos de Base de Dados (Relacionais)
zProgramação:
z De preferência VB ou C/C++ ou C# ou Java z Paradigma OOP
z
Estar familiarizado com Microsoft SQL Server ou
outras aplicações como o Microsoft Access
z
Conhecer o ADO embora não seja fundamental
zEstar familiarizado com o desenvolvimento de
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 –
PARTE I
Programação com ADO.NET
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
PARTE I
Programação com ADO.NET
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
Cenários Conectados
z
Um cenário conectado é aquele no qual os
utilizadores estão permanentemente ligados à
bases de dados
z
Vantagens
:
z É mais fácil exercer segurança ao nível do ambiente z A concorrência é mais fácil de controlar
z Os dados estão mais actualizados que nos outros cenários
z
Desvantagens
z É necessário haver uma ligação constante ao servidor z Escalabilidade
Cenários Desconectados
z 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
z
Vantagens
z Pode-se trabalhar a qualquer altura e pode-se efectuar uma
ligação à base de dados apenas quando necessário
z Outros utilizadores podem usar os recursos
z Este tipo de ambientes aumenta a escalabilidade e
desempenho das aplicações z
Desvantagens
O que é o ADO.NET?
z
ADO.NET é a solução de acesso a dados em .NET
z Faz parte integrante Framework .NET
z Substitui completamente o ADO ‘clássico’
z
Constitui uma evolução ao ‘clássico’ ADO
z Existem similaridades mas mudou muito
z
Suporta os modelos conectados e desconectados
z DataReaders para acesso conectados a dados z DataSets e DataAdapters para desconectados
z
Baseado em “pluggable Data Providers”
ADO.NET
A nível do armazenamento de Dados, o ADO.NET suporta
vários tipos:
z
Não estruturados;
z
Estruturados, não-hierárquicos
z Ficheiros CSV (Comma Separated Value), Folhas Microsoft
Excel, Ficheiros Microsoft Exchange, …
z
Hierárquicos
z Documentos XML e outros
ADO.NET e a Framework .NET
Message Message Queuing Queuing COM+ COM+ (Transactions, Partitions,(Transactions, Partitions, IISIIS WMIWMI
Common Language Runtime
Common Language Runtime
.NET Framework Class Library
.NET Framework Class Library
ADO.NET: Data and XML
ADO.NET: Data and XML
Web Services
Web Services User InterfaceUser Interface VB C++ C#
ASP.NET
ASP.NET
Connection
Connection
ADO
ADO.NET
Command
Command
Recordset
Recordset
XxxConnection
XxxConnection
XxxCommand
XxxCommand
DataSet
DataSet
XxxTransaction
XxxTransaction
XxxDataReader
XxxDataReader
XxxDataAdapter
XxxDataAdapter
ADO vs. ADO.NET
1/2
ADOz Desenhado para acessos conectados z Amarrado ao modelo físico dos dados
z RecordSet é o contentor central de dados
z RecordSet é uma (1) tabela que contem todos os dados
z Obter dados de > 1 tabela requer um comando JOIN
z Os dados "são planos": perde relações e a navegação é sequencial
z Os tipos de dados estão limitados aos tipos de dados
COM/COM+
ADO vs. ADO.NET
2/2
ADO.NET
z Desenhado acessos desconectadosz Pode modelar dados logicamente (em memória)! z DataSet substitui o RecordSet
z DataSet pode conter múltiplas tabelas
z Obter dados de > 1 tabela não requer um comando JOIN
z Relações são preservadas e a navegação é relacional
z Os tipos de dados estão apenas limitados por esquemas
(schema) XML
z Não é necessário conversão de tipo de dados z XML, tal como HTML, é texto: “Firewall friendly”
Beneficios do ADO.NET
z
Interoperacionalidade através do uso de XML
z Standard aberto
z Texto legível e compreensível pelos humanos z Dados descrevem-se a si mesmos (XML)
z Usado transferir todos os dados em ADO.NET
z
Escalabilidade através de DataSet desconectados
z Conecções não são mantidas por longos periodos z “Database locking” não existe
z Works the way the Web works: “Hit and Run!”
PARTE I
Programação com ADO.NET
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
Arquitectura do ADO.NET
DataAdapter Connection Command DataReader Company: Northwind Traders Company: Northwind Traders DataTablesManaged Provider Classes
Database
Database
SQL Server 7.0
Usar as classes ADO.NET num
cenário conectado
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
SqlConnection
SqlConnection
SqlCommand
SqlCommand
SqlDataReader
SqlDataReader
Usar as classes ADO.NET
num cenário desconectado
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ção6. Actualizar a fonte de dados
SqlConnection
SqlConnection
SqlDataAdapter
SqlDataAdapter
DataSet
DataSet
Arquitectura do ADO.NET
Esta animação descreve a
arquitectura do ADO.NET
considerando ambos os modelos:
O ADO.NET é totalmente integrado com
XML
XML Web Services DataSet DataSet Request data 1 1 1 222 SQL query Results 3 3 3 XML 4 4 4 Updated XML 5 5 5 666 SQL updates Data Source Cliente DataSet DataSetADO.NET e XML
PARTE I
Programação com ADO.NET
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
O que são .NET Data Providers
zDefinição
z 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
z
Tipos de .NET data providers
z SQL Server .NET Data Provider z OLE DB .NET Data Provider z ODBC .NET Data ProviderDataSet
SQL Server .NET
Data Provider
SQL Server .NET
Data Provider
OLE DB .NET
Data Provider
OLE DB .NET
Data Provider
SQL Server 7.0 (e posterior) OLEDB sources (SQL Server 6.5)Modelo de objectos do
ADO.NET
Os Namespaces
System.Data
System.Data.Common
System.Data.SqlClient
System.Data.OleDb
System.Data.SqlTypes
System.Xml
Classes do .NET Data Provider
z XxxConnection – exemplo, SqlConnectionz XxxTransaction – exemplo, SqlTransaction
z XxxException – exemplo, SqlException
z XxxError – exemplo, SqlError
z XxxCommand – exemplo, SqlCommand
z XxxParameter – exemplo, SqlParameter
z XxxDataReader – exemplo, SqlDataReader
z XxxDataAdapter – exemplo, SqlDataAdapter
Gestão de conecções
z
Abrir e fechar conexões explicitamente:
z Open z Close
z
Abrir e fechar ligações implicitamente:
z Os “Data Adapters” podem abrir e fechar as ligações
automaticamente sempre que necessário
z
O método Dispose:
OleDbConnection e
SQLConnection
z
Criação, abertura e fecho de uma conecção a uma
fonte de dados
z
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
Pooling de Conecções
z
A abordagem desconectada melhora significativamente
a escalabilidade
z No entanto, requisitar frequentemente conecções degrada o
desempenho das aplicações
z
O “pooling” de conecções permite uma ‘
pool
’ de
conecções idênticas partilhadas por múltiplos
utilizadores/aplicações
z Escalável e rápido
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
PARTE I
Programação com ADO.NET
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
O objecto COMMAND
z
O objecto command é uma referência a uma
instrução de SQL ou Stored Procedure
z
Propriedades
z (Name), Connection, CommandType, CommandText,
Parameters
z
Métodos
z ExecuteScalar, ExecuteReader, ExecuteNonQuery z ExecuteXmlReader (só para o SqlCommand)
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:
y Obter as unidades em stock para um determinado produto
y Contar os produtos
Retornar múltiplos registos
z
DataReader
z
Read-only
z
Forward-only
z
O método ExecuteReader retorna um
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))
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()
Transacções
z
XxxConnection – por exemplo, SqlConnection
z
BeginTransaction
z
XxxTransaction – por exemplo, SqlTransaction
z
Commit
zRollback
DEMO 01
z
Criar uma solução em Visual Studio .NET do tipo
Database
z
Criar uma pequena aplicação que ilustra o modelo
PARTE I
Programação com ADO.NET
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
Como é constituído o DataSet
Database Connection Stored Procedure DataSet DataTable DataTable DataRow DataColumn DataTableModelo de Objectos do
DataSet
DataSet DataTableCollection DataTable DataColumnCollection DataRowCollection ConstraintCollection DataColumn DataRow ConstraintDataSet, DataTable, DataColumn
z
Criar um DataSet
z Arrastar o controlo DataSet da Toolbox
z
Criar uma DataTable
z Editar a colecção de Tables de um DataSet usando
a janela de propriedades
z
Criar uma DataColumn e adicioná-la a uma
DataTable
z Editar a colecção de Columns de uma DataTable
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 );
Restrição de Chave Primária
z
Usar a propriedade PrimaryKey da DataTable
z Seleccionar as colunas pela ordem desejada z Não permite mudar o nome à restrição
z
Editar a colecção de Constraints da DataTable
z Adicionar uma UniqueConstraint z Dar o nome à restrição
z Seleccionar as colunas
Expressões “Customisadas”
z
As expressões “Custom” são colunas cujos valores
são originados em cálculos e não em valores
guardados
z
Usar a propriedade Expression da DataColumn
z Sum([Unit Price] * [Quantity])
z
As funções de agregação podem usar relações
pai/filho
DEMO 02
z
Um pequena aplicação que ilustra programaticamente,
Inserir registos
z
Criar uma linha nova
DataRow drNovoEmpregado = dtEmpregados.NewRow();
z
Preencher a nova linha
drNovoEmpregado["EmpregadoID"] = 11; drNovoEmpregado["Nome"] = "Nuno";
z
Adicionar a linha a uma DataTable
dtEmpregados.Rows.Add(drNovoEmpregado);
z
Criar, preencher e adicionar numa só instrução
Modificar registos
z
O método BeginEdit da classe DataRow
z Desliga o lançamento de eventos e
excepções
z
Os métodos EndEdit e CancelEdit da
classe DataRow
z Ligam de novo o lançamento de eventos e
Apagar registos
z
O método Remove da classe DataRowCollection
apaga completamente o registo da colecção
dtEmpregados.Rows.Remove(drEmpregado);
z
O método Delete da classe DataRow marca o registo
como apagado. Este fica escondido, mas acessível,
se necessário
Alterações de dados no
DataSet
Uma DataRow pode guardar múltiplas versões de
valores para cada coluna:
z DataRowVersion.Current
z O valor actual da coluna
z DataRowVersion.Original
z O valor da coluna antes de qualquer alteração ter ocorrido
z DataRowVersion.Proposed
z O valor da coluna durante o ciclo BeginEdit / EndEdit
z DataRowVersion.Default
Processamento de Versões de
linha
CURRENT ORIGINAL PROPOSED
White White N/A
White White Brown
Brown White N/A
dataRow.BeginEdit();
dataRow[ "au_lname" ] = "Brown";
Processamento do Row State
CURRENT ORIGINAL ROW STATE
White White Unchanged
Brown White Modified
Brown Brown Unchanged
dr["au_lname"] = "Brown";
Actualizações com o
DataAdapter
Actualizações são escritas na base de dados usando o método
Update do DataAdapter
z DataAdapter analisa o “Row State” para cada linha
z Executa a acção apropriada (insert, update or delete) de acordo com o seu “row state”
z Usa os objectos Command atribuidos às suas propriedades
InsertCommand, UpdateCommand e DeleteCommand
RowState = Unchanged
RowState = Added
Ignore
Use INSERT command
Optimização de actualizações
z
Objectos do tipo DataSet e DataTable suportam o método
GetChanges
z GetChanges sem argumentos
z Extrai todas as linhas cujo RowState não é Unchanged
dsChanges = ds.GetChanges();
z GetChanges com argumento do tipo “RowState”
z Extrai apenas as linhas com um RowState especificado z Permite controlar a ordem em que os “inserts”, “updates” e
“deletes” são efectuados à base de dados
Usar o método SELECT
z
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
z
Três parâmetros opcionais
z Expressões de filtragem, como por exemplo,
"City=‘Porto'"
z Ordenar, por exemplo, "City ASC"
Criar um DataView
z
Criar um DataView através da utilização dos
controlos
z
Criar um DataView programaticamente
DataView dvProdutos = new
DataView(dsNorthwind.Tables["Products"]); dvProdutos.Sort = "UnitPrice";
dvProdutos.RowFilter = "CategoryID > 4"; grdProducts.DataSource = dvProdutos;
z
Aplicar um DataView a um DataTable
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();
DEMO 03
z
Considerando a aplicação do DEMO 02 e
programaticamente:
z
Adicionar e actualizar registos
zCriar DataViews
PARTE I
Programação com ADO.NET
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
ADO.NET: Data e XML
ADO.NET: Data and XML
ADO.NET: Data and XML
OleDb
OleDb SqlClientSqlClient
Common
Common SQLTypesSQLTypes System.Data System.Data XSL XSL Serialization Serialization XPath XPath System.Xml System.Xml
XML e ADO .NET
zMétodo ReadXML
dsNorthwind.ReadXml(@"c:\XML\teste.xml", XmlReadMode.InferSchema); zMétodo WriteXML
dsNorthwind.WriteXml(@"c:\XML\teste.xml", XmlWriteMode.WriteSchema);DEMO 04
z
Utilização de XML
z
Um pequena aplicação que ilustra a persistência de
PARTE I
Programação com ADO.NET
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
DataAdapter
z
Pode-se preencher um DataSet através de um
DataAdapter
z
Invoca-se o método Fill do DataAdapter
z
O método Fill executa o SelectCommand
z
Preenche o DataSet com a estrutura e conteúdo do
resultado do inquérito
z
Para optimizar o desempenho
z
aDataSet.EnforceConstraints=False
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 =
Algumas operações do
DataAdapter
z Deve-se usar o método Merge para juntar dois DataSets – um
original e um que contenha apenas as mudanças ao original
z O método de Update de um DataAdapter chama o comando
apropriado para cada linha alterada (INSERT, UPDATE, DELETE) numa DataTable específica
z 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
DEMO 05
z 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
Typed DataSets
Visual Studio .NET pode gerar “strongly typed DataSets”
z Classes customisadas derivadas de DataSet
z Proporciona toda a funcionalidade dos DataSet
z Contem classes, métodos, eventos e propriedades especificas
relacionadas com os dados em questão
z Por exemplo, um “typed DataSet” pode conter:
z Uma classe chamada “Customers” deriveda de DataTable z Uma classe chamada “CustomerRow” deriveda de DataRow
Typed DataSets - Vantagens
z “Compile-time type checking” z Funcionalidades adicionais
z Por exemplo, o método FindByCustomerID
z Código mais legível e manutenção facilitada z Total suporte pelo IntelliSense
z 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"].
Typed DataSets - Criar
z
Visual Studio gera typed DataSets a partir definições XML
schema (XSD)
z
Visual Studio oferece varias formas de gerar definições XML
schema
z A forma mais fácil é:
z Seleccionar o “Add New Item” wizard
z Seleccionar a template Data Set para adicionar um ficheiros
XSD
z Arrastar uma table ou uma “stored procedure” do “Server
Explorer” para a área de trabalho
DEMO 06
z As mesma aplicação do DEMO 04, mas agora com Typed DataSets
PARTE II
Componentes na
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
Criação Componente para a
Framework .NET
Exemplo de demonstração no Visual Studio
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.Criar uma Simples Aplicação
Cliente
Pontos a considerar
1.
Uso das Libraries
2.
Instanciação dos Componentes
3.
Chamar os Componentes
Criar uma Simples Aplicação
Cliente para a Consola
Criar uma Simples Aplicação
Cliente do tipo Windows Forms
PARTE III
Exemplos de Aplicação:
Componentes + ADO.NET
Loja de Informática
Componente simples que implementa as regras de negócio de uma loja de equipamentos e artigos de informática.
Loja de Informática
Desenvolvimento em duas camadas
z Apresentação – Interface com utilizador
z Aplicação local
z Acesso via Web
z Outras
Funcionalidades do componente:
zValidação de utilizador/ password ;
z
Inserir / actualizar clientes;
z
Verificar se um determinado cliente / produto existe;
zActualizar a quantidade de produtos quando é feita
uma venda;
z
Inserir vendas (transacções) com validação da
Loja de Informática
PetShop - Microsoft
Microsoft .NET Pet Shop
PetShop - Microsoft
PetShop - Microsoft
PetShop - Microsoft
PARTE IV
Instalação de componentes –
“Deployment”
Instalação de componentes –
“Deployment”
1.
Conceitos Comuns
2.
Aplicações Simples
3.
Aplicações Baseadas em Componentes
Conceitos Comuns
z
Classes and Types Used in .NET Framework
Applications Are:
z
Organized in a hierarchy of namespaces
zStored in PE files, such as DLLs and EXEs
zFully described by metadata
z
Assemblies:
z
Are made up of one or more PE files
z
Contain a manifest that identifies the assembly
and its files
Aplicações Simples
z
Require .NET Runtime Be Installed on Local
Computer
z
Can Be Run Directly from a File Server or Copied
Locally
z
Make No Registry Entries
z
Cannot Break Another Application
z
Eliminate DLL Hell
Aplicações baseadas em
componentes
z
Assemblies Private to an Application
z
Same as a simple application
z
Assemblies Private to Related Applications
z
Deployed into a common subdirectory
z
Assemblies Shared with Other Unrelated
Applications
Configuração e Distribuição
zConfiguration
z
Maintained in plain-text files
z
Deployment
z
Common distribution formats, such as a
.CAB file
or a .MSI file
z
Common distribution mechanisms, such as
Windows 2000 IntelliMirror or Microsoft
Cenários de Instalação
z
A Simple Application
z
A Componentized Application
z
Specifying a Path for Private Assemblies
zA Strong-Named Assembly
z
Deploying Shared Components
zA Versioned Assembly
z
Creating Multiple Versions of a Strong-Named Assembly
zBinding Policy
A Simple Application
z
Use the Microsoft Intermediate Language
Disassembler (Ildasm.exe) to Examine the
Assembly Manifest
z
Version information
zImported types
z
Exported types
z
Deploy the Application by:
z
Running the executable file directly from a file
server, or
z
Installing it locally by copying the file
Componentized Application
z
Assembly Component to Be Used by Application
z
Assembly Stringer.dll is built from Stringer.cs as follows:
z
Client Needs to Reference Assembly
z
Deployment by File Server or Local Copy
csc /target:library Stringer.cs
csc /target:library Stringer.cs
csc /reference:Stringer.dll Client.cs
Specifying a Path for Private
Assemblies
z
Specifying a Directory From Which to Load Private
Assemblies.
z Client.exe.config file specifies a privatePath tag
z
Configuration File’s XML Tags Are Case-Sensitive
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath=“MyStringer"/> </assemblyBinding> </runtime> </configuration> <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath=“MyStringer"/> </assemblyBinding> </runtime> </configuration>
y Global Assembly Cache
y Contains assemblies shared by unrelated applications
y Strong Names Are Required for Assemblies in the Cache
y Generate a public-private key pair:
y Add code to source file to specify version and key information:
y Compile: #if STRONG [assembly: System.Reflection.AssemblyVersion("1.0.0.0")] [assembly: System.Reflection.AssemblyKeyFile("orgKey.snk")] #endif #if STRONG [assembly: System.Reflection.AssemblyVersion("1.0.0.0")] [assembly: System.Reflection.AssemblyKeyFile("orgKey.snk")] #endif sn –k orgKey.snk sn –k orgKey.snk
Strong-Named Assembly
Deploying Shared
Components
z
Installing the Strong-Named Component in
the Global Assembly Cache
z
Examining the Global Assembly Cache
z
Removing a Shared Component File
gacutil /i AReverser.dll gacutil /i AReverser.dll gacutil /l gacutil /l gacutil /u AReverser gacutil /u AReverser
A Versioned Assembly
z
Applications Need to Bind to a Suitable Version of
a Shared Assembly
z
The Version Number Is Represented by a 4-Part
Number
z
Applications Get the Versions of Assemblies with
Which They Were Built and Tested
z
Unless overridden by explicit policy rules
<major version>.<minor version>.<revision>.<build number>
Creating Multiple Versions of a
Strong-Named Assembly
z Building Two New Versions of AReverser with a New Key Pair
z Specify version 2.0.0.0 for one and 2.0.1.0 for the other
z For AReverser_v2.0.0.0\AReverser.cs:
z Build
z Use Ildasm.exe to Examine Different Versions
z Note the publickey and version numbers
#if STRONG [assembly: System.Reflection.AssemblyVersion("2.0.0.0")] [assembly: System.Reflection.AssemblyKeyFile("orgVerKey.snk")] #endif #if STRONG [assembly: System.Reflection.AssemblyVersion("2.0.0.0")] [assembly: System.Reflection.AssemblyKeyFile("orgVerKey.snk")] #endif csc /define:STRONG /target:library¬ /out:AReverser_v2.0.0.0\AReverser.dll AReverser_v2.0.0.0\AReverser.cs csc /define:STRONG /target:library¬ /out:AReverser_v2.0.0.0\AReverser.dll AReverser_v2.0.0.0\AReverser.cs .assembly AReverser { ... .publickey = (00 24 ... 82 B1 F2 A0 ) .assembly AReverser { ... .publickey = (00 24 ... 82 B1 F2 A0 ) .hash algorithm 0x00008004
Binding Policy
z Policy Resolutionz Allows an assembly reference, specified at compile time, to be modified after the application has been deployed without
recompiling
z Happens in the Following Stages:
1. Application-policy resolution
2. Publisher-policy resolution
3. Administrator-policy resolution
z In Each Stage, an XML Configuration File Is Read
z Note: XML is case-sensitive
z Version Numbers of Assemblies That Are Not Strong-Named
Are Not Checked
z Configuration File Tag Examples
Deploying Multiple Versions of
a Strong-Named Assembly
z
Install Both Versions of AReverser.dll into the Global
Assembly Cache
z
Compile the VerClient Executable and Specify
Version 2.0.0.0 of the AReverser Component
z
Use Version Policies to Control Assembly Binding at
Run Time
gacutil /i AReverser_v2.0.0.0\AReverser.dll gacutil /i AReverser_v2.0.1.0\AReverser.dll gacutil /i AReverser_v2.0.0.0\AReverser.dll gacutil /i AReverser_v2.0.1.0\AReverser.dll csc /reference:MyStringer\Stringer.dll¬ /reference:AReverser_v2.0.0.0\AReverser.dll VerClient.cs csc /reference:MyStringer\Stringer.dll¬ /reference:AReverser_v2.0.0.0\AReverser.dll VerClient.csPackaging and Deployment
Tools
z
Assembly Linker (Al.exe)
z
Global Assembly Cache tool (Gacutil.exe)
zMSIL Disassembler (Ildasm.exe)
z
Strong Name (Sn.exe)
z
Native Image Generator (Ngen.exe)
z
Assembly Binding Log Viewer (Fuslogvw.exe)
z
.NET Framework Configuration Tool
(Mscorcfg.msc)
Mais Informação...
z
MSDN Library
z
http://msdn.microsoft.com/library
z
.net framework center
z
http://msdn.microsoft.com/netframework/
z
C#
z
http://msdn.microsoft.com/vcsharp/
z
ASP.net
z
http://www.asp.net
Desenvolvimento de
Componentes e Acesso a
dados com ADO.NET
.NET Apprentice
Maio de 2004
José António Tavares jrt@isep.ipp.pt