<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- iMasters Gerador RSS 2.0 -->
<rss version="2.0">
    <channel>
        <title>iMasters - Seção: vbnet</title>
        <description>iMasters - Comunidade de profissionais, estudantes e mestres em tecnlogias e ferramentas voltadas para o desenvolvimento web</description>
        <link>http://imasters.uol.com.br/</link>
        <lastBuildDate>Wed, 10 Feb 2010 09:33:08 +0100</lastBuildDate>
        <generator>iMasters Gerador RSS 2.0</generator>
        <item>
            <title>VB .NET - Usando o Entity Framework com MySQL no VS 2008 - Parte 02</title>
            <link>http://imasters.uol.com.br/artigo/15419/vbnet/vb_net_usando_o_entity_framework_com_mysql_no_vs_2008_parte_02/</link>
            <description>&lt;p&gt;No &lt;a href=&quot;http://imasters.uol.com.br/artigo/15358/vbnet/vb_net_usando_o_entity_framework_com_mysql_no_vs_2008_parte_01/&quot;&gt;artigo anterior&lt;/a&gt; eu criei o banco de 
dados no MySQL, a solução no Visual Studio 2008 SP1 e gerei o Entity 
Data Model (EDM) a partir do banco de dados Cadastro. Vou continuar mostrando como 
implementar as operações CRUD contra o banco de dados MySQL usando os recursos 
do Entity Framework.&lt;/p&gt;


&lt;p&gt;Repetindo o final do artigo criamos a 
interface no projeto
ef_interface e agora vamos implementar as funcionalidades citadas.&lt;/p&gt;


&lt;p&gt;O leiaute da interface é mostrado 
abaixo:&lt;/p&gt;


&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15419/0.gif&quot; /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Controles do formulário:&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;em&gt;
     - 3 TextBox&lt;/em&gt;&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;txtID &lt;/li&gt;

&lt;li&gt;txtNome&lt;/li&gt;

&lt;li&gt;txtValor&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt; - 5 Buttons&lt;/em&gt;&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;btnNovo&lt;/li&gt;

&lt;li&gt;btnAlterar&lt;/li&gt;

&lt;li&gt;btnExcluir&lt;/li&gt;

&lt;li&gt;btnExibir&lt;/li&gt;

&lt;li&gt;btnSair&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;- 1 DataGridView&lt;/em&gt;&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;gdvProdutos&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Todas as funcionalidades serão 
implementadas através do evento Click dos botões de comando.&lt;/p&gt;


&lt;p&gt;Para tornar mais claro o entendimento 
e ressaltar os recursos do Entity Framework, 
eu vou usar uma sintaxe básica e vou usar o tratamento de erros simplificado 
através do bloco Try/Catch.&lt;/p&gt;


&lt;p&gt;Antes de iniciar devemos declarar o 
namespace   Imports 
ef_entities; (Lembre-se que referenciamos o projeto ef_entities)&lt;/p&gt;


&lt;p&gt;A seguir devemos declarar duas 
variáveis objeto que serão instanciadas mais tarde:&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;Dim 
cadastroContexto As cadastroEntities&lt;/li&gt;

&lt;li&gt;Dim produtoLista As 
List(Of produtos)&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Vou iniciar com a funcionalidade para 
exibir os dados da tabela Produtos no controle
DataGridView - gdvProdutos. 
A idéia é criar uma rotina chamada exibirProdutos() e chamar esta rotina 
no evento Load do formulário e no evento Click do botão Exibir, 
de 
forma que os dados serão exibidos quando o formulário for carregado e toda vez 
que o cliente clicar no botão Exibir.&lt;/p&gt;


&lt;p&gt;O código da rotina é dado a seguir:&lt;/p&gt;


&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt; Private Sub exibirProdutos()&lt;br /&gt;&lt;br /&gt;        Try&lt;br /&gt;&lt;br /&gt; cadastroContexto = New cadastroEntities&lt;br /&gt;            produtoLista = New List(Of produtos)&lt;br /&gt;&lt;br /&gt;  Dim produtosConsulta = From p In cadastroContexto.produtos.ToList&lt;br /&gt;&lt;br /&gt;            gdvProdutos.DataSource = produtosConsulta.ToList&lt;br /&gt;&lt;br /&gt;        Catch ex As Exception&lt;br /&gt;            MsgBox(&quot;Erro : &quot; &amp;amp; ex.Message)&lt;br /&gt;        End Try&lt;br /&gt;&lt;br /&gt;End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Criamos uma instância do nosso modelo 
de entidades - cadastroEntities (é através dela que temos acesso aos 
métodos para persistência.)&lt;/p&gt;


&lt;p&gt;Definimos a consulta LINQ onde obtemos 
todos os produtos cadastrados:  Dim produtosConsulta = From p In 
cadastroContexto.produtos.ToList&lt;/p&gt;


&lt;p&gt;Exibimos os produtos no 
DataGridView:
   gdvProdutos.DataSource = produtosConsulta.ToList&lt;/p&gt;


&lt;p&gt;Essa rotina será chamada no evento 
Load e Click e o código correspondente é dado a seguir:&lt;/p&gt;


&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load&lt;br /&gt;        exibirProdutos()&lt;br /&gt;End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;span class=&quot;c4&quot;&gt;

Código 
    do evento Load do formulário form1&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Private Sub btnExibir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExibir.Click&lt;br /&gt;        exibirProdutos()&lt;br /&gt;End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;span class=&quot;c4&quot;&gt;Código 
    do evento Click do botão Exibir&lt;/span&gt;&lt;/p&gt;


&lt;p&gt;Ao executar o projeto, o resultado será 
a exibição dos produtos conforme a figura abaixo:&lt;/p&gt;


&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15419/1.gif&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Para incluir um novo produto usamos o 
seguinte código no evento &lt;strong&gt;Click&lt;/strong&gt; do botão &lt;strong&gt;Novo&lt;/strong&gt;:&lt;/p&gt;


&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Private Sub btnNovo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNovo.Click&lt;br /&gt;        Try&lt;br /&gt;            Dim novoProduto As New produtos&lt;br /&gt;            novoProduto.nome = txtNome.Text&lt;br /&gt;            novoProduto.valor = txtValor.Text&lt;br /&gt;            novoProduto.id = -1&lt;br /&gt;      cadastroContexto.AddToprodutos(novoProduto)&lt;br /&gt;            cadastroContexto.SaveChanges()&lt;br /&gt;            MsgBox(&quot;Um novo produto foi incluído&quot;)&lt;br /&gt;        Catch ex As Exception&lt;br /&gt;            MsgBox(&quot;Erro : &quot; &amp;amp; ex.Message)&lt;br /&gt;        End Try&lt;br /&gt;    End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;No código acima, primeiro criamos uma instância da nossa 
entidade produtos e em seguida atribuímos os valores informados no formulário ao 
objeto novoProduto, e incluímos o novo objeto novoProduto na 
coleção de objetos:  cadastroContexto.Add(novoAutor)&lt;/p&gt;


&lt;p&gt;Você pode 
    incluir novos objetos a um contexto de objeto através do método &lt;strong&gt;AddObject&lt;/strong&gt; ou chamando um dos métodos &lt;strong&gt;AddToEntitySetName&lt;/strong&gt; do 
    ObjectConext.
    &lt;/p&gt;


&lt;p&gt;Você também pode incluir um objeto a um contexto de objeto adicionando o 
    objeto a um &lt;strong&gt;EntityCollection&lt;/strong&gt; existente. &lt;/p&gt;


&lt;p&gt;Quando você chama o método &lt;strong&gt;Add&lt;/strong&gt; em um &lt;strong&gt;EntityCollection&lt;/strong&gt; que está anexado a um contexto de objeto, o objeto que você está  incluindo é 
    adicionado ao mesmo &lt;strong&gt;ObjectContext&lt;/strong&gt;. &lt;/p&gt;


&lt;p&gt;Na linha de código  cadastroContexto.AddToAutor(novoAutor)
o método AddTo&amp;lt;EntityName&amp;gt;,  que é usado pelo EF baseado nas 
entidades geradas a partir do banco de dados e irá realizar a inclusão do novo 
objeto no contexto.&lt;/p&gt;


&lt;p&gt;O  método SaveChanges() do contexto é 
usado para persistir as alterações no banco de dados.&lt;/p&gt;


&lt;p&gt;Lembre-se de que o &lt;strong&gt;EF&lt;/strong&gt; usa o modelo de &lt;em&gt;concorrência otimista&lt;/em&gt; e isso significa que não são 
    realizados bloqueios nos dados na fonte de dados. O padrão porém é o &lt;em&gt;Object Services&lt;/em&gt; salvar as alterações nos objetos para o 
    banco de dados sem verificar a concorrência. &lt;/p&gt;


&lt;p&gt;Havendo uma grande possibilidade de ocorrer concorrência é recomendado que a 
    propriedade da entidade seja definida na camada conceitual com um atributo: 
    
    ConcurrencyMode=&quot;fixed&quot; &lt;/p&gt;


&lt;p&gt;
    Ex: 
    
    &amp;lt;Property Name=&quot;Status&quot; Type=&quot;Byte&quot; Nullable=&quot;false&quot; 
    ConcurrencyMode=&quot;Fixed&quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;
    Dessa forma o Object Services irá 
    verificar por alterações no banco de dados antes de salvar as mudanças para 
    o banco de dados e qualquer conflito irá causar uma exceção 
    OptimisticCuncurrencyException.&lt;/p&gt;


&lt;p&gt;O código para excluir um produto é dado a seguir:&lt;/p&gt;


&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Private Sub btnExcluir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExcluir.Click&lt;br /&gt;&lt;br /&gt;        Try&lt;br /&gt;            cadastroContexto = New cadastroEntities&lt;br /&gt;&lt;br /&gt;            Dim p As New produtos&lt;br /&gt;            p.id = txtID.Text&lt;br /&gt;&lt;br /&gt;  Dim prod = cadastroContexto.produtos.First(Function(prd) prd.id = p.id)&lt;br /&gt;&lt;br /&gt;            cadastroContexto.DeleteObject(prod)&lt;br /&gt;            cadastroContexto.SaveChanges()&lt;br /&gt;&lt;br /&gt;            MsgBox(&quot;Um produto foi excluido&quot;)&lt;br /&gt;        Catch ex As Exception&lt;br /&gt;            MsgBox(&quot;Erro : &quot; &amp;amp; ex.Message)&lt;br /&gt;        End Try&lt;br /&gt;    End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt; O código cria uma instância da nossa entidade 
produtos e em seguida atribui o valor informado 
pelo cliente na caixa de texto referente ao código do produto;&lt;/p&gt;


&lt;p&gt;Em seguida usamos uma consulta LINQ para localizar 
a primeira (First) ocorrência cujo código do produto seja igual ao ID 
informado.&lt;/p&gt;


&lt;p&gt;        
Dim prod = cadastroContexto.produtos.First(Function(prd) prd.id = p.id)&lt;/p&gt;


&lt;p&gt;&lt;span class=&quot;bodycopy&quot;&gt;A seguir o método 
DeleteObject() marca o objeto para deleção a partir do ObjectStateManager, 
sendo que o objeto é efetivamente excluído quando o método SaveChanges é 
chamado.&lt;/span&gt;&lt;/p&gt;


&lt;p&gt;&lt;span class=&quot;bodycopy&quot;&gt;Para alterar uma informação 
usamos o seguinte código:&lt;/span&gt;&lt;/p&gt;


&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Private Sub btnAlterar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAlterar.Click&lt;br /&gt;&lt;br /&gt;        Try&lt;br /&gt;            cadastroContexto = New cadastroEntities&lt;br /&gt;            Dim p As New produtos&lt;br /&gt;            p.id = txtID.Text&lt;br /&gt;            p.nome = txtNome.Text&lt;br /&gt;            p.valor = txtValor.Text&lt;br /&gt;&lt;br /&gt;            'localiza o produto a alterar&lt;br /&gt;            Dim prod = cadastroContexto.produtos.First(Function(prd) prd.id = p.id)&lt;br /&gt;&lt;br /&gt;            'efetua as alteracoes&lt;br /&gt;            prod.nome = p.nome&lt;br /&gt;            prod.valor = p.valor&lt;br /&gt;            cadastroContexto.SaveChanges()&lt;br /&gt;&lt;br /&gt;            MsgBox(&quot;Um produto foi alterado&quot;)&lt;br /&gt;        Catch ex As Exception&lt;br /&gt;            MsgBox(&quot;Erro : &quot; &amp;amp; ex.Message)&lt;br /&gt;        End Try&lt;br /&gt;    End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Primeiro criamos 
uma instância do nosso modelo de entidades - cadastroEntities&lt;/p&gt;


&lt;p&gt;A seguir criamos uma instância da nossa entidade 
produtos e em seguida atribuímos os valores informados no formulário - estes 
valores é que irão alterar os valores originais.&lt;/p&gt;


&lt;p&gt;Em seguida usamos uma consulta LINQ para localizar 
a primeira (First) ocorrência cujo código do produto seja igual ao ID 
informado.&lt;/p&gt;


&lt;p&gt;        
Dim prod = cadastroContexto.produtos.First(Function(prd) prd.id = p.id)&lt;/p&gt;


&lt;p&gt;A seguir alteramos os valores originais e usamos o método SaveChanges() do contexto, que é usado para persistir as 
alterações no banco de dados.&lt;/p&gt;


&lt;p&gt;Além dessa funcionalidades, eu criei um tratamento 
no evento CellClick do controle DataGridView de modo que quando o 
usuário clicar em uma célula do controle, os valores irão preencher as caixas de 
texto do formulário. O código é o seguinte:&lt;/p&gt;


&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Private Sub gdvProdutos_CellClick(ByVal sender As System.Object,&lt;br /&gt;ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles&lt;br /&gt;gdvProdutos.CellClick&lt;br /&gt;        Dim i As Integer&lt;br /&gt;        Dim j As Integer&lt;br /&gt;        j = gdvProdutos.RowCount - 1&lt;br /&gt;        i = gdvProdutos.CurrentRow.Index&lt;br /&gt;  If i &amp;lt;= j Then&lt;br /&gt;            txtID.Text = gdvProdutos.Item(0, i).Value&lt;br /&gt;            txtNome.Text = gdvProdutos.Item(1, i).Value&lt;br /&gt;            txtValor.Text = gdvProdutos.Item(2, i).Value&lt;br /&gt;   Else&lt;br /&gt;            txtID.Text = &quot;&quot;&lt;br /&gt;            txtNome.Text = &quot;&quot;&lt;br /&gt;            txtValor.Text = &quot;&quot;&lt;br /&gt;  End If&lt;br /&gt;    End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Abaixo temos uma tela exibindo o 
recurso acima e a funcionalidade para alterar os dados de um produto:&lt;/p&gt;


&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15419/2.gif&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Com isso, mostramos como usar o 
Entity 
Framework com um banco de dados MySQL no Visual Studio 2008 com SP1. Esse 
exemplo foi somente um 'tira-gosto', visto que usamos somente uma tabela. 
Em um 
cenário mais complexo com relacionamentos, chave estrangeira e herança 
existem alguns detalhes relativos ao MySQL que deverão ser levados em conta.&lt;/p&gt;


&lt;p&gt;Aguarde em breve mais artigos sobre o 
assunto...&lt;/p&gt;


&lt;p&gt;Pegue o projeto completo aqui: &lt;a href=&quot;http://www.macoratti.net/09/12/EF_MySQL.zip&quot; class=&quot;ext&quot;&gt;EF_MySQL.zip&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Eu sei, é apenas Entity Framework, mas eu gosto... &lt;/p&gt;

</description>
            <author>macoratti@yahoo.com (José Carlos Macoratti)</author>
            <pubDate>Wed, 23 Dec 2009 11:00:00 +0100</pubDate>
            <guid>http://imasters.uol.com.br/artigo/15419</guid>
        </item>
        <item>
            <title>VB .NET - Usando o Entity Framework com MySQL no VS 2008 - Parte 01</title>
            <link>http://imasters.uol.com.br/artigo/15358/vbnet/vb_net_usando_o_entity_framework_com_mysql_no_vs_2008_parte_01/</link>
            <description>&lt;p&gt;O Entity Framework (EF) é um 
framework para realizar o mapeamento OR/M e persistir dados em banco de dados 
relacionais. Desde o seu lançamento ele vem sendo aperfeiçoado e na nova versão 
da plataforma .NET ele deve estar mais robusto e com muitos bugs corrigidos. 
Vamos aguardar...&lt;/p&gt;


&lt;p&gt;Eu já publiquei diversos artigos sobre 
o Entity Framework(EF) e em todos eles eu usei o banco 
de dados SQL Server. Procurei na web para ver exemplos com outros banco de dados 
e não achei nada de muito concreto, mas por acaso acabei descobrindo que, após 
baixar a última versão do MySQL e do conector .NET para MySQL, era 
possível usar o Entity Framework(EF) com o MySQL 
nativamente no Visual Studio 2008 com SP1.&lt;/p&gt;


&lt;p&gt;Então este artigo vai mostrar um 
exemplo usando uma aplicação Windows Forms só para mostrar que 
podemos usar o Entity Framework com o
MySQL no VS 2008. Se você já acompanhou os meus 
artigos a respeito, verá que não haverá muita diferença nos procedimentos que devemos realizar para efetuar as operações contra um banco de 
dados MySQL usando o Entity Framework.
&lt;/p&gt;


&lt;p&gt;Então vamos ao trabalho...&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Do que você vai precisar? &lt;/strong&gt;&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;

&lt;p&gt;Visual Studio 2008 com service pack 1;&lt;/p&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;a href=&quot;http://dev.mysql.com/downloads/mysql/5.1.html&quot; class=&quot;ext&quot;&gt;MySQL 5.1&lt;/a&gt;&lt;/p&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;a href=&quot;http://dev.mysql.com/downloads/gui-tools/5.0.html&quot; class=&quot;ext&quot;&gt;MySQL GUi Tools&lt;/a&gt;;&lt;/p&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;a href=&quot;http://dev.mysql.com/downloads/connector/net/6.2.html&quot; class=&quot;ext&quot;&gt;MySQL Connector&lt;/a&gt;;&lt;/p&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Devemos realizar as seguintes tarefas:&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;

&lt;p&gt;Criar o banco de dados Cadastro no 
MySQL usando o MySQL Administrator;&lt;/p&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Criar a tabela Produtos contendo os 
campos : id , nome e valor;&lt;/p&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Criar um novo projeto Windows 
Application usando o VS 2008;&lt;/p&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Criar um Entity Data Model para o 
banco de dados Cadastro;&lt;/p&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Usar os métodos do contexto criado 
pelo EDM para realizar o acesso e as operações CRUD no banco de dados;&lt;/p&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Então, como diria Jack, vamos por 
partes...&lt;/p&gt;


&lt;h4&gt;1. Criando o banco de dados e a tabela 
no MySQL usando o MySQL Administrator&lt;/h4&gt;


&lt;p&gt;O MySQL Administrator é
uma ferramenta que fornece uma interface gráfica
que o ajuda a gerenciar o seu MySQL. 
&lt;/p&gt;


&lt;p&gt;Ao executar o MySQL
Administrator  você verá a seguinte tela:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15358/1.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Você deve se conectar ao
MySQL informando a senha que configurou durante a instalação.
Ao fazer isto obterá a seguinte janela:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15358/2.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Selecione a opção
- Catalogs. Você verá uma lista dos bancos de
dados que já existem no MySQL.&lt;/p&gt;


&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15358/3.gif&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Clique com o botão
			direito do mouse sobre a área da janela onde os banco de
			dados estão sendo exibidos e selecione a opção
			- Create New Schema.&lt;/p&gt;


&lt;p&gt;Uma nova janela chamada -
			Create New Schema - irá
			surgir e você deverá informar o nome do banco de
			dados que deseja criar, conforme abaixo.&lt;/p&gt;


&lt;p&gt;Ao clicar no botão OK,
			o banco de dados - Produtos - será criado no MySQL.&lt;/p&gt;


&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15358/4.gif&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Assim que o novo Schema surgir na lista, 
estamos prontos para criar a tabela - Produtos - para isto , clique no botão - Create Table.
Na janela - Table Editor informe o nome da tabela e digite o
nome dos campos que deseja criar diretamente na aba - Columns and
Indices.&lt;/p&gt;


&lt;p&gt;Abaixo foi criada a tabela Produtos com os
campos:&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;
    
    id
	- o código do produto 
	
	
	&lt;/li&gt;

&lt;li&gt;
    
    nome - o nome do produto
	&lt;/li&gt;

&lt;li&gt;valor
	- o valor do produto  
	
&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15358/5.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Para incluir alguns dados na tabela 
produtos podemos usar o MySQL Query Browser e usar a instrução SQL:&lt;/p&gt;


&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt; Insert Into Produtos (nome,valor) values ('Caneta', 1.25)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;conforme a figura abaixo:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15358/6.gif&quot; /&gt;&lt;/p&gt;

&lt;h4&gt;2. Criando 
a solução no Visual Studio 2008 SP1&lt;/h4&gt;


&lt;p&gt;Abra o VS 2008 e no menu File 
selecione New Project e a seguir selecione em Other Project Types o item 
Visual 
Studio Solutions;&lt;/p&gt;


&lt;p&gt;Depois selecione Blank Solution em Templates e informe o nome 
EF_MySQL e clique em OK;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15358/7.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora no menu File selecione Add e a 
seguir New Project;&lt;/p&gt;


&lt;p&gt;Na janela New Project selecione o template
Windows Forms Application e informe o nome ef_interface;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15358/8.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Vamos agora incluir um outro projeto 
do tipo Class Library onde iremos definir o nosso
entity data model (EDM);&lt;/p&gt;


&lt;p&gt;No menu File selecione Add e a 
seguir New Project;&lt;/p&gt;


&lt;p&gt;Na janela New Project selecione o template
Class Library e informe o nome ef_entities;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15358/9.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Se você fez tudo certinho, a janela 
Solution Explorer do seu projeto deverá estar como a figura abaixo:&lt;/p&gt;


&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15358/10.gif&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Na janela &lt;strong&gt;Solution Explorer&lt;/strong&gt; temos uma solução contendo dois projetos:&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;ef_interface&lt;/li&gt;

&lt;li&gt;ef_entities&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Agora selecione o projeto 
ef_entities e clique com o botão do mouse sobre ele e selecione o Add -&amp;gt; 
New Item;&lt;/p&gt;


&lt;p&gt;Em seguida selecione ADO .NET 
Entity Data Model, informe o nome Cadastro.edmx e clique em Add;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15358/11.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;No assistente do 
Entity Data Model selecione o item Generate from DataBase e 
clique em Next&amp;gt;;&lt;/p&gt;


&lt;p&gt;Na janela Choose 
Your Data Connection do assistente clique no botão New Connection;&lt;/p&gt;


&lt;p&gt;Na janela 
Connection Properties clique no botão Change;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15358/12.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Na janela Change 
Data Source selecione o Data Source MySQL DataBase e clique em 
OK;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15358/13.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A seguir defina as propriedades de 
conexão para o seu banco de dados MySQL. No meu caso os valores são:&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;

&lt;p&gt;Server name = 
localhost&lt;/p&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;User name = root&lt;/p&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Password = ******&lt;/p&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Feito isso, já poderemos selecionar o 
banco de dados Cadastro no MySQL e clicar em OK;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15358/14.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;De volta à janela do assistente
Entity Data Model(EDM) marque a opção Yes e 
clique em Next&amp;gt;;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15358/15.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora selecione a tabela produtos 
e clique em Finish.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15358/16.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ao final termos a entidade produtos 
criada no descrito Entity Data Model(EDM) 
conforme abaixo;&lt;/p&gt;


&lt;p&gt;Obs: Eu poderia ter 
alterado o nome da entidade para produto, mas preferi deixar o nome fornecido.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15358/17.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora é só alegria ...&lt;/p&gt;


&lt;p&gt;Basta definir uma interface no projeto
ef_interface e usar os métodos do contexto do EDM para acessar os 
dados e realizarmos as operações contra o banco de dados MySQL.&lt;/p&gt;


&lt;h4&gt;3. Criando 
a interface e mandando bala com o EF no MySQL&lt;/h4&gt;


&lt;p&gt;A interface que eu vou definir no 
formulário form1.vb é mostrada na figura abaixo:&lt;/p&gt;


&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15358/18.gif&quot; /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Controles do formulário:&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;
     - 3 TextBox&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;txtID &lt;/li&gt;

&lt;li&gt;txtNome&lt;/li&gt;

&lt;li&gt;txtValor&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt; - 5 Buttons&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;btnNovo&lt;/li&gt;

&lt;li&gt;btnAlterar&lt;/li&gt;

&lt;li&gt;btnExcluir&lt;/li&gt;

&lt;li&gt;btnExibir&lt;/li&gt;

&lt;li&gt;btnSair&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;- 1 DataGridView&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;gdvProdutos&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Aguarde a 
continuação do artigo...&lt;/p&gt;


&lt;p&gt;Eu sei, é apenas Entity Framework, mas eu gosto...&lt;/p&gt;

</description>
            <author>macoratti@yahoo.com (José Carlos Macoratti)</author>
            <pubDate>Thu, 17 Dec 2009 11:15:00 +0100</pubDate>
            <guid>http://imasters.uol.com.br/artigo/15358</guid>
        </item>
        <item>
            <title>NHibernate - usando o ActiveRecord - Parte 03</title>
            <link>http://imasters.uol.com.br/artigo/15272/desenvolvimento/nhibernate_usando_o_activerecord_parte_03/</link>
            <description>&lt;p&gt;&lt;strong&gt;Leia os artigos anteriores:

&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://imasters.uol.com.br/artigo/15198/desenvolvimento/nhibernate_usando_o_activerecord_parte_02/&quot;&gt;NHibernate - usando o ActiveRecord - Parte 02&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://imasters.uol.com.br/artigo/15113/desenvolvimento/nhibernate_usando_o_activerecord_parte_01/&quot;&gt;NHibernate - usando o ActiveRecord - Parte 01&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;*&lt;/p&gt;


&lt;p&gt;Na &lt;a href=&quot;http://imasters.uol.com.br/artigo/15113/desenvolvimento/nhibernate_usando_o_activerecord_parte_01/&quot;&gt;primeira parte desta série de artigos&lt;/a&gt; eu
apresentei o ActiveRecord e &lt;a href=&quot;http://imasters.uol.com.br/artigo/15198/desenvolvimento/nhibernate_usando_o_activerecord_parte_02/&quot;&gt;depois mostrei uma exemplo prático&lt;/a&gt;
de sua utilização com o NHibernate, mostrando como ficou fácil
gerar os arquivos de mapeamento XML. &lt;/p&gt;


&lt;p&gt;Agora, veremos mais uma característica do
NHibernate e que, na verdade, é um dos principais motivos para sua
utilização: a portabilidade da sua aplicação para outro
gerenciador de banco de dados. Para ilustrar o exemplo, eu vou
pintar um cenário hipotético abusando das ilustrações.&lt;/p&gt;


&lt;p&gt;Imagine que você está trabalhando
como programador ou programador analista ou programanalista em
uma empresa na qual desenvolveu o sistema que atualmente está em
uso. &lt;/p&gt;


&lt;p&gt;Agora imagine que, em uma sexta-feira,
você chega no serviço todo contente, afinal é sexta-feira, e
logo ao chegar você é avisado que o seu chefe deseja falar com
você com urgência.&lt;/p&gt;


&lt;p&gt;Na sala do chefe você recebe a fatídica
notícia: por um problema com o fornecedor, o contrato para
utilização do banco de dados que a empresa está usando não
será renovado e ele deverá ser trocado com máxima urgência
até segunda-feira (Estamos na sexta, lembra? ). Você está recebendo a notícia somente a 3
dias de ter a nova versão do banco de dados em produção, pois havia uma 
expectativa de renovação que não se concretizou. &lt;/p&gt;


&lt;p&gt;&lt;span class=&quot;c1&quot;&gt;Resumindo: o 
pepino (como sempre) sobrou para a área de TI. &lt;/span&gt;&lt;/p&gt;


&lt;p&gt;Ao ouvir tal notícia você tentou
argumentar que deveria ter sido avisado com antecedência mas,
para resumir, não teve jeito, e você vai ter que trocar o banco
de dados atual da sua aplicação por um banco de dados open
source. E o escolhido foi o MySQL.&lt;/p&gt;


&lt;p&gt;Você terá que criar o banco de
dados, as tabelas, e importar os dados, mas esse não é o maior
problema. O problema é que você vai ter que mudar toda a sua
aplicação para acessar outro banco de dados, e isso em 3
dias, considerando que você vai ter que trabalhar sexta, sábado
e domingo para que o sistema esteja no ar na segunda, usando
o novo banco de dados.&lt;/p&gt;


&lt;p&gt;Neste momento você pode ter duas
reações, dependendo de como o seu projeto atual foi desenvolvido:&lt;/p&gt;


&lt;p&gt;01. O seu projeto foi desenvolvido
sem qualquer organização e é composto por centenas de
formulários onde se misturam regras de negócio, lógica de
acesso a dados e código para apresentação.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Neste
        cenário você vai ficar muito bravo, pois vai ter
        que ralar no final de semana, alterar milhares de linhas de código, trabalhando direto para
        fazer a migração da aplicação para usar o novo banco
        de dados MySQL sem saber se ao final as coisas vão
        funcionar, pois não terá tempo de testar.&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;&quot;&lt;/strong&gt;&lt;em&gt;&lt;strong&gt;Por
        que eu não segui o conselho do Macoratti e não adotei
        as boas práticas como uma arquitetura em camadas, padrões
        de projeto e os recursos da orientação a objetos? &quot;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;02. O seu projeto foi desenvolvido
com base nas boas práticas de programação usando uma
arquitetura em camadas, padrões de projeto e, para melhorar a
situação, você usou o NHibernate e ActiveRecord na sua camada
de acesso a dados, pois já previa que poderia haver uma mudança
no gerenciador de banco de dados que a empresa estava usando.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Neste
        cenário você sente que chegou o momento de mostrar a
        sua competência, pois vai conseguir efetuar a migração
        com pouco esforço. Na verdade, você nem vai ter que
        trabalhar no final de semana, pois o trabalho será apenas
        criar o banco de dados e as tabelas com a mesma estrutura
        no MySQL, e na sua aplicação você vai ter que apenas criar um novo 
        arquivo de configuração sem ter que mexer no código.&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;em&gt;&lt;strong&gt;&quot;Ainda bem que eu
        segui o conselho do Macoratti e adotei as boas práticas
        usando uma arquitetura em camadas, padrões de projeto e
        os recursos da orientação a objetos.&quot;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;Embora o cenário possa ser
hipotético (e um tanto exagerado), ele não é impossível de acontecer e, como
desenvolvedores, devemos estar sempre preparados para  contornar os 
problemas
que com certeza iremos encontrar na profissão.&lt;/p&gt;


&lt;p&gt;Para ilustrar como é simples
efetuar a migração de um banco de dados para outro quando se
usa o NHibernate, eu vou usar o exemplo já abordado na segunda
parte deste artigo onde usamos banco de dados SQL Server e vou
migrar a aplicação para usar o MySQL.&lt;/p&gt;


&lt;p&gt;A primeira coisa a fazer é criar o
banco de dados e as tabelas no MySQL. Abaixo temos a estrutura do
banco de dados SQL Server e das tabelas usadas pela aplicação:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15272/1.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Temos que ter cuidado na criação
do banco de dados e das tabelas, pois devemos manter a mesma
estrutura e os mesmos tipos de dados usados pela aplicação.&lt;/p&gt;


&lt;p&gt;Usando o &lt;strong&gt;MySQL Administrator&lt;/strong&gt;
vemos abaixo o novo banco de dados &lt;strong&gt;Clientes&lt;/strong&gt; e a
tabela &lt;strong&gt;a nova Contatos&lt;/strong&gt; criada no MySQL:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15272/2.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Após migrar os dados, vamos fazer a alteração na aplicação para
acessar o novo banco de dados e as tabelas no MySQL.&lt;/p&gt;


&lt;p&gt;Será que teremos que alterar alguma linha de código 
? Não, iremos mudar só o arquivo de configuração.&lt;/p&gt;


&lt;p&gt;Para isso basta alterar o arquivo&lt;strong&gt;
AppConfig.xml&lt;/strong&gt; conforme abaixo:&lt;/p&gt;


&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&amp;gt;&lt;br /&gt;&amp;lt;activerecord&amp;gt;&lt;br /&gt;  &amp;lt;config&amp;gt;&lt;br /&gt;    &amp;lt;add&lt;br /&gt;        key=&quot;connection.driver_class&quot;&lt;br /&gt;        value=&quot;&lt;strong&gt;NHibernate.Driver.MySqlDataDriver&lt;/strong&gt;&lt;strong&gt;&quot;&lt;/strong&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;add&lt;br /&gt;        key=&quot;dialect&quot;&lt;br /&gt;        value=&quot;&lt;strong&gt;NHibernate.Dialect.MySQLDialect&quot;&lt;/strong&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;add&lt;br /&gt;        key=&quot;connection.provider&quot;&lt;br /&gt;        value=&quot;&lt;strong&gt;NHibernate.Connection.DriverConnectionProvider&lt;/strong&gt;&quot; /&amp;gt;&lt;br /&gt;    &amp;lt;add&lt;br /&gt;        key=&quot;connection.connection_string&quot;&lt;br /&gt;        value=&quot;&lt;strong&gt;Server=localhost;Database=clientes;User ID=root;Password=xxxxxx&quot;&lt;/strong&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;add&lt;br /&gt;        key=&quot;proxyfactory.factory_class&quot;&lt;br /&gt;        value=&quot;&lt;strong&gt;NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle&lt;/strong&gt;&quot;  /&amp;gt;&lt;br /&gt;    &amp;lt;add&lt;br /&gt;        key=&quot;hbm2ddl.keywords&quot; value=&quot;none&quot; /&amp;gt;&lt;br /&gt;  &amp;lt;/config&amp;gt;&lt;br /&gt;&amp;lt;/activerecord&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Observe que alteramos as
informações referentes ao banco de dados usado, como:
driver de
conexão, dialeto, string de conexão, etc.&lt;/p&gt;


&lt;p&gt;Conseguimos, assim, portar uma 
aplicação que usava um banco de dados SQL Server para usar um banco de dados 
MySQL sem ter que mudar uma única linha de código, mexer em uma única regra de 
negócio.&lt;/p&gt;


&lt;p&gt;Fazendo apenas esta alteração já
podemos rodar a aplicação e verificar o seu funcionamento:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15272/3.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Você aproveitou um momento de crise, mostrou a sua competência e no final da sexta-feira teve mais
um motivo para comemorar! Tudo isso graças ao NHibernate e ao ActiveRecord. &lt;/p&gt;


&lt;p&gt;Pegue o projeto completo aqui: &lt;a href=&quot;http://www.macoratti.net/09/11/NHibernateActiveRecordDemoMySQL.zip&quot; class=&quot;ext&quot;&gt;NHibernateActiveRecordDemoMySQL.zip&lt;/a&gt; (sem as dlls das referências)&lt;/p&gt;


&lt;p&gt;Eu sei, é apenas NHibernate, mas eu
gosto...&lt;/p&gt;

</description>
            <author>macoratti@yahoo.com (José Carlos Macoratti)</author>
            <pubDate>Thu, 10 Dec 2009 11:15:00 +0100</pubDate>
            <guid>http://imasters.uol.com.br/artigo/15272</guid>
        </item>
        <item>
            <title>NHibernate - usando o ActiveRecord - Parte 02</title>
            <link>http://imasters.uol.com.br/artigo/15198/desenvolvimento/nhibernate_usando_o_activerecord_parte_02/</link>
            <description>&lt;p&gt;Na&lt;a href=&quot;http://imasters.uol.com.br/artigo/15113/desenvolvimento/nhibernate_usando_o_activerecord_parte_01/&quot;&gt;&lt;/a&gt; &lt;a href=&quot;http://imasters.uol.com.br/artigo/15113/desenvolvimento/nhibernate_usando_o_activerecord_parte_01/&quot;&gt;primeira parte deste artigo&lt;/a&gt; eu apresentei o 
ActiveRecord. Agora vou mostrar como usar este recurso em um projeto
Windows Forms usando a linguagem VB .NET.&lt;/p&gt;

&lt;p&gt;Apenas recordando, o ActiveRecord é um 
recurso que facilita a utilização do NHibernate poupando o trabalho de criar os 
arquivos XML de mapeamento OR/M, para isso é criada uma classe onde usamos 
atributos para realizar esta tarefa.&lt;/p&gt;

&lt;p&gt;Obs: 

&lt;span class=&quot;sentence sentenceHighlight&quot;&gt;
O projeto &lt;strong&gt;Castle ActiveRecord&lt;/strong&gt; oferece uma maneira rápida 
e fácil para implementar o padrão de registro ativo para aplicativos do 
Microsoft com base no .NET Framework.&lt;/span&gt;&lt;/p&gt;

&lt;h4&gt;Usando o ActiveRecord e 
o NHibernate em uma aplicação Windows Forms&lt;/h4&gt;

&lt;p&gt;Para que você possa entender como  implementar 
a utilização dos recursos do ActiveRecord em sua aplicação C# ou VB .NET, 
eu vou criar um exemplo usando a linguagem VB .NET no qual iremos realizar as 
seguintes tarefas:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Criação do banco de dados e da 
  tabela usando o SQL Server 2008 Express;&lt;/li&gt;

&lt;li&gt;Criação do projeto WIndows Forms;&lt;/li&gt;

&lt;li&gt;Definição das referências para 
  as DLLs do NHibernate e do ActiveRecord;&lt;/li&gt;

&lt;li&gt;Criação das classe para realizar 
  o mapeamento;&lt;/li&gt;

&lt;li&gt;Definição do arquivo de 
  configuração;&lt;/li&gt;

&lt;li&gt;Inicializando o Framework;&lt;/li&gt;

&lt;li&gt;Usando as classes na aplicação 
  Windows Forms;&lt;/li&gt;

&lt;/ul&gt;&lt;h4&gt;1. Criando o banco de dados e a 
tabela&lt;/h4&gt;

&lt;p&gt;A primeira coisa que eu vou fazer será criar o 
banco de dados Clientes e a tabela contatos no SQL Server 2008. 
Eu poderia criar as minhas classes de domínio e mandar gerar o banco de dados e 
as tabelas, mas por ser uma introdução vou seguir o caminho feliz.&lt;/p&gt;

&lt;p&gt;Eu vou criar o banco de dados e a tabela usando o
Microsoft SQL Server Management Studio. Abaixo 
vemos a estrutura da tabela definida com os campos : id, nome e email, 
sendo que id é um campo chave primária do tipo identity;&lt;/p&gt;

&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15198/1.gif&quot; /&gt;&lt;h4&gt;2. Criando o projeto Windows 
Forms e fazendo a referência ao NHibernate e ao ActiveRecord&lt;/h4&gt;

&lt;p&gt;Abra agora o Visual Basic 
2008 Express Edition e crie um novo projeto do tipo WIndows Forms 
Application com o nome NHibernateActiveRecordDemo;&lt;/p&gt;

&lt;p&gt;A seguir clique com o botão direito do mouse sobre 
o nome do projeto e selecione a opção Add Reference:&lt;/p&gt;

&lt;p&gt;Na guia Browse primeiro localize onde você 
instalou os arquivos do NHibernate e inclua as referências conforme a 
figura 1.0;&lt;/p&gt;

&lt;p&gt;Em seguida repita a operação selecionando as dlls 
na pasta onde você instalou as dlls do ActiveRecord conforme a figura 
2.0;&lt;/p&gt;

&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15198/2.gif&quot; /&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15198/3.gif&quot; /&gt;&lt;h4&gt;3. Criando a classe para efetuar 
o mapeamento OR/M&lt;/h4&gt;

&lt;p&gt;No menu Project selecione Add Class e 
informe o nome Contato.vb. Esta classe deverá herdar da classe 
ActiveRecordBase e usar os atributos do ActiveRecord para realizar o 
mapeamento OR/M para a tabela Contatos.&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Imports Castle.ActiveRecord&lt;br /&gt;&lt;br /&gt;&amp;lt;ActiveRecord(&quot;contatos&quot;)&amp;gt; _&lt;br /&gt;Public Class Contato&lt;br /&gt;Inherits ActiveRecordBase(Of Contato)&lt;br /&gt;&lt;br /&gt;    Private m_id As Integer&lt;br /&gt;    Private m_nome As String&lt;br /&gt;    Private m_email As String&lt;br /&gt;&lt;br /&gt;&amp;lt;PrimaryKey(&quot;Id&quot;)&amp;gt; _&lt;br /&gt;    Public Property Id() As Integer&lt;br /&gt;        Get&lt;br /&gt;            Return (m_id)&lt;br /&gt;        End Get&lt;br /&gt;        Set(ByVal value As Integer)&lt;br /&gt;            m_id = value&lt;br /&gt;        End Set&lt;br /&gt;    End Property&lt;br /&gt;&lt;br /&gt;    &amp;lt;[Property](&quot;Nome&quot;)&amp;gt; _&lt;br /&gt;    Public Property Nome() As String&lt;br /&gt;        Get&lt;br /&gt;            Return (m_nome)&lt;br /&gt;        End Get&lt;br /&gt;        Set(ByVal value As String)&lt;br /&gt;            m_nome = value&lt;br /&gt;        End Set&lt;br /&gt;    End Property&lt;br /&gt;&lt;br /&gt;    &amp;lt;[Property](&quot;Email&quot;)&amp;gt; _&lt;br /&gt;    Public Property Email() As String&lt;br /&gt;        Get&lt;br /&gt;            Return (m_email)&lt;br /&gt;        End Get&lt;br /&gt;        Set(ByVal value As String)&lt;br /&gt;            m_email = value&lt;br /&gt;        End Set&lt;br /&gt;    End Property&lt;br /&gt;&lt;br /&gt;End Class&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Neste arquivo 
    usamos o &lt;em&gt;namespace&lt;/em&gt; Castle.ActiveRecord 
    para ter acesso às classes e aos atributos;&lt;/p&gt;

&lt;p&gt;
    A classe Contato herda da classe 
    ActiveRecordBase() e dessa forma poderá 
    usar os métodos para mapear e persistir informações para o banco de dados;&lt;/p&gt;

&lt;p&gt;Definimos 3 propriedades e usamos os seguintes 
    atributos:&lt;/p&gt;

&lt;p&gt;- 
    &amp;lt;PrimaryKey(&quot;Id&quot;)&amp;gt; _&lt;br /&gt;
    - &amp;lt;[Property](&quot;Nome&quot;)&amp;gt; _&lt;br /&gt;
    - &amp;lt;[Property](&quot;Email&quot;)&amp;gt; _&lt;/p&gt;

&lt;p&gt;Para mapear as propriedades para os campos da 
    tabela Contatos.&lt;/p&gt;

&lt;p&gt;Não definimos explicitamente o nome da tabela 
    nem seu esquema, mas o ActiveRecord é capaz de inferir estas informações.&lt;/p&gt;

&lt;p&gt;
    &lt;span class=&quot;sentence&quot;&gt;Observe 
    que a classe Contato estende a classe ActiveRecordBase e usa 
    atributos para sinalizar quais propriedades mapeiam para colunas na 
    tabela de banco de dados e a coluna que serve como a chave primária.&lt;/span&gt; 
    &lt;/p&gt;

&lt;p&gt;
    &lt;span class=&quot;sentence sentenceHighlight&quot;&gt;
    A classe de ActiveRecordBase define métodos de instância, como criar 
    e salvar e métodos estáticos incluindo Find, FindAll e DeleteAll. 
 &lt;/span&gt;   &lt;/p&gt;

&lt;p&gt;
    &lt;span class=&quot;sentence&quot;&gt;Junto com 
    a criação da classe Contatos, você também vai precisar definir algumas 
    configurações de configuração, como a seqüência de conexão de banco de dados 
    e algumas poucas opções específicas de NHibernate.&lt;/span&gt; &lt;/p&gt;

&lt;p&gt;
    &lt;span class=&quot;sentence&quot;&gt;Mas não há 
    necessidade de escrever nenhum código de acesso a dados.&lt;/span&gt; &lt;span class=&quot;sentence&quot;&gt;que é 
    realizado para você automaticamente pelo projeto de&lt;/span&gt; 
    
    &lt;span class=&quot;sentence sentenceHighlight&quot;&gt;
    ActiveRecord&lt;/span&gt;&lt;span class=&quot;sentence&quot;&gt; e 
    NHibernate.&lt;/span&gt; &lt;/p&gt;

&lt;p&gt;
    &lt;span class=&quot;sentence sentenceHighlight&quot;&gt;
    Na verdade, você nem precisa ter criado as tabelas do banco de dados neste 
    ponto, como o projeto ActiveRecord pode automaticamente gerar as tabelas com 
    base nas classes que você criou. (Não vou usar este recursos neste 
    exemplo.)&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Obs: Nosso 
exemplo possui somente uma tabela, mas podemos trabalhar com relacionamentos 
entre tabelas. &lt;span class=&quot;sentence&quot;&gt;
A sintaxe do atributo do projeto ActiveRecord também é usada para estabelecer 
relacionamentos entre classes.&lt;/span&gt; 
&lt;span class=&quot;sentence&quot;&gt;Por exemplo, 
os atributos HasMany e BelongsTo podem ser usados em uma classe 
pai e filho, respectivamente, para indicar uma relação 
um-para-muitos.&lt;/span&gt;&lt;/p&gt;

&lt;h4&gt;4. Criando o arquivo XML para 
definir as configurações usadas pelo NHibernate&lt;/h4&gt;

&lt;p&gt;Vamos agora criar o arquivo de configuração para o
NHibernate com o nome AppConfig.xml conforme abaixo:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;?xml&lt;br /&gt;version=&quot;1.0&quot;&lt;br /&gt;encoding=&quot;utf-8&quot;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;activerecord&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;config&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;add&lt;br /&gt;&lt;br /&gt;            key=&quot;connection.driver_class&quot;&lt;br /&gt;&lt;br /&gt;           value=&quot;NHibernate.Driver.SqlClientDriver&quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;     &amp;lt;add&lt;br /&gt;&lt;br /&gt;            key=&quot;dialect&quot;&lt;br /&gt;&lt;br /&gt;            value=&quot;NHibernate.Dialect.MsSql2005Dialect&quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;     &amp;lt;add&lt;br /&gt;&lt;br /&gt;            key=&quot;connection.provider&quot;&lt;br /&gt;&lt;br /&gt;           value=&quot;NHibernate.Connection.DriverConnectionProvider&quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;     &amp;lt;add&lt;br /&gt;&lt;br /&gt;             key=&quot;connection.connection_string&quot;&lt;br /&gt;&lt;br /&gt;             value=&quot;Data Source=.&amp;#92;SQLEXPRESS;Initial Catalog=Clientes;Integrated Security=SSPI&quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;      &amp;lt;add&lt;br /&gt;&lt;br /&gt;            key=&quot;proxyfactory.factory_class&quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;            value=&quot;NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle&quot;&lt;br /&gt;&lt;br /&gt;&amp;lt;/config&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/activerecord&amp;gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Neste arquivo estamos definindo as seguintes 
informações:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;O driver do banco de dados 
  usados no projeto:  key=&quot;connection.driver_class&quot;&lt;/li&gt;

&lt;li&gt;O dialeto do banco de dados : 
  key=&quot;dialect&quot;&lt;/li&gt;

&lt;li&gt;O provedor da conexão : 
   key=&quot;connection.provider&quot;&lt;/li&gt;

&lt;li&gt;A string de conexão usada: 
   key=&quot;connection.connection_string&quot;&lt;/li&gt;

&lt;li&gt;O proxy :   key=&quot;proxyfactory.factory_class&quot; 
  /&amp;gt;&lt;/li&gt;

&lt;/ul&gt;&lt;p&gt;Estas informações referem-se ao banco de dados que 
estamos usando, no caso o SQL Server 2008 Express.&lt;/p&gt;

&lt;p&gt;Este arquivo XML deve estar localizado na pasta 
bin/debug quando o projeto estiver sendo executado no modo de debug.&lt;/p&gt;

&lt;p&gt;Neste momento o seu projeto deverá ter a seguinte 
estrutura:&lt;/p&gt;

&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15198/4.gif&quot; /&gt;&lt;p&gt;Vamos partir para a criação da interface e 
utilização na prática do ActiveRecord.&lt;/p&gt;

&lt;h4&gt;5. Criando o arquivo 
para inicializar o framework&lt;/h4&gt;

&lt;p&gt;No menu Project selecione Add Class e 
informe o nome App.vb e inclua nele o seguinte código:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Imports Castle.ActiveRecord&lt;br /&gt;Imports Castle.ActiveRecord.Framework&lt;br /&gt;Imports Castle.ActiveRecord.Framework.Config&lt;br /&gt;&lt;br /&gt;Public Class App&lt;br /&gt;&lt;br /&gt;    Public Shared Sub Main()&lt;br /&gt;        Dim source As XmlConfigurationSource = New XmlConfigurationSource(&quot;AppConfig.xml&quot;)&lt;br /&gt;ActiveRecordStarter.Initialize(source, GetType(Contato))&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;End Class&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Este arquivo irá ler as informações do arquivo 
AppConfig.xml criado e iniciar o framework usando o método Initialize 
da classe ActiveRecordStarter.&lt;/p&gt;

&lt;p&gt;Temos que executar este código antes de poder usar 
os recursos do ActiveRecord, e, sem fazer isso o projeto não vai 
funcionar.&lt;/p&gt;

&lt;h4&gt;6. Criando a interface com o 
usuário&lt;/h4&gt;

&lt;p&gt;Agora vamos criar uma interface usando o formulário 
form1.vb conforme a figura abaixo:&lt;/p&gt;

&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15198/5.gif&quot; /&gt;&lt;p&gt;Iremos implementar as funcionalidades de listar, 
incluir, alterar e excluir informações do banco de dados usando o NHibernate e o 
mapeamento gerado pelo ActiveRecord.&lt;/p&gt;

&lt;p&gt;a. Listando os 
contatos no DataGridView&lt;/p&gt;

&lt;p&gt;Vamos primeiro definir o código para listar 
as informações da tabela Contatos no evento Click do botão 
Listar:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Private Sub btnListar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnListar.Click&lt;br /&gt;        Try&lt;br /&gt;   gdvContato.DataSource = Contato.FindAll()&lt;br /&gt;        Catch ex As Exception&lt;br /&gt;            MsgBox(&quot; ERRO : &quot; &amp;amp; ex.Message)&lt;br /&gt;        End Try&lt;br /&gt;    End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Olhe bem o código que usamos; ele é responsável 
por obter os dados da tabela contatos e exibir no datagridview.&lt;/p&gt;

&lt;p&gt;Cadê o comando SQL, a conexão, 
os objetos 
Command, Connection , dataset, datable, dataadapter ????&lt;/p&gt;

&lt;p&gt;Esta é a vantagem em usar o NHibernate. Não 
precisamos de nada nisso. &lt;/p&gt;

&lt;p&gt;Estamos usando apenas o método FindAll() que 
retorna todas as instâncias do tipo Contato. Lembre-se de que a nossa classe 
Contato herda da classe 
    ActiveRecordBase(Of Contato).&lt;/p&gt;

&lt;p&gt;b. Criando um novo 
contato&lt;/p&gt;

&lt;p&gt;Para criar um novo contato eu vou incluir um novo 
formulário a partir do menu Project opção Add Windows Forms com o nome 
Novo.vb conforme o leiaute abaixo:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15198/6.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Este 
    formulário possui 3 Labels, 3 TextBox :&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;txtNome&lt;/li&gt;

&lt;li&gt;txtEmail&lt;/li&gt;

&lt;/ul&gt;&lt;p&gt;Dois controles Buttons:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;btnSalvar&lt;/li&gt;

&lt;li&gt;btnCancelar&lt;/li&gt;

&lt;/ul&gt;&lt;p&gt;Para incluir um novo Contato não é preciso informar 
o código do mesmo, visto que este campo foi definido como do tipo identity na 
tabela e é gerenciado pelo próprio banco de dados. &lt;/p&gt;

&lt;p&gt;O código do evento Click do botão Salvar 
do formulário Novo.vb é dado a seguir:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt; Private Sub btnSalvar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalvar.Click&lt;br /&gt;If txtNome.Text &amp;lt;&amp;gt; String.Empty And txtEmail.Text &amp;lt;&amp;gt; String.Empty Then&lt;br /&gt;Dim contato As New Contato&lt;br /&gt;contato.Nome = txtNome.Text&lt;br /&gt;contato.Email = txtEmail.Text&lt;br /&gt;Try&lt;br /&gt;contato.Create()&lt;br /&gt;txtNome.Text = &quot;&quot;&lt;br /&gt;txtEmail.Text = &quot;&quot;&lt;br /&gt;MsgBox(&quot;Contato criado com sucesso.&quot;)&lt;br /&gt;Catch ex As Exception&lt;br /&gt;MsgBox(&quot;Erro &quot; &amp;amp; ex.Message)&lt;br /&gt;End Try&lt;br /&gt;End If&lt;br /&gt;End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Neste código verificamos se foram informados 
valores para nome e email nas caixas de texto e em seguida criamos uma instância 
da classe Contato.&lt;/p&gt;

&lt;p&gt;A seguir atribuímos os valores para o objeto criado 
e usamos o método Create() que cria (Salva) uma nova instância do 
objeto para o banco de dados.&lt;/p&gt;

&lt;p&gt;Limpamos os controles e exibimos uma mensagem ao 
usuário. Ocorrendo erro emitimos um aviso.&lt;/p&gt;

&lt;p&gt;Antes que eu esqueça o código que abre este 
formulário está no evento Click do botão Novo do formulário Form1.vb :&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Private &lt;br /&gt;    Sub btnNovo_Click(ByVal &lt;br /&gt;    sender As &lt;br /&gt;    System.Object, ByVal &lt;br /&gt;    e As System.EventArgs)&lt;br /&gt;    Handles &lt;br /&gt;    btnNovo.Click&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;    
    My.Forms.Novo.ShowDialog()&lt;/p&gt;

&lt;p&gt;End
    Sub&lt;/p&gt;

&lt;p&gt;c. Alterando um 
contato existente&lt;/p&gt;

&lt;p&gt;O código do evento Click do botão Alterar 
do formulário Form1.vb  apenas abre um novo formulário que eu crie e chamei 
de Alterar.vb. O código é:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Private &lt;br /&gt;    Sub btnAlterar_Click(ByVal &lt;br /&gt;    sender As &lt;br /&gt;    System.Object, ByVal &lt;br /&gt;    e As System.EventArgs)&lt;br /&gt;    Handles &lt;br /&gt;    btnAlterar.Click    &lt;br /&gt;    My.Forms.Alterar.ShowDialog()&lt;br /&gt;End&lt;br /&gt;    Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Para alterar um contato eu vou incluir um novo 
formulário a partir do menu Project opção Add Windows Forms com o nome 
Alterar.vb conforme o leiaute abaixo:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15198/7.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Este 
    formulário possui 3 Labels, 3 TextBox :&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;txtCodigo&lt;/li&gt;

&lt;li&gt;txtNome&lt;/li&gt;

&lt;li&gt;txtEmail&lt;/li&gt;

&lt;/ul&gt;&lt;p&gt;Dois controles Buttons:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;btnSalvar&lt;/li&gt;

&lt;li&gt;btnCancelar&lt;/li&gt;

&lt;/ul&gt;&lt;p&gt;Dica: Como os formulário 
Novo.vb e Alterar.vb são iguais poderíamos ter usado a herança visual para 
criá-los.&lt;/p&gt;

&lt;p&gt;Neste formulário a propriedade Enabled do controle txtCodigo foi definida como False, pois não 
podemos alterar o código do contato.&lt;/p&gt;

&lt;p&gt;No evento Load do formulário Alterar.vb 
devemos incluir o código a seguir:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Private Sub Alterar_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load&lt;br /&gt;&lt;br /&gt; txtCodigo.Text = Form1.gdvContato.CurrentRow.Cells(0).Value.ToString()&lt;br /&gt;        txtNome.Text = Form1.gdvContato.CurrentRow.Cells(1).Value.ToString()&lt;br /&gt;        txtEmail.Text = Form1.gdvContato.CurrentRow.Cells(2).Value.ToString()&lt;br /&gt;    End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Este código apenas obtém os valores selecionados no 
controle DataGridView e os exibe nas caixas de texto do formulário 
Alterar.vb para que possamos realizar as mudanças.&lt;/p&gt;

&lt;p&gt;No evento Click do botão Salvar temos 
o seguinte código :&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Private Sub btnSalvar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalvar.Click&lt;br /&gt;&lt;br /&gt;        Dim codigo As Integer = Convert.ToInt32(txtCodigo.Text)&lt;br /&gt;        Dim contato As Contato = contato.Find(Convert.ToInt32(codigo))&lt;br /&gt;&lt;br /&gt;        contato.Nome = txtNome.Text&lt;br /&gt;        contato.Email = txtEmail.Text&lt;br /&gt;        Try&lt;br /&gt;  contato.Update()&lt;br /&gt;            MsgBox(&quot;Contato atualizado com sucesso.&quot;)&lt;br /&gt;        Catch ex As Exception&lt;br /&gt;            MsgBox(&quot;Erro &quot; &amp;amp; ex.Message)&lt;br /&gt;        End Try&lt;br /&gt;    End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O código obtém o código da caixa de texto e usando 
o método Find() procura pelo objeto na coleção de objetos.&lt;/p&gt;

&lt;p&gt;Em seguida atribui os valores definidos nas caixas 
de texto ao objeto encontrado e usando o método Update() atualiza as 
informações no banco de dados.&lt;/p&gt;

&lt;p&gt;d. Excluindo um 
contato existente&lt;/p&gt;

&lt;p&gt;Para excluir um contato existente incluímos o 
código abaixo no evento Click do botão Excluir:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt; Private Sub btnExcluir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExcluir.Click&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If (MsgBox(&quot;Deseja excluir o contato : &quot; &amp;amp;&lt;br /&gt;gdvContato.CurrentRow.Cells(1).Value.ToString(), MsgBoxStyle.YesNo) =&lt;br /&gt;MsgBoxResult.Yes) Then&lt;br /&gt;            Dim codigo As Integer = Convert.ToInt32(gdvContato.CurrentRow.Cells(0).Value.ToString())&lt;br /&gt;            Dim contato As Contato = contato.Find(Convert.ToInt32(codigo))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            Try&lt;br /&gt;  contato.Delete()&lt;br /&gt;                MsgBox(&quot;Contato excluído com sucesso.&quot;)&lt;br /&gt;            Catch ex As Exception&lt;br /&gt;                MsgBox(&quot;Erro &quot; &amp;amp; ex.Message)&lt;br /&gt;            End Try&lt;br /&gt;        End If&lt;br /&gt;    End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;No código, primeiro obtemos o valor do código do 
contato a partir da célula do DataGridView selecionada e em seguida, usando o 
método Find(), procuramos pelo objeto na coleção de objetos.&lt;/p&gt;

&lt;p&gt;Para excluir o objeto usamos o método Delete() 
que deleta uma instância do banco de dados.&lt;/p&gt;

&lt;p&gt;Abaixo vemos a aplicação em execução mostrando a 
alteração de um contato:&lt;/p&gt;

&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/15198/8.gif&quot; /&gt;&lt;p&gt;Como podemos notar, o NHibernate realiza as 
operações de persistência usando os métodos apropriados de forma que no nosso 
código não precisamos usar instruções SQL nem os objetos ADO .NET para realizar 
a conexão, criar comandos para efetivar tais operações.&lt;/p&gt;

&lt;p&gt;De uma forma resumida podemos dizer que por trás 
dos panos, quando usamos o ActiveRecord, ocorrem as seguintes tarefas:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;os comandos SQL são gerados;&lt;/li&gt;

&lt;li&gt;os comandos SQL são passados 
  para o Gerenciador de banco de dados em uso (RDBMS);&lt;/li&gt;

&lt;li&gt;o RDBMS compila e executa 
  o SQL;&lt;/li&gt;

&lt;li&gt;retorna um enumerable;&lt;/li&gt;

&lt;li&gt;cria um modelo ActiveRecord para 
  cada linha;&lt;/li&gt;

&lt;/ul&gt;&lt;p&gt;Pegue o projeto completo aqui:&lt;strong&gt;
&lt;a href=&quot;http://www.macoratti.net/09/11/NHibernateActiveRecordDemoSQLServer.zip&quot;&gt;
NHibernateActiveRecordDemoSQLServer.zip&lt;/a&gt; (sem as referências)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O código ficou mais limpo e fácil de manter e ainda 
temos uma vantagem adicional: se precisarmos mudar o banco de dados, a única 
alteração que devemos fazer será no arquivo de configuração AppConfig.xml. É isso que irei mostrar na continuação deste 
artigo.&lt;/p&gt;

&lt;p&gt;Eu sei, é apenas NHibernate, mas eu gosto...&lt;/p&gt;

</description>
            <author>macoratti@yahoo.com (José Carlos Macoratti)</author>
            <pubDate>Thu, 03 Dec 2009 11:15:00 +0100</pubDate>
            <guid>http://imasters.uol.com.br/artigo/15198</guid>
        </item>
        <item>
            <title>VB .NET - Monitorando as notificações de eventos do sistema</title>
            <link>http://imasters.uol.com.br/artigo/14530/dotnet/vb_net_monitorando_as_notificacoes_de_eventos_do_sistema/</link>
            <description>&lt;p&gt;
&lt;span class=&quot;sentence sentencehighlight&quot;&gt;
A classe&lt;/span&gt; SystemEvents&lt;span class=&quot;sentence sentencehighlight&quot;&gt; 
fornece acesso às notificações de eventos do sistema e também  fornece a capacidade
&lt;/span&gt;&lt;span class=&quot;sentence&quot;&gt;
para responder a tipos específicos de eventos do sistema. &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;


&lt;p&gt;&lt;span class=&quot;sentence&quot;&gt;Quando um 
evento do sistema é gerado, os delegados anexados ao evento são chamados usando 
a linha de execução que monitora os eventos do sistema.&lt;/span&gt;&lt;span class=&quot;sentence&quot;&gt; 
Portanto, você deve fazer qualquer chamada de seu manipulador de evento.&lt;/span&gt;&lt;span class=&quot;sentence sentencehighlight&quot;&gt; 
Se você precisar chamar um evento do sistema que não é exposto como um membro da 
classe, você pode usar o método 

InvokeOnEventsThread.&lt;/span&gt;&lt;/p&gt;


&lt;p&gt;&lt;span class=&quot;sentence sentenceHighlight&quot;&gt;A seguir 
temos alguns dos métodos da classe SystemEvents:&lt;/span&gt;&lt;/p&gt;


&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;
    Nome&lt;/th&gt;
    &lt;th&gt;
    Descrição&lt;/th&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
    &lt;a href=&quot;http://msdn.microsoft.com/pt-br/library/microsoft.win32.systemevents.createtimer.aspx&quot;&gt;
    CreateTimer&lt;/a&gt; &lt;/td&gt;
    &lt;td&gt;
    
    &lt;span class=&quot;sentence&quot;&gt;Cria uma 
    nova janela Timer associado à janela eventos do sistema.&lt;/span&gt; 
    &lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
    &lt;a href=&quot;http://msdn.microsoft.com/pt-br/library/bsc2ak47.aspx&quot;&gt;
    Equals&lt;/a&gt; &lt;/td&gt;
    &lt;td&gt;
    
    &lt;span class=&quot;sentence&quot;&gt;Determina 
    se o objeto especificado é igual ao objeto&lt;span class=&quot;keyword&quot;&gt; atual.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
    &lt;a href=&quot;http://msdn.microsoft.com/pt-br/library/system.object.finalize.aspx&quot;&gt;
    Finalize&lt;/a&gt; &lt;/td&gt;
    &lt;td&gt;
    
    &lt;span class=&quot;sentence&quot;&gt;Permite que 
    um objeto tente liberar recursos e executar outras operações de 
    limpeza antes de o objeto ser recuperado por coleta de lixo.&lt;/span&gt; 
    &lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
    &lt;a href=&quot;http://msdn.microsoft.com/pt-br/library/system.object.gethashcode.aspx&quot;&gt;
    GetHashCode&lt;/a&gt; &lt;/td&gt;
    &lt;td&gt;
    
    &lt;span class=&quot;sentence&quot;&gt;Serve como 
    uma função hash para um tipo específico.&lt;/span&gt; &lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
    &lt;a href=&quot;http://msdn.microsoft.com/pt-br/library/system.object.gettype.aspx&quot;&gt;
    GetType&lt;/a&gt; &lt;/td&gt;
    &lt;td&gt;
    
    &lt;span class=&quot;sentence&quot;&gt;Obtém o tipo da instância 
    atual.&lt;/span&gt; &lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
    &lt;a href=&quot;http://msdn.microsoft.com/pt-br/library/microsoft.win32.systemevents.invokeoneventsthread.aspx&quot;&gt;
    InvokeOnEventsThread&lt;/a&gt; &lt;/td&gt;
    &lt;td&gt;
    
    &lt;span class=&quot;sentence&quot;&gt;Chama o 
    representante especificado o segmento que escuta eventos do sistema.
  &lt;/span&gt;  &lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
    &lt;a href=&quot;http://msdn.microsoft.com/pt-br/library/microsoft.win32.systemevents.killtimer.aspx&quot;&gt;
    KillTimer&lt;/a&gt; &lt;/td&gt;
    &lt;td&gt;
    
    &lt;span class=&quot;sentence&quot;&gt;Encerra o 
    timer especificado por determinada identificação.&lt;/span&gt; &lt;/td&gt;
  &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
    &lt;a href=&quot;http://msdn.microsoft.com/pt-br/library/system.object.memberwiseclone.aspx&quot;&gt;
    MemberwiseClone&lt;/a&gt; &lt;/td&gt;
    &lt;td&gt;
    
    &lt;span class=&quot;sentence&quot;&gt;Cria uma 
    cópia superficial do objeto atual.&lt;/span&gt; &lt;/td&gt;
  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;Podemos, então, usar esta classe para verificar 
alterações no sistema operacional e neste artigo vou mostrar alguns exemplos.&lt;/p&gt;


&lt;p&gt;Como a quantidade de eventos e condições que podem 
ser monitorados são enormes, vou mostrar apenas alguns para que você tenha noção 
de como podemos usar este recurso.&lt;/p&gt;


&lt;p&gt;Lembrando que SystemEvents são eventos 
disparados pelo sistema em resposta a ações que afetam o ambiente operacional. 
Não confunda SystemEvents com eventos Win32, que são eventos do
Kernell, acessíveis por todos os programas. Abaixo 
temos alguns eventos disparados pela classe SystemEvents:&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;DisplaySettingsChanged  
  -  Ocorre quando o usuário altera a exibição das configurações;&lt;/li&gt;

&lt;li&gt;EventsThreadShutdown  
  -  Ocorre antes da thread que escuta os 
  eventos do sistema terminar; &lt;/li&gt;

&lt;li&gt;InstalledFontsChanged  
  -  Ocorre quando o usuário inclui ou remove fontes ao sistema;&lt;/li&gt;

&lt;li&gt;LowMemory 
  - Ocorre quando o sistema está rodando abaixo da memória RAM;&lt;/li&gt;

&lt;li&gt;PaletteChanged 
  - Ocorre quando o usuário muda para uma aplicação que usa uma paleta 
  diferença;&lt;/li&gt;

&lt;li&gt;PowerModeChanged  
  - Ocorre quando o usuário suspende ou reinicia o sistema;&lt;/li&gt;

&lt;li&gt;SessionEnded 
  - Ocorre quando o usuário está efetuando um logoff 
  ou um shutdown no sistema;&lt;/li&gt;

&lt;li&gt;SessionEnding 
  - Ocorre quando o usuário tenta efetuar um logoff 
  ou um shutdown no sistema;&lt;/li&gt;

&lt;li&gt;TimeChanged 
  - Ocorre quando o usuário muda a hora do sistema;&lt;/li&gt;

&lt;li&gt;TimerElapsed - 
  Ocorre quando o timer do Windows expirou;&lt;/li&gt;

&lt;li&gt;UserPreferenceChanged - 
  Ocorre quando uma preferência do usuário sofreu uma mudança;&lt;/li&gt;

&lt;li&gt;UserPreferenceChanging 
  - Ocorre quando uma preferência do usuário está sendo modificada;&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;Criando um exemplo para 
efetuar a monitoração de eventos&lt;/h4&gt;


&lt;p&gt;Os namespaces 
usados no exemplo deste artigo são definidos pelas seguintes declarações:&lt;/p&gt;


&lt;p&gt;Imports 
System&lt;br /&gt;
Imports Microsoft.Win32&lt;br /&gt;&lt;br /&gt;
Crie um novo projeto Windows Forms no
Visual Basic 2008  Express Edition e no 
formulário padrão coloque o código abaixo:
&lt;/p&gt;


&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt; Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load&lt;br /&gt;        'Define classe SystemEvents para receber as notificações dos eventos &lt;br /&gt;        'quando uma preferência do usuário for alterada, a paleta sofre alteração, a exibição das configurações mudar &lt;br /&gt;        'ou quando ocorrer uma alteração na data/hora&lt;br /&gt;        AddHandler SystemEvents.UserPreferenceChanging, AddressOf SystemEvents_UserPreferenceChanging&lt;br /&gt;        AddHandler SystemEvents.PaletteChanged, AddressOf SystemEvents_PaletteChanged&lt;br /&gt;        AddHandler SystemEvents.DisplaySettingsChanged, AddressOf SystemEvents_DisplaySettingsChanged&lt;br /&gt;        AddHandler Microsoft.Win32.SystemEvents.TimeChanged, AddressOf TimeChangedEvent&lt;br /&gt;&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;    'Verifica alterações na data/hora do sistema&lt;br /&gt;    Sub TimeChangedEvent(ByVal sender As Object, ByVal e As System.EventArgs)&lt;br /&gt;        MessageBox.Show(&quot;A data/hora do sistema foi alterada&quot;)&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;    ' Este método é chamado quando uma preferência do usuário é alterada.&lt;br /&gt;    Private Sub SystemEvents_UserPreferenceChanging(ByVal sender As Object, ByVal e As UserPreferenceChangingEventArgs)&lt;br /&gt;        MessageBox.Show(&quot;Alteração de preferencias do usuário : &quot; &amp;amp; e.Category.ToString())&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;    ' Este método é chamado quando a paleta é alterada.&lt;br /&gt;    Private Sub SystemEvents_PaletteChanged(ByVal sender As Object, ByVal e As EventArgs)&lt;br /&gt;        MessageBox.Show(&quot;Ocorreu uma alteração na Paleta&quot;)&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;    ' Este método é chamado quando as exibição das configurações muda&lt;br /&gt;    Private Sub SystemEvents_DisplaySettingsChanged(ByVal sender As Object, ByVal e As EventArgs)&lt;br /&gt;        MessageBox.Show(&quot;Exibição das configurações foi alterada.&quot;)&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;    ' Verifica as alterações das preferências do usuário&lt;br /&gt;    Sub UserPreferenceChangedEvent(ByVal sender As Object, ByVal e As Microsoft.Win32.UserPreferenceChangedEventArgs)&lt;br /&gt;        ' Verifica a categoria alterada&lt;br /&gt;        Select Case e.Category&lt;br /&gt;            Case Microsoft.Win32.UserPreferenceCategory.Color&lt;br /&gt;                MessageBox.Show(&quot;Foram alteradas as cores do sistema&quot;)&lt;br /&gt;            Case Microsoft.Win32.UserPreferenceCategory.Screensaver&lt;br /&gt;                MessageBox.Show(&quot;Foi alterado o screensaver do sistema&quot;)&lt;br /&gt;            Case Microsoft.Win32.UserPreferenceCategory.Window&lt;br /&gt;                MessageBox.Show(&quot;Foram alteradas dimensões ou características do sistema&quot;)&lt;br /&gt;        End Select&lt;br /&gt;    End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Para testar o código acima, execute o projeto e 
efetue uma alteração relacionada ao evento que estamos monitorando, como, por 
exemplo, alterar a data do sistema. Você receberá um aviso emitido pela aplicação,
indicando que o evento está sendo monitorado.&lt;/p&gt;


&lt;p&gt;Podemos usar os recursos da infra-estrutura da 
plataforma .NET, como a classe SystemEvents para 
criar algo útil, como monitorar os eventos para realizar algumas tarefas, como 
gerar um log de auditoria ou não permitir que certas ações sejam executadas, como 
não permitir o log off enquanto os dados não forem salvos, etc.&lt;/p&gt;


&lt;p&gt;Eu sei, é apenas VB .NET, mas eu gosto...&lt;/p&gt;


&lt;p&gt;Referências:&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;
  &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.aspx&quot;&gt;
  http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.aspx&lt;/a&gt;&lt;/li&gt;

&lt;/ul&gt;</description>
            <author>macoratti@yahoo.com (José Carlos Macoratti)</author>
            <pubDate>Wed, 07 Oct 2009 10:30:00 +0100</pubDate>
            <guid>http://imasters.uol.com.br/artigo/14530</guid>
        </item>
        <item>
            <title>.NET - Usando Generics</title>
            <link>http://imasters.uol.com.br/artigo/14146/dotnet/net_usando_generics/</link>
            <description>&lt;p&gt;A versão 2.0
da plataforma .NET introduziu as coleções genéricas que
ficam agrupadas no namespace System.Collections.Generics; Generics permite a definição de tipos em tempo de execução.&lt;/p&gt;

&lt;p&gt;Podemos dizer
que &lt;strong&gt;Generics&lt;/strong&gt; são coleções tipadas de modo que
somente um tipo de dado pertença à coleção. Ao se tentar
inserir outro tipo de dado, o compilador irá reclamar. Assim
sabemos o que cada coleção contém e não precisamos fazer a
conversão na hora de retirar um item da coleção. &lt;/p&gt;

&lt;p&gt;Estas coleções &lt;strong&gt;Generics&lt;/strong&gt;
são fortemente tipadas, ou seja, estão disponíveis no
intelissense e são verificadas pelo compilador, o que evita
erros e torna mais fácil a vida do desenvolvedor.&lt;/p&gt;

&lt;p&gt;Os
        problemas que envolvem o uso de coleções no VB.NET
        podem ser resumidos da seguinte forma:

        &lt;/p&gt;

&lt;ul&gt;&lt;li&gt;As
                coleções aceitam qualquer tipo de dados; 

            &lt;/li&gt;

&lt;li&gt;As
                coleções fazem a conversão implícita dos
                tipos de dados para Object;
             

            &lt;/li&gt;

&lt;li&gt;Ao
                tratarmos os itens das coleções temos que fazer
                o caminho de volta 
            Object-&amp;gt; tipo-do-item 
            via casting;

            &lt;/li&gt;

&lt;li&gt;As
                coleções não exibem suas propriedades no 
            intelissense;
            
                

            &lt;/li&gt;

&lt;li&gt;Tudo
                isto é transparente para o desenvolvedor e a
                depuração pode ser traumática.;

            &lt;/li&gt;

&lt;/ul&gt;&lt;p&gt;As principais
coleções genéricas são:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;List(Of 
        T) -  Representa uma lista fortemente tipada de
        objetos que podem ser acessados através de um índice.
        Fornece os métodos Search, Sort e efetua a
        manipulação da lista. 

    &lt;/li&gt;

&lt;li&gt;LinkdeList(Of 
        T) - Organiza os itens na forma de uma lista
        duplamente ligada. 

    &lt;/li&gt;

&lt;li&gt;Stack(Of
        T) - Organiza os itens na forma de um pilha.(LIFO -
        last-in first-out) 

    &lt;/li&gt;

&lt;li&gt;SortedList(Of
        TKey, TValue) - Representa uma coleção de
        pares representados por chave/valor que são
        ordenados pela chave com base na implementação de System.Collections.Generic.IComparable
        associada. 

    &lt;/li&gt;

&lt;li&gt;SortedDictionary(Of
        TKey, TValue) - Representa uma coleção de
        pares representados por chave/valor que são
        ordenados pela chave. 

    &lt;/li&gt;

&lt;li&gt;Queue(Of
        T) - Organiza os itens na forma de uma fila.(FIFO -
        first-in firs-out) 

    &lt;/li&gt;

&lt;/ul&gt;&lt;p&gt;Nota: O parâmetro (Of T) na declaração
da lista é obrigatório e indica qual o tipo de dados que
poderá ser incluído na coleção.&lt;/p&gt;

&lt;h4&gt;Começando pelo começo&lt;/h4&gt;

&lt;p&gt;Um das coleções
genéricas mais usada é a&lt;strong&gt; List(Of (T))&lt;/strong&gt;, onde se
define o tipo da coleção que se pretende usar.&lt;/p&gt;

&lt;p&gt;Vamos iniciar um exemplo
bem simples definindo uma lista do tipo String:&lt;/p&gt;

&lt;p&gt;Abra o Visual Basic 2008
Express Edition e crie um novo projeto do tipo Windows
Application com o nome usandoGenerics;&lt;/p&gt;

&lt;p&gt;Inclua os seguintes
controles no formulário: ListBox (lstALunos) , TextBox (txtNome)
e Button1 (btnProcurar) e Button2(btnListar) conforme o leiaute
abaixo:&lt;/p&gt;

&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/14146/1.gif&quot; /&gt;&lt;p&gt;No formulário padrão
form1.vb no início da classe Form1 vamos declarar uma lista do
tipo String:&lt;/p&gt;

&lt;p&gt;' Cria uma nova
lista do tipo &quot;string&quot;&lt;br /&gt;&lt;strong&gt;Dim listaAlunos As New List(Of String)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Onde &lt;strong&gt;List(Of T)&lt;/strong&gt; repesenta
uma lista fortemente tipada que pode ser acessada pelo índice e
fornece métodos para ordenar, procurar e manipular listas.&lt;/p&gt;

&lt;p&gt;No evento Load do formulário vamos
popular a lista com nomes:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load&lt;br /&gt;        'Inclui nomes na lista&lt;br /&gt;        listaAlunos.Add(&quot;Macoratti&quot;)&lt;br /&gt;        listaAlunos.Add(&quot;Jefferson&quot;)&lt;br /&gt;        listaAlunos.Add(&quot;Jessica&quot;)&lt;br /&gt;        listaAlunos.Add(&quot;Janice&quot;)&lt;br /&gt;        listaAlunos.Add(&quot;Bianca&quot;)&lt;br /&gt;        listaAlunos.Add(&quot;Yuri&quot;)&lt;br /&gt;        listaAlunos.Add(&quot;Larissa&quot;)&lt;br /&gt;        listaAlunos.Add(&quot;Larissa&quot;)&lt;br /&gt;        listaAlunos.Add(&quot;Madalena&quot;)&lt;br /&gt;        listaAlunos.Add(&quot;Marcia&quot;)&lt;br /&gt;        listaAlunos.Add(&quot;Carlos&quot;)&lt;br /&gt;    End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Agora no evento &lt;strong&gt;Click&lt;/strong&gt;
do botão de comando inclua o seguinte código:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Private Sub btnProcurar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExibir.Click&lt;br /&gt;        Dim nomeAluno As String = txtNome.Text&lt;br /&gt;        ' Encontrou o nome&lt;br /&gt;        If listaAlunos.Contains(nomeAluno) Then&lt;br /&gt;            ' Exibe o nome e o total de nomes&lt;br /&gt;            Dim msg As String = &quot;{0} foi encontrado em uma relação de  {1} nome(s)&quot;&lt;br /&gt;            lstAlunos.Items.Add(String.Format(msg, nomeAluno, listaAlunos.Count))&lt;br /&gt;        Else&lt;br /&gt;            ' Não encontrou nome na lista&lt;br /&gt;            lstAlunos.Items.Add(&quot;Nome não encontrado na lista!&quot;)&lt;br /&gt;        End If&lt;br /&gt;    End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Neste código usamos os seguintes
métodos da lista :&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Contains - determina se um
        elemento está na lista;&lt;/li&gt;

&lt;li&gt;Count - obtém o número de
        elementos contidos na lista;&lt;/li&gt;

&lt;/ul&gt;&lt;p&gt;Para listar o conteúdo da lista
incluímos o código abaixo no evento Click do botão Listar:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;  Private Sub btnListar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnListar.Click&lt;br /&gt;        For i = 0 To listaAlunos.Count - 1&lt;br /&gt;            lstAlunos.Items.Add(listaAlunos(i))&lt;br /&gt;        Next&lt;br /&gt;  End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Como alternativa para listar o
conteúdo de uma lista tipada podemos também usar os seguintes
métodos:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;For Each nome As String In listaAlunos&lt;br /&gt;      lstAlunos.Items.Add(nome)&lt;br /&gt;Next&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Usando o loop&lt;strong&gt; For
        Each&lt;/strong&gt; percorremos a lista e exibimos o nome &lt;/p&gt;

&lt;p&gt;ou ainda:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;    Dim atual As String&lt;br /&gt;    Dim en As IEnumerator(Of String) = listaAlunos.GetEnumerator()&lt;br /&gt;    While (en.MoveNext())&lt;br /&gt;         atual = en.Current&lt;br /&gt;        lstAlunos.Items.Add(atual)&lt;br /&gt;    End While&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Usando o &lt;strong&gt;GetEnumerator&lt;/strong&gt;(),
        que é um função da interface &lt;em&gt;IEnumerable&lt;/em&gt;, obtemos um enumerator com o qual
        podemos 
        percorrer a coleção usando a função &lt;strong&gt;MoveNext&lt;/strong&gt;().&lt;/p&gt;

&lt;p&gt;Quando usamos o &lt;strong&gt;MoveNext&lt;/strong&gt;(),
        o enumerator vai para a primeira
        posição da coleção e podemos acessar o seu valor
        usando a
         propriedade &lt;strong&gt;Current&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ao chegar ao final da
        coleção para retornar usamos a propriedade &lt;strong&gt;Reset&lt;/strong&gt;.
        &lt;/p&gt;

&lt;p&gt;Se você desejar ordernar a lista,
basta usar a função&lt;strong&gt; Sort:&lt;/strong&gt; listaAlunos.Sort().
 &lt;/p&gt;

&lt;p&gt;Se desejar passar os nomes da lista
para caixa baixa, use o método &lt;strong&gt;ToLower&lt;/strong&gt;. Quer
caixa alta? Então use a função &lt;strong&gt;ToUpper&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No exemplo abaixo usamos as
funções &lt;strong&gt;Sort&lt;/strong&gt; para ordernar e &lt;strong&gt;ToUpper&lt;/strong&gt;
para colocar em caixa alta os nomes da lista:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Dim atual&lt;br /&gt;        As String&lt;br /&gt;&lt;br /&gt;        listaAlunos&lt;strong&gt;.Sort()&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;        Dim en As IEnumerator(Of String) = listaAlunos.&lt;strong&gt;GetEnumerator()&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;        While (en.MoveNext())&lt;br /&gt;&lt;br /&gt;            atual = en.Current.&lt;strong&gt;ToUpper()&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;            lstAlunos.Items.Add(atual)&lt;br /&gt;&lt;br /&gt;        End While&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/14146/2.gif&quot; /&gt;&lt;p&gt;Com o advento do Generics, podemos
usar um código mais limpo e otimizado em nossas aplicações que
tratam com coleções de dados como as aplicações que usam
Banco de dados Relacionais.&lt;/p&gt;

&lt;p&gt;Neste caso podemos criar uma classe
definindo um tipo de dado para a nossa entidade e depois definir
uma lista genérica do tipo da classe que implementamos. Entendeu? Bem, vamos mostrar isso na prática...&lt;/p&gt;

&lt;p&gt;Neste exemplo eu vou criar uma
aplicação ASP .NET usando a linguagem VB .NET que terá como
objetivo acessar a tabela Alunos em um banco de dados SQL
Server
Express Edition (Vou usar a versão 2005) e exibir a relação
de alunos em uma página web.&lt;/p&gt;

&lt;p&gt;Até agora nada de mais, você pode estar
pensando. A novidade é que eu vou usar generics para obter uma
lista dos alunos que estão na tabela Alunos. Vejamos...&lt;/p&gt;

&lt;p&gt;Abra o Visual Web Developer 2008
Express Edition e crie um novo web site usando o template ASP
.NET Web Site com o nome listaAlunosGenerics;&lt;/p&gt;

&lt;p&gt;A seguir clique no menu Web Site e
selecione a opção Add new Item e na janela Templates selecione
o template SQL Server DataBase, informe o nome Escola.mdf e
clique em Add;&lt;/p&gt;

&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/14146/3.gif&quot; /&gt;&lt;p&gt;Clique no botão &lt;strong&gt;Sim&lt;/strong&gt;
para salvar o banco de dados na pasta &lt;strong&gt;App_Data&lt;/strong&gt;:&lt;/p&gt;

&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/14146/4.gif&quot; /&gt;&lt;p&gt;A seguir abra o banco de dados na
janela&lt;strong&gt; DataBase Explorer&lt;/strong&gt; e crie a tabela &lt;strong&gt;Alunos&lt;/strong&gt;
com a seguinte estrutura:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;i&lt;strong&gt;d - int&lt;/strong&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;nome - nvarchar(50)&lt;/strong&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;email - nvarchar(80)&lt;/strong&gt;&lt;/li&gt;

&lt;/ul&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/14146/5.gif&quot; /&gt;&lt;p&gt;Clique com o botão direito do mouse
sobre a tabela criada , selecione a opção &lt;strong&gt;Show Table
Data&lt;/strong&gt; e inclua alguns registros na tabela.&lt;/p&gt;

&lt;p&gt;Selecione a página Default.aspx e
inclua um componente GridView com id=gdvAlunos na página:&lt;/p&gt;

&lt;p&gt;Agora vamos criar uma classe que
representará a nossa tabela Alunos como uma entidade. Para isso,
no menu Web Site, selecione Add New Item e, em templates, selecione
Class e informe o nome Aluno.vb e clique em Add;&lt;/p&gt;

&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/14146/6.gif&quot; /&gt;&lt;p&gt;Confirme a opção para salvar o
arquivo na pasta &lt;strong&gt;App_Code&lt;/strong&gt;;&lt;/p&gt;

&lt;p&gt;Defina o código abaixo no arquivo
Alunos.vb:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Public Class Aluno&lt;br /&gt;    Dim _id As Long&lt;br /&gt;    Dim _nome As String&lt;br /&gt;    Dim _email As String&lt;br /&gt;&lt;br /&gt;    ReadOnly Property ID() As Long&lt;br /&gt;        Get&lt;br /&gt;            Return _id&lt;br /&gt;        End Get&lt;br /&gt;        Set(ByVal value As Long)&lt;br /&gt;            _id = value&lt;br /&gt;        End Set&lt;br /&gt;    End Property&lt;br /&gt;    Property Nome() As String&lt;br /&gt;        Get&lt;br /&gt;            Return _nome&lt;br /&gt;        End Get&lt;br /&gt;        Set(ByVal value As String)&lt;br /&gt;            _nome = value&lt;br /&gt;        End Set&lt;br /&gt;    End Property&lt;br /&gt;    Property Email() As String&lt;br /&gt;        Get&lt;br /&gt;            Return _email&lt;br /&gt;        End Get&lt;br /&gt;        Set(ByVal value As String)&lt;br /&gt;            _email = value&lt;br /&gt;        End Set&lt;br /&gt;    End Property&lt;br /&gt;End Class&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O código
        define 3 membros e 2 propriedades para a classe Aluno que
        representa um aluno com id, nome e email.&lt;/p&gt;

&lt;p&gt;Agora só resta criar o código no
arquivo code-behind Default.aspx.vb para acessar o banco de dados,
obter os registros e gerar a lista genérica usando a classe
Aluno como tipo.&lt;/p&gt;

&lt;p&gt;Abra o arquivo code-behind
Default.aspx.vb e inclua o código abaixo:&lt;/p&gt;

&lt;p&gt;Imports usados:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Imports
System.Data&lt;br /&gt;
Imports System.Data.SqlClient&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;
O método getAlunos() que acessa o banco de dados e gera uma lista 
contendo uma coleção de objetos do tipo Aluno:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;  Private Function getAlunos() As List(Of Aluno)&lt;br /&gt;&lt;br /&gt; Dim&lt;br /&gt;strConn As String = &quot;Data&lt;br /&gt;Source=.&amp;#92;SQLEXPRESS;AttachDbFilename=C:&amp;#92;_aspn&amp;#92;listaAlunosGenerics&amp;#92;App_Data&amp;#92;Escola.mdf;Integrated&lt;br /&gt;Security=True;User Instance=True&quot;&lt;br /&gt;        Dim sql As String = &quot;Select * from Alunos&quot;&lt;br /&gt; Dim listaAlunos As List(Of Aluno) = New List(Of Aluno)&lt;br /&gt;        Dim con As SqlConnection = New SqlConnection(strConn)&lt;br /&gt;&lt;br /&gt;        Try&lt;br /&gt;            Dim cmd As SqlCommand = New SqlCommand(sql, con)&lt;br /&gt;            con.Open()&lt;br /&gt;            Dim dr As SqlDataReader = cmd.ExecuteReader&lt;br /&gt;            While (dr.Read)&lt;br /&gt;                Dim aluno As New Aluno&lt;br /&gt;                aluno.ID = dr(&quot;id&quot;)&lt;br /&gt;                aluno.Nome = dr(&quot;nome&quot;)&lt;br /&gt;                aluno.Email = dr(&quot;email&quot;)&lt;br /&gt;                listaAlunos.Add(aluno)&lt;br /&gt;            End While&lt;br /&gt;            Return listaAlunos&lt;br /&gt;        Catch&lt;br /&gt;            Throw New Exception(&quot;Erro ao gerar lista de alunos&quot;)&lt;br /&gt;        Finally&lt;br /&gt;            con.Close()&lt;br /&gt;        End Try&lt;br /&gt;    End Function&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;No evento Load da página
Default.aspx inclua o código que irá usar a função
getAlunos():&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt; Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load&lt;br /&gt;        gdvAlunos.DataSource = getAlunos()&lt;br /&gt;        gdvAlunos.DataBind()&lt;br /&gt;    End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Executando a página iremos obter o
seguinte resultado:&lt;/p&gt;

&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/14146/7.gif&quot; /&gt;&lt;p&gt;Mas afinal qual a vantagem? Ora bolas, com
Generics estamos trabalhando com objetos fortemente tipados em lista de 
coleções de objetos e, ao invés de passar um dataset ou datatable, estamos 
trafegando objetos.&lt;/p&gt;

&lt;p&gt;Pegue os projetos completos aqui:
&lt;a href=&quot;http://www.macoratti.net/09/09/UsandoGenerics.zip&quot; class=&quot;ext&quot;&gt;UsandoGenerics.zip&lt;/a&gt; (VB .NET) 
&lt;a href=&quot;http://www.macoratti.net/09/09/listaAlunosGenerics.zip&quot; class=&quot;ext&quot;&gt;listaAlunosGenerics.zip&lt;/a&gt; (ASP .NET)&lt;/p&gt;

&lt;p&gt;Eu sei, é apenas VB .NET e Generics, mas eu gosto...&lt;/p&gt;

</description>
            <author>macoratti@yahoo.com (José Carlos Macoratti)</author>
            <pubDate>Thu, 03 Sep 2009 10:30:00 +0100</pubDate>
            <guid>http://imasters.uol.com.br/artigo/14146</guid>
        </item>
        <item>
            <title>VB. NET - Consumindo Web Services com Windows Forms</title>
            <link>http://imasters.uol.com.br/artigo/13890/vbnet/vb_net_consumindo_web_services_com_windows_forms/</link>
            <description>&lt;p&gt;Em meu artigo anterior, &lt;a href=&quot;http://imasters.uol.com.br/artigo/13802/webservices/criando_web_services/&quot;&gt;&lt;strong&gt;Criando Web Services&lt;/strong&gt;&lt;/a&gt;, mostrei como é fácil criar Web Services na 
plataforma .NET, mesmo usando uma ferramenta gratuita como o 
Visual Web 
Developer 2008 Express Edition.&lt;/p&gt;


&lt;p&gt;Neste artigo vou mostrar como consumir o web 
service criado em uma aplicação WIndows Forms criada no 
Visual Basic 2008 Express Edition.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Nota: Por razões didáticas 
    eu alterei o nome do web service criado no artigo citado de Service.asmx 
    para getProdutosService.asmx.&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;A 
    figura abaixo mostra como ficou o projeto com o novo nome. Isso não alterou 
    em nada a funcionalidade criada.&lt;/p&gt;


&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/13890/1.gif&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Abra o Visual Basic 2008 Express Edition e crie um 
novo projeto do tipo Windows Forms Application usando a linguagem Visual 
Basic com o nome consumindoWS.&lt;/p&gt;


&lt;p&gt;Na janela Solution 
Explorer clique com o botão direito do mouse sobre o nome do projeto e 
selecione a opção Add Service Reference.&lt;/p&gt;


&lt;p&gt;Na janela Add Service Reference informe na 
caixa Address a URL do nosso web service. Abaixo temos a informação (já 
com o nome alterado).&lt;/p&gt;


&lt;p&gt;Observe que o serviço e a operação foram 
identificados. Clique no botão OK.&lt;/p&gt;


&lt;p&gt;Você pode também clicar no botão
    Advanced... para ter acesso à janela Service Reference Settings 
    e efetuar ajustes na configuração.&lt;/p&gt;


&lt;p&gt;Na 
    janela de configuração existe o botão Add Web Reference que remete à 
    mesma janela que usada para referenciar o web service na aplicação ASP .NET.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/13890/2.gif&quot; /&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/13890/3.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Neste momento a janela 
Solution Explorer irá exibir a referência ao web service criado na pasta
Web References:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/13890/4.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Selecione o formulário form1.vb e a partir da 
ToolBox inclua um componente DataGridView no formulário.&lt;/p&gt;


&lt;p&gt;Nota: 
    Uma outra forma de incluir uma referência ao web service é através da opção
    Choose Data Source do DataGridView.&lt;/p&gt;


&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/13890/5.gif&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Em seguida, clicando na opção - Add Project 
        Data Source... iremos para a janela Data Source Configuration Wizard 
        onde vemos a opção Service e Web Service.&lt;/p&gt;


&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/13890/6.gif&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Selecinando a opção Service e clicando em 
        Next&amp;gt; teremos a janela Add Service Reference:&lt;/p&gt;


&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/13890/7.gif&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Em seguida vamos referenciar o web service através 
da declaração: Imports 
consumindoWS.WS_getProdutos.&lt;/p&gt;


&lt;p&gt;Vamos declarar também o namespace System.Data:
Imports 
System.Data.&lt;/p&gt;


&lt;p&gt;No evento Load do formulário inclua o código 
abaixo:&lt;/p&gt;


&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load&lt;br /&gt;        Dim ws As New getProdutosService&lt;br /&gt;        Dim ds As DataSet&lt;br /&gt;        ds = ws.getProdutos(10)&lt;br /&gt;        DataGridView1.DataSource = ds.Tables(0)&lt;br /&gt;    End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Criamos a instância do serviço e um dataset.&lt;/p&gt;


&lt;p&gt;Usando a instância do serviço usamos o método 
getProdutos() para obter um dataset contendo os 10 produtos da tabela.&lt;/p&gt;


&lt;p&gt;Exibimos o dataset no grid do formulário:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/13890/8.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Simples e prático!!!&lt;/p&gt;


&lt;p&gt;Pegue o projeto completo aqui:
&lt;a href=&quot;http://www.macoratti.net/09/08/consumindoWS_WF.zip&quot; class=&quot;ext&quot;&gt;consumindoWS_WF.zip&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Eu sei, é apenas VB .NET, mas eu
gosto... &lt;/p&gt;

</description>
            <author>macoratti@yahoo.com (José Carlos Macoratti)</author>
            <pubDate>Thu, 13 Aug 2009 10:30:00 +0100</pubDate>
            <guid>http://imasters.uol.com.br/artigo/13890</guid>
        </item>
        <item>
            <title>VB .NET - Obtendo informações da rede local</title>
            <link>http://imasters.uol.com.br/artigo/13720/vbnet/vb_net_obtendo_informacoes_da_rede_local/</link>
            <description>&lt;p&gt;A plataforma .NET inclui um conjunto
de classes para tratar diversos aspectos relacionados com redes.
Essas classes suportam quase tudo sobre programação baeada em
sockets através do protocolo de controle de transmissão
(TCP/IP) para efetuar o download de arquivos e páginas HTML a
partir da web sobre o protocolo HTTP.&lt;/p&gt;

&lt;p&gt;Neste artigo veremos como
realizar algumas tarefas relacionadas com redes locais e ambiente 
cliente/servidor usando as classes da plataforma .NET.&lt;/p&gt;

&lt;h4&gt;&lt;strong&gt;1. O obtendo informações sobre a configuração da rede local&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;Para obter informações sobre a
rede local usamos o método GetAllNetworkInterfaces da classe
NetWorkInterface do namespace System.NetworkInformation.&lt;/p&gt;

&lt;p&gt;Neste caso iremos obter um array de
objetos derivados a partir da classe abstrata NetworkInterface,
onde cada objeto representa uma interface de rede disponível na
máquina local.  &lt;/p&gt;

&lt;p&gt;Usamos os membros de cada objeto NetworkInterface
para retornar a informação sobre a configuração de rede e as
estatísticas para a interface. Este recurso está disponível a
partir da versão 2.0 da plataforma .NET.&lt;/p&gt;

&lt;p&gt;A seguir temos nas tabelas abaixo as
propriedades e métodos da classe NetworkInterface:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt; Propriedades&lt;/li&gt;

&lt;/ul&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Membro&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;Descrição&lt;/td&gt;
    &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;Obtém uma String
        que fornece uma descrição geral da interface.&lt;/td&gt;
    &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Id&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;Obtém uma String
        que contém um identificador único da interface.&lt;/td&gt;
    &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;isReceiveOnly&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;Obtém um valor
        boleano que indica se a interface pode somente receber ou
        receber/enviar dados.&lt;/td&gt;
    &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;Obtém uma string
        contendo o nome da interface&lt;/td&gt;
    &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;NetworkInterfaceType&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;Obtém um valor a
        partir da enumeração
        System.Net.NetworkInformation.NetworkInterfaceType que
        identifica o tipo de interface. Os valores comuns
        incluem: Ethernet, FastEthernet and LoopBack.&lt;/td&gt;
    &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;OperationalStatus&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;Obtém um valor a
        partir da enumeração
        System.Net.NetworkInformation.OperationalStatus que
        identifica o estado da interface. Valores-padrão
        incluem: Down e Up.&lt;/td&gt;
    &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;SupportsMulticast&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;Obtém um valor
        boleano que indica se a interface está habilitada para
        receber pacotes multicast.&lt;/td&gt;
    &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Speed&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;Obtém um valor
        Long que identifica a velocidade (em bits por segundo) da
        interface como informada pela interface (não baseada em
        um cálculo dinâmico)&lt;/td&gt;
    &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;ul&gt;&lt;li&gt; &lt;strong&gt;Métodos&lt;/strong&gt;&lt;/li&gt;

&lt;/ul&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Membro&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;Descrição&lt;/td&gt;
    &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GetIPProperties&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;Retorna um objeto
        System.Net.NetworkInformation.IPInterfaceProperties que
        fornece acesso à informação da configuração TCP/IP
        para a interface. As propriedades do objeto
        IPInterfaceProperties fornecem acesso ao WINS, DNS,
        gateway e configuração do endereço IP.&lt;/td&gt;
    &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GetIPv4Statistics&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;Retorna um objeto
        System.Net.NetworkInformation.IPv4InterfaceStatistics que
        fornece acesso às estatísticas TCP/IP v4 para a
        interface. As propriedades do objeto
        IPv4InterfaceStatistics fornecem o acesso à informação
        sobre bytes enviados e recebidos, pacotes enviados e
        recebidos, pacotes descartados e pacotes com erros.&lt;/td&gt;
    &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GetPhysicalAddress&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;Retorna um objeto
        System.Net.NetworkInformation.PhysicalAddress que fornece
        acesso ao endereço físico da interface. Você pode
        obter o endereço físico como um array de Byte usando o
        método PhysicalAddress.GetAddressBytes ou como uma
        string usando PhysicalAddress.ToString.&lt;/td&gt;
    &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Supports&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;Retorna um valor
        boleano indicando se a interface suporta um protoco
        específico. Você especifica o protocolo usando um valor
        a partir da enumeração
        System.Net.NetworkInformation.NetworkInterfaceComponent.
        Os valores possíveis incluem IPv4 e IPv6.&lt;/td&gt;
    &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;A classe NetworkInterface também
fornece outros membros estáticos (&lt;em&gt;&lt;strong&gt;Shared&lt;/strong&gt;&lt;/em&gt;)
que podem ser úteis como:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;A propriedade &lt;strong&gt;LoopbackInterfaceIndex&lt;/strong&gt;
        que retorna um inteiro identificando o índice da
        interface loopback no interior do array NetworkInterface
        retornado pelo método &lt;strong&gt;GetAllNetworkInterfaces&lt;/strong&gt;;&lt;/li&gt;

&lt;li&gt;O método &lt;strong&gt;GetIsNetworkAvailable&lt;/strong&gt;
        que retorna um valor boleano indicando se qualquer
        conexão de rede está disponível, ou seja, o valor de &lt;strong&gt;OperationalStatus&lt;/strong&gt;
        está definido como Up.&lt;/li&gt;

&lt;/ul&gt;&lt;p&gt;Vejamos então um exemplo prático
que usa os membros da classe NetworkInterface para exibir a
informação sobre todas as interfaces de rede na máquina local:&lt;/p&gt;

&lt;p&gt;Crie um novo projeto no Visual Basic 2008 Express 
Edition com o nome de infoRedeLocal;&lt;/p&gt;

&lt;p&gt;No formulário padrão inclua os componentes: 
TextBox, ListBox e Button conforme o leiaute da figura abaixo:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/13720/1.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Agora defina os namespaces que iremos usar para 
poder ter acesso às classes e obter informação sobre a rede local;&lt;/p&gt;

&lt;p&gt;Imports System&lt;br /&gt;
Imports System.Net.NetworkInformation&lt;/p&gt;

&lt;p&gt;A seguir vamos definir uma rotina chamada verificaRedeLocal() 
que será chamada para usar as classes da plataforma .NET e obter informações da 
rede local. O código é dado abaixo:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt; Private Sub verificaRedeLocal()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If NetworkInterface.GetIsNetworkAvailable Then&lt;br /&gt;&lt;br /&gt;   ' Obtem e define todos os objetos NetworkInterface para a maquina local&lt;br /&gt;&lt;br /&gt;     Dim interfaces As NetworkInterface() = NetworkInterface.GetAllNetworkInterfaces()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    ' Percorre as interfaces e exibe informaÆo&lt;br /&gt;&lt;br /&gt;    For Each ni As NetworkInterface In interfaces&lt;br /&gt;&lt;br /&gt;         ' relatorio endereco fisico.&lt;br /&gt;&lt;br /&gt;       txtEnderecoFisico.Text = &quot; Endereco Fisico : &quot; &amp;amp; ni.GetPhysicalAddress().ToString()&lt;br /&gt;&lt;br /&gt;        ' relatorio de informacao basica da interface&lt;br /&gt;&lt;br /&gt;       lstInterfaceLocal.Items.Add(&quot; Nome da Interface: &quot; &amp;amp; ni.Name)&lt;br /&gt;&lt;br /&gt;       lstInterfaceLocal.Items.Add(&quot; Descricao : &quot; &amp;amp; ni.Description)&lt;br /&gt;&lt;br /&gt;       lstInterfaceLocal.Items.Add(&quot; ID : &quot; &amp;amp; ni.Id)&lt;br /&gt;&lt;br /&gt;       lstInterfaceLocal.Items.Add(&quot; Tipo : &quot; &amp;amp; ni.NetworkInterfaceType)&lt;br /&gt;&lt;br /&gt;       lstInterfaceLocal.Items.Add(&quot; Velocidade : &quot; &amp;amp; ni.Speed)&lt;br /&gt;&lt;br /&gt;       lstInterfaceLocal.Items.Add(&quot; Status : &quot; &amp;amp; ni.OperationalStatus)&lt;br /&gt;&lt;br /&gt;         ' Relatorio para estatistica de rede para a interface&lt;br /&gt;&lt;br /&gt;       lstInterfaceLocal.Items.Add(&quot; Bytes enviados : &quot; &amp;amp; ni.GetIPv4Statistics().BytesSent)&lt;br /&gt;&lt;br /&gt;       lstInterfaceLocal.Items.Add(&quot; Bytes Recebidos: &quot; &amp;amp; ni.GetIPv4Statistics.BytesReceived)&lt;br /&gt;&lt;br /&gt;          ' Informa a configuracao do IP&lt;br /&gt;&lt;br /&gt;       lstInterfaceLocal.Items.Add(&quot; Enderecos IP:&quot;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;          For Each addr As UnicastIPAddressInformation In ni.GetIPProperties.UnicastAddresses&lt;br /&gt;&lt;br /&gt;            lstConfiguracaoIP.Items.Add(&quot;contrato/validade &quot; &amp;amp; addr.Address.ToString &amp;amp; (DateTime.Now.AddSeconds(addr.DhcpLeaseLifetime)).ToString)&lt;br /&gt;&lt;br /&gt;          Next&lt;br /&gt;&lt;br /&gt;      Next&lt;br /&gt;&lt;br /&gt;Else&lt;br /&gt;&lt;br /&gt;     MsgBox(&quot;Nao ha rede local disponivel&quot;)&lt;br /&gt;&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Agora no evento Click do botão de comando 
inclua o código abaixo que chama a rotina criada acima:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Private Sub btnExibir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExibir.Click&lt;br /&gt;&lt;br /&gt;    verificaRedeLocal()&lt;br /&gt;&lt;br /&gt;End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Executando o projeto em minha máquina local, o 
resultado obtido foi o seguinte:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/13720/2.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;O resultado pode variar para cada máquina 
dependendo da placa de rede e da configuração da mesma.&lt;/p&gt;

&lt;p&gt;Pegue o projeto completo aqui: &lt;a href=&quot;http://www.macoratti.net/09/07/infoRedeLocal.zip&quot;&gt;
infoRedeLocal.zip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eu sei, é apenas VB .NET, mas eu
gosto...&lt;/p&gt;

</description>
            <author>macoratti@yahoo.com (José Carlos Macoratti)</author>
            <pubDate>Thu, 30 Jul 2009 10:30:00 +0100</pubDate>
            <guid>http://imasters.uol.com.br/artigo/13720</guid>
        </item>
        <item>
            <title>Programação Assíncrona com Thread Pools</title>
            <link>http://imasters.uol.com.br/artigo/13366/vbnet/programacao_assincrona_com_thread_pools/</link>
            <description>&lt;p&gt;Quando você está desenvolvendo uma aplicação, pode 
se deparar com uma situação onde existe a necessidade de realizar um 
processamento mais intenso. Isso pode fazer com que sua aplicação sofra uma perda de 
desempenho dando a sensação ao usuário que a aplicação está 'congelada'. 
&lt;/p&gt;


&lt;p&gt;Se você não precisa aguardar o término deste 
processamento para que o usuário interaja com a aplicação, pode usar o recurso do 
ThreadPool para obter um comportamento assíncrono sem ter que recorrer ao 
processamento de  MultiThreads.&lt;/p&gt;


&lt;p&gt;
    &lt;strong&gt;MultiThreads&lt;/strong&gt;??? Meu Deus!!! O que é isto???? Calma!! O 
    termo &lt;strong&gt;MultiThread&lt;/strong&gt; define a capacidade de se executar múltiplos 
    processos ao mesmo tempo de forma independente. 
    Ou seja, você executa duas tarefas (assobiar e chupar cana) ao mesmo 
    tempo e uma tarefa não depende da outra para ser executada.&lt;/p&gt;


&lt;p&gt;
    Vamos dar um exemplo para clarear: suponha que você queira carregar um controle ListView com os dados de 
    uma tabela e que, ao mesmo tempo, queira também preencher o conteúdo de uma 
    Combobox com os dados de outra tabela. Bem, se conseguir realizar tal 
    proeza ao mesmo tempo e de forma independente, você esta realizando um 
    processamento &lt;strong&gt;MultiThread.&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Ora, ora, você pode estar pensando com 
    os seus botões que o VB6.0 suporta o processamento &lt;strong&gt;MultiThread&lt;/strong&gt;... Mas eu lhe digo que está enganado. Na verdade, quando você 
    tenta fazer tal tarefa usando o VB 6.0, a tarefa é feita sequencialmente; só 
    que a coisa é tão rápida (&lt;em&gt;se a tabela tiver poucos registros&lt;/em&gt;) que 
    parece - eu disse parece - que as tarefas são realizadas simultaneamente. O 
    que o VB6.0 faz é executar múltiplos apartamentos dentro de um único 
    processo.&lt;/p&gt;


&lt;p&gt;No VB.NET a multiTarefa (MultiThread) 
    é uma realidade, ou seja, podemos ter múltiplos processos paralelos que 
    podem acessar o mesmo conjunto de dados compartilhados.&lt;/p&gt;


&lt;p&gt;A plataforma .NET mantém um pool de
threads prontas para serem usadas, que são idéias para realizar
tarefas rápidas. Geralmente essas threads são usadas para
operações assíncronas de acesso a arquivos ou operações
realizadas pela chamada de um Delegate ou BeginInvoke.&lt;/p&gt;


&lt;p&gt;Delegates são tipos usados para invocar um ou mais métodos onde o método atual 
    invocado é determinado em tempo de execução. &lt;/p&gt;


&lt;p&gt;Delegates provê uma 
    forma de invocar método pelo seu endereço ao invés de seu nome.&lt;/p&gt;


&lt;p&gt;Como estas tarefas são rápidas, a
criação e destruição das threads passa a ter uma porção
significativa no tempo de execução da tarefa. Para evitar que
gerenciamento de linhas de execução (Threads) afete o
desempenho, a .NET Framework cria um pool de threads quando
necessário até um valor limite e, então, mantém as threads do
pool em estado de espera e prontas para a próxima operação
assíncrona. Com isso, é ocupada apenas uma pequena quantidade de
memória para cada thread, otimizando o desempenho.&lt;/p&gt;


&lt;p&gt;A classe
System.Threading.ThreadPool fornece um número de métodos
estáticos que permitem que você monitore e controle as threads
do pool. &lt;/p&gt;


&lt;p&gt;Vejamos os mais importantes:&lt;/p&gt;


&lt;ul&gt;&lt;li&gt;GetMaxThreads - Retorna o número
máximo das threads ativas no pool.&lt;/li&gt;

&lt;li&gt;GetAvailableThreads- Retorna a
diferença entre o número máximo de threads do pool e o número
atual de threads ativas.&lt;/li&gt;

&lt;li&gt;GetMinThreads - Retorna o número
de threads ociosas que o pool mantém e espera de novas
requisições.&lt;/li&gt;

&lt;li&gt;SetMinThreads - Altera o valor
mínimo de threads disponíveis no pool. Se você diminuir
muito o número de threads ociosas pode afetar o desempenho do
sistema;&lt;/li&gt;

&lt;li&gt;SetMaxThreads - Altera o valor
máximo de threads disponíveis no pool;&lt;/li&gt;

&lt;li&gt;QueueUserWorkItem - Enfileira um
método para execução. O método será executado quando uma
thread do pool estiver disponível. Geralmente você usa este
método para executar um processo em outra thread. Pode ser usado
da seguinte forma:&lt;/li&gt;

&lt;/ul&gt;

&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;QueueUserWorkItem(WaitCallBack)&lt;/td&gt;
        &lt;td&gt;Enfileira um método para
        execução onde o método executa quando a thread estiver
        ativa.&lt;/td&gt;
    &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;QueueUserWorkItem(WaitCallBack,
        Object) &lt;/td&gt;
        &lt;td&gt;Enfileira um método para
        execução e especifica um objeto contendo os dados para
        ser usado pelo método. O método executa quando a thread
        estiver disponível.&lt;/td&gt;
    &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;Para exemplificar a utilização destes métodos, vamos 
usar o Visual Basic 2008 Express Edition para criar 
uma aplicação do tipo Console com o nome de 
threadPool_1 digitando o código abaixo:&lt;/p&gt;


&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Imports System.Threading&lt;br /&gt;Module Module1&lt;br /&gt;&lt;br /&gt;    Sub Main()&lt;br /&gt;        ' exibe o estado padrão das threads do pool&lt;br /&gt;        exibeEstadoThreads() '&lt;br /&gt;&lt;br /&gt;        ' Altera os parâmetros do Pool de threads&lt;br /&gt;        Console.WriteLine(&quot;Alterando o numero de Threads...&quot;)&lt;br /&gt;        If Not ThreadPool.SetMaxThreads(100, 500) Then&lt;br /&gt;            Console.WriteLine(&quot;Chamada a SetMaxThreads falhou....&quot;)&lt;br /&gt;        End If&lt;br /&gt;        If Not ThreadPool.SetMinThreads(25, 25) Then&lt;br /&gt;            Console.WriteLine(&quot;Chamada a SetMinThreads falhou....&quot;)&lt;br /&gt;        End If&lt;br /&gt;&lt;br /&gt;        ' Inicia uma thread do pool&lt;br /&gt;    ThreadPool.QueueUserWorkItem(AddressOf NaofazNada)&lt;br /&gt;        Thread.Sleep(10)&lt;br /&gt;&lt;br /&gt;        ' Mostra o novo estado da thread&lt;br /&gt;        exibeEstadoThreads()&lt;br /&gt;&lt;br /&gt;        ' Aguarda para encerrar o programa&lt;br /&gt;        Console.WriteLine()&lt;br /&gt;        Console.WriteLine(&quot;Pressione Enter para encerrar...&quot;)&lt;br /&gt;        Console.ReadLine()&lt;br /&gt;&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;    Sub exibeEstadoThreads()&lt;br /&gt;        ' Retorna o número máximo de threads do pool&lt;br /&gt;        Dim threadsAtivas As Integer&lt;br /&gt;        Dim threadsTerminadas As Integer&lt;br /&gt;        ThreadPool.GetMaxThreads(threadsAtivas, threadsTerminadas)&lt;br /&gt;&lt;br /&gt;Console.WriteLine(&quot;Máximo de threads ativas={0}&quot; &amp;amp; vbCrLf &amp;amp;&lt;br /&gt;&quot;Máximo de I/O threads={1}&quot;, threadsAtivas, threadsTerminadas)&lt;br /&gt;&lt;br /&gt;        ' Retorna o no mínimo de threads ociosas&lt;br /&gt;        ThreadPool.GetMinThreads(threadsAtivas, threadsTerminadas)&lt;br /&gt;&lt;br /&gt;Console.WriteLine(&quot;Minino de threads ativas={0}&quot; &amp;amp; vbCrLf &amp;amp;&lt;br /&gt;&quot;Minimo de I/O threads={1}&quot;, threadsAtivas, threadsTerminadas)&lt;br /&gt;&lt;br /&gt;        ' Mostra threads disponíveis&lt;br /&gt;        ThreadPool.GetAvailableThreads(threadsAtivas, threadsTerminadas)&lt;br /&gt;&lt;br /&gt;Console.WriteLine(&quot;Threads ativas disponíveis={0}&quot; &amp;amp; vbCrLf &amp;amp;&lt;br /&gt;&quot;Threads I/O disponíveis={1}&quot;, threadsAtivas, threadsTerminadas)&lt;br /&gt;&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;    Sub NaofazNada(ByVal state As Object)&lt;br /&gt;        Thread.Sleep(1000)&lt;br /&gt;        Console.WriteLine(&quot;Sem fazer nada...&quot;)&lt;br /&gt;    End Sub&lt;br /&gt;End Module&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Executando este projeto, iremos obter o seguinte 
resultado:&lt;/p&gt;


&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/13366/vb_utp2.gif&quot; /&gt;&lt;/p&gt;


&lt;h4&gt;Usando ThreadPool em 
uma aplicação Windows Forms&lt;/h4&gt;


&lt;p&gt;Como já foi mencionado, a classe ThreadPool do namespace 
System.Threading contém um pool virtual de threads disponíveis que você pode 
usar. Você pode usar a classe ThreadPool para realizar operações assíncronas com 
recurso de Multithread sem ter que escrever código para gerenciar o pool de 
threads.&lt;/p&gt;


&lt;p&gt;A classe ThreadPool gerencia um grupo 
dinâmico de threads que estão disponíveis para realizar o processamento
multithread. O número de threads no pool é dinâmico 
e você não é obrigado realizar nenhum trabalho extra para gerenciar as threads 
no pool. Se você requisitar uma thread e não existir nenhuma disponível, o 
pool pode criar uma nova thread ou esperar até que uma thread esteja disponível.&lt;/p&gt;


&lt;p&gt;O gerenciamento das threads é feita pelo pool de 
forma transparente e você não tem que se preocupar com esse detalhe apenas com o 
seu código.&lt;/p&gt;


&lt;p&gt;Para demonstrar como usar o recurso ThreadPool 
e obter o mesmo resultado obtido pela construção de threads vamos propor um 
problema que simula uma aplicação Windows com um grande processamento inicial. 
Para forçar uma simulação, a aplicação Windows irá carregar 100 milhões de números 
 
em um controle ListBox.&lt;/p&gt;


&lt;p&gt;Se a aplicação simplesmente tentar carregar os 
números inteiros no controle ListBox no evento Load do formulário, ele irá demorar vários minutos para ser exibido. Mas se executarmos esta 
operação em uma thread separada, então o nosso formulário irá exibir o controle
ListBox de imediato. &lt;/p&gt;


&lt;p&gt;Nota: Observe que podemos 
usar este recurso pois não precisamos que o processamento de carregar os números 
na LIstBox esteja concluído para poder exibir a  
ListBox e aguardar a interação 
do usuário.&lt;/p&gt;


&lt;p&gt;Usando o recurso ThreadPool, o formulário será 
carregado de imediato enquanto a LIstBox continua a ser carregada em segundo 
plano ficando disponível para a interação com o usuário.&lt;/p&gt;


&lt;p&gt;Abra o Visual Basix 2008 
Express Edition e crie um novo projeto do tipo 
Windows Forms Application com o nome threadPool_2
;&lt;/p&gt;


&lt;p&gt;Inclua no formulário padrão
form1.vb  um controle ListBox e um botão de comando Button 
conforme o leiaute abaixo:&lt;/p&gt;


&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/13366/vbpatp1.gif&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Defina o namespace Imports 
System.Threading para termos acesso a classe ThreadPool.&lt;/p&gt;


&lt;p&gt;No evento Load do formulário vamos incluir o 
código:&lt;/p&gt;


&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Private  Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles  MyBase.Load&lt;br /&gt;&lt;br /&gt;ListBox1.Items.Clear()&lt;br /&gt;ThreadPool.QueueUserWorkItem(AddressOf carregaLista)&lt;br /&gt;&lt;br /&gt;End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Estamos usando o método QueueUserWorkItem da 
classe ThreadPool para enfileirar a execução da rotina carregaLista 
quando uma thread do pool estiver disponível (este método é estático 
- Shared - e por isso não precisamos criar uma instância da classe ThreadPool).&lt;/p&gt;


&lt;p&gt;Vejamos agora o código da rotina carregaLista():&lt;/p&gt;


&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Private Sub carregaLista(ByVal state As Object)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dim i As Double&lt;br /&gt;&lt;br /&gt;SyncLock ListBox1.GetType&lt;br /&gt;&lt;br /&gt;    For i = 10000000000000000 To 1 Step -1&lt;br /&gt;&lt;br /&gt;            item = i&lt;br /&gt;&lt;br /&gt;            ListBox1.Invoke(CType(AddressOf incluir, MethodInvoker))&lt;br /&gt;&lt;br /&gt;      Next&lt;br /&gt;&lt;br /&gt;End SyncLock&lt;br /&gt;&lt;br /&gt;End Sub &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Esta rotina irá efetivamente carregar o controle 
ListBox com milhões de números. Observe que o código está sendo executado no 
interior de um SyncLock.&lt;/p&gt;


&lt;p&gt;A instrução
&lt;span class=&quot;sentence sentencehighlight&quot;&gt;
&lt;span class=&quot;input&quot;&gt;SyncLock&lt;/span&gt;  garante que múltiplas 
threads não executem as instruções do bloco ao mesmo tempo e previne que 
cada thread inicie a execução do código no bloco até que a outra 
thread terminou de executar o mesmo o código.&lt;/span&gt;&lt;/p&gt;


&lt;p&gt;Resta agora exibir o código da rotina incluir 
:&lt;/p&gt;


&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;	Private Sub incluir()&lt;br /&gt;&lt;br /&gt;ListBox1.Items.Add(item)&lt;br /&gt;Application.DoEvents()&lt;br /&gt;&lt;br /&gt;End Sub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Neste código estamos incluindo os valores no 
controle ListBox.&lt;/p&gt;


&lt;p&gt;
&lt;span class=&quot;sentence sentencehighlight&quot;&gt;
O método &lt;span class=&quot;input&quot;&gt;Application.DoEvents&lt;/span&gt; permite que seu 
aplicativo manipule outros eventos que podem ser disparados enquanto seu código 
é executado.&lt;/span&gt;
&lt;span class=&quot;sentence&quot;&gt;O método 
&lt;span class=&quot;input&quot;&gt;My.Application.DoEvents&lt;/span&gt; possui o mesmo 
comportamento que o método DoEvents.&lt;/span&gt;&lt;/p&gt;


&lt;p&gt;Executando o projeto teremos a exibição do 
formulário com o controle ListBox já preenchido e a rotina para preenchimento 
continua sendo executada em outra thread.&lt;/p&gt;


&lt;p&gt;Observe que usamos a thread a partir do pool 
através da classe ThreadPool de forma mais simples e sem preocupação em 
gerenciar threads.&lt;/p&gt;


&lt;p&gt;Uma palavra final sobre Threads em 
aplicações ASP .NET. Com certeza podemos também usar o recurso das  
threads nas aplicações ASP .NET para por exemplo executar processos que 
envolvem grandes processamentos no servidor. Como o assunto merece um tratamento à parte irei publicar um artigo a respeito em breve.&lt;/p&gt;


&lt;p&gt;Eu sei, é apenas VB .NET, mas eu
gosto...&lt;/p&gt;

</description>
            <author>macoratti@yahoo.com (José Carlos Macoratti)</author>
            <pubDate>Thu, 02 Jul 2009 10:30:00 +0100</pubDate>
            <guid>http://imasters.uol.com.br/artigo/13366</guid>
        </item>
        <item>
            <title>Introdução a XAML (Extensible Application Markup Language)</title>
            <link>http://imasters.uol.com.br/artigo/12239/dotnet/introducao_a_xaml_extensible_application_markup_language/</link>
            <description>&lt;p&gt;A &lt;strong&gt;XAML&lt;/strong&gt; ou &lt;strong&gt;Extensible Application Markup Language&lt;/strong&gt; é uma linguagem baseada em XML criada pela Microsoft sendo fundamental para o desenvolvimento de aplicações WPF - Windows Application Foundation.&lt;/p&gt;

&lt;p&gt;A XAML (pronúncia zammel) é a linguagem usada para criar interfaces com usuário e representar dados em aplicações WPF, sendo também usada para criar workflows em aplicações WF - Windows WorkFlow Foundation. (A XAML também é usada no Silverlight).&lt;/p&gt;

&lt;p&gt;A XAML pode ser compilada ou interpretada; dependendo de como for usada, alguns recursos como embutir código C# ou VB no XAML só funcionam quando a XAML é compilada. Quando você cria uma aplicação WPF no VS 2008, a XAML usada na aplicação é compilada em um executável. Porém você pode criar arquivos .xaml que podem ser interpretados em tempo de execução sem envolver compilação. Estes arquivos XAML são geralmente hospedados em um servidor web.&lt;/p&gt;

&lt;p&gt;Vamos criar uma aplicação XAML bem simples, o famoso &quot;Alô mundo&quot;, aquela aplicação que não serve para nada, apenas para ter o primeiro contato com o WPF. O único pré-requisito neste caso é possuir instalada a .NET Framework 3.5 (Se você tem o VS 2008 instalado com certeza terá a .NET Framework 3.5).&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Abra o um editor de Texto como o Bloco de Notas, por exemplo;

&lt;/li&gt;

&lt;li&gt;Crie um documento de texto e inclua ao seguinte código no arquivo:

&lt;/li&gt;

&lt;/ul&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;Page xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;&lt;br /&gt;                        xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;&amp;gt;&lt;br /&gt;                       &amp;lt;TextBlock Text=&quot;Ola, pessoal, aqui eh o macoratti.!&quot; /&amp;gt;&lt;br /&gt;&amp;lt;/Page&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;&lt;li&gt;Salve o arquivo texto com o nome alo.xaml&amp;nbsp; (No Bloco de Notas, para salvar com a extensão .xaml digite o nome do arquivo entre aspas &quot;alo.xaml&quot;)

&lt;/li&gt;

&lt;li&gt;Para testar clique duas vezes sobre o arquivo criado e você verá o navegador padrão ser aberto (IE 7 ou FireFox 3) exibindo o resultado conforme abaixo:

&lt;/li&gt;

&lt;/ul&gt;

&lt;em&gt;Nota: Se outro aplicativo estiver mapeado para abrir os arquivos com extensão .xaml , então abra o seu navegador e arraste e solte o arquivo alo.xaml no navegador aberto.&lt;/em&gt;&lt;p&gt;&lt;em&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/12239/netxaml1.gif&quot; /&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Parabéns, você acabou de criar sua primeira aplicação WPF usando XAML. &lt;/p&gt;

&lt;p&gt;A aplicação alo.xaml é um exemplo de um XAML interpretado pois não houve compilação da aplicação em um executável. Na verdade aplicações usando somente XAML são limitadas; em aplicações mais elaboradas geralmente se usa o XAML com código VB ou C#.&lt;/p&gt;

&lt;p&gt;Observe que na aplicação temos a utilização de tags visto que o XAML é derivado do XML; note também que o elemento raiz é uma tag &amp;lt;Page&amp;gt;, mas existem outras possibilidades como a tag &amp;lt;Window&amp;gt;.&lt;/p&gt;

&lt;p&gt;Em uma aplicação XAML o elemento raiz sempre define dois namespace:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;O padrão, que é mapeado para WPF e usado para representação de dados no WPF; (&lt;a href=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot; class=&quot;ext&quot;&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&lt;/a&gt;)

&lt;/li&gt;

&lt;li&gt;O prefixo x: é usado para especificidades XAML e usado para uma representação mais abrangente;( xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;&amp;gt;) 

&lt;/li&gt;

&lt;/ul&gt;

Os namespaces em XML fornecem um escopo para nomes únicos.&lt;p&gt;O atributo xmlns é usado para mapear um nome local como um x, para o namespace atual, o qual é especificado como como uma URI.&lt;/p&gt;

&lt;p&gt;Elementos individuais ou tags que residem no namespace usam o nome local como prefixo em suas tags.&lt;/p&gt;

&lt;p&gt;O namespace diz ao parse XML como o elemento no documento deverá ser interpretado.&lt;/p&gt;

&lt;h4&gt;A sintaxe XAML&lt;/h4&gt;

&lt;p&gt;Como regra geral, um elemento em XAML é uma instância de 
um objeto e atributos são propriedades do objeto. Veja abaixo um exemplo de um 
simples objeto Button em uma página e a sua exibição no FireFox:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;Page xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;    &amp;lt;Button x:Name=&quot;btnAmarelo&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;    Width=&quot;100&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;    Height=&quot;40&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;    Background=&quot;Yellow&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;    Content=&quot;Clique me&quot; /&amp;gt;&lt;br /&gt;    &amp;lt;/Page&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/12239/netxaml2.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;O elemento raiz corresponde a uma instância de 
System.Windows.Controls.Page, e tudo no namespace System.Windows.Controls 
é um controle WPF.&lt;/p&gt;

&lt;p&gt;O elemento Button corresponde a uma instância da classe
System.Windows.Controls.Button. Os atributos do elemento 
Button representam propriedades da instância do objeto.&lt;/p&gt;

&lt;p&gt;Dessa forma estamos definindo valores para propriedades de 
largura(Width), altura(Height), cor de fundo(Background) e texto(Content).&lt;/p&gt;

&lt;p&gt;Existem também um atributo x:Name que não é uma 
propriedade na classe Button, sendo um atributo especial que fornece um 
identificador único para o objeto ser acessado via código (seria o mesmo que 
criar uma variável do tipo Button com o nome btnAmarelo).&lt;/p&gt;

&lt;p&gt;Você pode usar código na linguagem VB.NET ou C# para fazer a 
mesma coisa. Veja abaixo um exemplo para o código acima na linguagem C# e VB 
.NET:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo C#&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Button btnAmarelo = new Button();&lt;br /&gt;btnAmarelo .Width = 100;&lt;br /&gt;btnAmarelo .Height = 40;&lt;br /&gt;btnAmarelo .Content = &quot;Clique-me&quot;;&lt;br /&gt;btnAmarelo .Background = new SolidColorBrush(Colors.Yeloow);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Exemplo em VB.Net&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;Dim btnAmarelo As Button = New Button()&lt;br /&gt;btnAmarelo .Width = 100&lt;br /&gt;btnAmarelo .Height = 40&lt;br /&gt;btnAmarelo .Content = &quot;Clique-me&quot;&lt;br /&gt;btnAmarelo .Background = New SolidColorBrush(Colors.Yellow)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Na classe Button, Width e Height são tipos simples e a 
WPF converte o valor string 100 para um double de forma implícita. &lt;/p&gt;

&lt;p&gt;Existem porém muitas propriedades nos controles que não 
são tipos simples, algumas propriedades são objetos que possuem eles mesmos 
muitas propriedades que também podem ser tipos complexos. No exemplo acima a 
propriedade Background do button é do tipo SolidColorBrush (note 
que no código XAML podemos simplesmente atribuir a cor diretamente a 
propriedade).&lt;/p&gt;

&lt;p&gt;Uma alternativa usada para fornecer valores para tipos complexos 
é ao invés de definir a propriedade Background usando um atributo usar um 
elemento filho.&lt;/p&gt;

&lt;p&gt;Veja abaixo um exemplo de como usar esta sintaxe para o exemplo 
acima:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;Button&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Button.Background&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;SolidColorBrush &lt;br /&gt;Color=&quot;Yellow&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Button.Background&amp;gt;&lt;br /&gt;&amp;lt;/Button&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;O elemento filho é referenciado como uma propriedade do elemento 
que tem a forma: &amp;nbsp;&amp;lt;ClassName.PropertyName 
/&amp;gt;&lt;/p&gt;

&lt;p&gt;A primeira parte é o nome da classe mais o ponto seguida pelo 
nome da propriedade. O conteúdo do elemento filho é o valor que desejamos 
definir.&lt;/p&gt;

&lt;p&gt;A linguagem XAML permite construir a interface com o usuário e 
para torná-la mais funcional você precisa ter uma forma de efetuar o tratamento 
de eventos da sua aplicação. A XAML torna isso uma tarefa simples através da 
utilização do atributo Class :&lt;/p&gt;

&lt;p&gt;Quando você cria uma aplicação do tipo WPF no 
Visual Studio a 
interface inicial apresentada é a mostrada abaixo:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/12239/wpfdb4.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note no código XAML a classe: &lt;em&gt;&amp;lt;Window x:Class=&quot;Window1&quot;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O namespace x coloca o 
atributo Class no namespace XAML, o que significa que este é uma 
parte geral da linguagem XAML. O atributo Class diz ao parse XAML para 
gerar uma nova classe com o nome definido. A classe deriva da classe nomeada 
pelo elemento XML, ou seja, será criada uma classe chamada Window1 que 
deriva da classe WIndow. A classe será gerada automaticamente em tempo de 
compilação.&lt;/p&gt;

&lt;h4&gt;A propriedade Content&lt;/h4&gt;

&lt;p&gt;Muitos dos controles que você vai usar em aplicações WPF possuem 
a propriedade Content. A propriedade Content é uma propriedade 
especial e pode ser definida atribuindo diretamente o valor a propriedade (a 
proprieade Context é equivalente a propriedade Text de um controle Windows Forms):&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Button x:Name=&quot;btnAmarelo&quot;&lt;br /&gt;    Width=&quot;100&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;    Height=&quot;40&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;    Background=&quot;Yellow&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;    Content=&quot;Clique me&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;ou definindo a propriedade implicitamente usando um elemento 
filho, dessa forma as duas declarações abaixo são equivalentes:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&amp;lt;Button Content=&quot;Clique me&quot; /&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
ou&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;Button&amp;gt;Cique me&amp;lt;/Button&amp;gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;
Como a propriedade Content é do tipo Object, podemos usar recursos 
avançados como desenhar uma elipse em um button. Veja o exemplo usando 
XAML:&lt;/p&gt;

&lt;div class=&quot;codigo&quot;&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;Button&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;lt;Ellipse Width=&quot;24&quot;&amp;nbsp;&lt;br /&gt;Height=&quot;24&quot;&amp;nbsp;&amp;nbsp;&lt;br /&gt;Fill=&quot;Yellow&quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/Button&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;Apresentando o XAMLPAD&lt;/h4&gt;

&lt;p&gt;Eu não poderia deixar de falar do XAMLPAD (fonte:
&lt;a href=&quot;http://msdn.microsoft.com/pt-br/library/ms742398.aspx&quot;&gt;
http://msdn.microsoft.com/pt-br/library/ms742398.aspx&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;O XAMLPAD (xamlpad.exe) é um 
editor visual para XAML que é instalado com o SDK e pode ser encontrado 
na pasta: C:&amp;#92;Arquivos de programas&amp;#92;Microsoft SDKs&amp;#92;Windows&amp;#92;v6.0A&amp;#92;bin&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que é o Windows SDK?&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;O Windows SDK é uma coleção de exemplos, 
    ferramentas, documentação do sistema, referências e conceitos. É muito útil 
    para ajudar o desenvolvedor a dar o pontapé inicial no desenvolvimento para 
    a plataforma Windows. O Windows SDK ajuda o desenvolvedor a entender do que 
    ele precisa para começar a desenvolver aplicativos mais simples e até 
    aplicativos mais sofisticados. Com o SDK várias ferramentas estão presentes 
    como compiladores e o XAMLPAD. &lt;/p&gt;

&lt;p&gt;Um dos motivos para a inclusão de 
    ferramentas neste SDK é que não é necessário ter o Visual Studio.NET para 
    desenvolver.&lt;/p&gt;

&lt;p&gt;      O XamlPad é um ferramenta que fornece os seguintes recursos:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Edição e exibição em tempo real;

&lt;/li&gt;

&lt;li&gt;As tags XAML são salvas automaticamente para o arquivo 
        XamlPad_Salvar.XAML.

&lt;/li&gt;

        

        &lt;li&gt;Os Modos Auto Parse e Refresh fornecem validação de sintaxe e 
        re-exibição de conteúdo;

&lt;/li&gt;

        &lt;li&gt;Fornece suporte de localização para seqüências de caracteres 
        simples. Os Inválidos são exibidos em vermelho;

&lt;/li&gt;

        &lt;li&gt;Erros são relatados na barra de status na parte inferior esquerda do 
        janela principal;

&lt;/li&gt;

        &lt;li&gt;A expansão do conteúdo em uma árvore visual permite a você exibir 
        valores de propriedade do conteúdo;

&lt;/li&gt;

        &lt;li&gt;Você pode carregar um arquivo existente no XamlPad, passando o nome 
        de arquivo como um argumento de linha de comando;

&lt;/li&gt;

      &lt;/ul&gt;

Veja a seguir a cara do XAMLPAD:&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://conteudo.imasters.uol.com.br/12239/wpf_db5.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nota: Observe o modo de visualização do código XAML e do resultado.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O modo 
automático de análise permite que você consulte erros de sintaxe logo que você 
vai digitando.
Caso 
contrário, a análise automática estiver ativada, você não verá erros até que 
você clique no Botão  Atualizar.
Você pode 
ativar e desativar o modo de análise Automática clicando no botão
Análise automática &amp;nbsp;na parte superior de XAMLPAD.
&lt;/p&gt;

&lt;p&gt;Quando um 
erro for encontrado, todo o conteúdo é exibido em uma cor vermelha, e as 
informações de status na parte inferior do  
XAMLPAD os erros de sintaxe 
específico.
Um hiperlink à 
direita do erro exibido permite que você vá rapidamente para a área de conteúdo 
que contém o erro.&lt;/p&gt;

&lt;p&gt;Dependendo do seu interesse, a XAML pode vir a ser uma grande aliada nos seus 
projetos, e, esta breve introdução tem como objetivo aguçar a sua curiosidade para 
os recursos da linguagem.&lt;/p&gt;

&lt;p&gt;Até o próximo artigo XAML!&lt;/p&gt;

&lt;h4&gt;Referências:&lt;/h4&gt;

&lt;ul&gt;&lt;li&gt;
  
  
  &lt;a class=&quot;l&quot; href=&quot;http://www.macoratti.net/07/10/vbn8_wpf.htm&quot;&gt; 
  Apresentando o WPF - Windows Presentation Foundation&lt;/a&gt;

  &lt;/li&gt;

  &lt;li&gt;
  
  
  &lt;a class=&quot;l&quot; href=&quot;http://www.macoratti.net/09/02/wpf_db2.htm&quot;&gt; 
  WPF - DataBinding&lt;/a&gt;

  &lt;/li&gt;

  &lt;li&gt;
  
  
  &lt;a class=&quot;l&quot; href=&quot;http://www.macoratti.net/09/02/wpf_db3.htm&quot;&gt; 
  WPF - Usando a vinculação de dados II&lt;/a&gt;

  &lt;/li&gt;

  &lt;li&gt;
  
  
  &lt;a class=&quot;l&quot; href=&quot;http://www.macoratti.net/09/03/wpf_web1.htm&quot;&gt; 
  WPF - Criando um navegador Web&lt;/a&gt;

  &lt;/li&gt;

&lt;/ul&gt;

</description>
            <author>macoratti@yahoo.com (José Carlos Macoratti)</author>
            <pubDate>Thu, 02 Apr 2009 10:45:00 +0100</pubDate>
            <guid>http://imasters.uol.com.br/artigo/12239</guid>
        </item>
    </channel>
</rss>
