Você está na página 1de 1238

Nvel I - Iniciante Autor: Elzevir Jr.

Janeiro, 2007

Visual C# Consolidado

NDICE
VISUAL C#......................................................................................................................................................................16 GUIA DE INTRODUO AO VISUAL C#......................................................................................................17 GUIA DA DOCUMENTAO DO VISUAL C#....................................................................................................................17 INTRODUO LINGUAGEM C# E AO .NET FRAMEWORK ............................................................................................18 O QUE H DE NOVO NO VISUAL C# 2005.......................................................................................................................20 O QUE H DE NOVO NA C# 2.0 IDIOMA E COMPILER ......................................................................................................22 ATUALIZANDO APLICATIVOS VISUAL C# PARA VISUAL STUDIO 2005..........................................................................24 CRIANDO SEU PRIMEIRO APLICATIVO C# .....................................................................................................................25 USANDO STARTER KITS C#...........................................................................................................................................26 RECURSOS DE AJUDA ADICIONAIS (VISUAL C#)...........................................................................................................26 COMO FAZER EM C# .....................................................................................................................................................27 USANDO O IDE DO VISUAL C# .......................................................................................................................29 INTRODUO IDE (VISUAL C#).................................................................................................................................29 CRIANDO UM PROJETO (VISUAL C#).............................................................................................................................31 PROJETANDO UMA INTERFACE DE USURIO (VISUAL C#) .............................................................................................34 O INTELLISENSE ...........................................................................................................................................................36 LISTAS DE CONCLUSO .................................................................................................................................................37 INFORMAES RPIDAS ................................................................................................................................................37 MEMBROS DA LISTA ......................................................................................................................................................37 INFORMAES DE PARMETRO .....................................................................................................................................37 ADICIONANDO DIRETIVAS 'USING' .................................................................................................................................38 REFATORAO ..............................................................................................................................................................38 TRECHOS DE CDIGO ....................................................................................................................................................38 SUBLINHADO ONDULADO ..............................................................................................................................................38 AJUDA DE LEGIBILIDADE ..............................................................................................................................................39 Estrutura de tpicos ................................................................................................................................................39 COLORIZAO ..............................................................................................................................................................39 NAVEGANDO E PROCURANDO.........................................................................................................................40 EXIBIO DE CLASSE ....................................................................................................................................................40 NAVEGAO CTRL+TAB............................................................................................................................................40 BARRAS DE NAVEGAO ..............................................................................................................................................41 LOCALIZAR EM ARQUIVOS ............................................................................................................................................42 CRIANDO E DEPURANDO (VISUAL C#) .....................................................................................................43 MODELAGEM E ANLISE DE CDIGO (VISUAL C#)............................................................................46 ADICIONANDO E EDITANDO RECURSOS (VISUAL C#) ....................................................................49 OBTENDO AJUDA (VISUAL C#) ......................................................................................................................51 IMPLANTANDO APLICATIVOS C# .................................................................................................................54 RECURSOS DO CODE EDITOR DO VISUAL C#.................................................................................................................54 Refatorao .............................................................................................................................................................54 TRECHOS DE CDIGOS (C#)...........................................................................................................................................55 CDIGO COLORIZATION ................................................................................................................................................56 METADADOS COMO FONTE ............................................................................................................................................58 CONFIGURAES DO IDE VISUAL C# ...........................................................................................................................59 ATALHOS DE TECLADO VISUAL C#...............................................................................................................................60 Teclas de atalho.......................................................................................................................................................60 TECLAS DE ATALHO PADRO CONFIGURAES DEVELOPMENT GERAIS ........................................................................62 ESCREVENDO APLICATIVOS COM O VISUAL C# ..................................................................................64 USANDO A BIBLIOTECA DE CLASSE DO .NET FRAMEWORK (VISUAL C#).....................................................................64 CRIANDO APLICATIVOS DO WINDOWS FORMS (VISUAL C#) .........................................................................................65 CRIANDO APLICATIVOS DE CONSOLE (VISUAL C#) ......................................................................................................65 ACESSAR E EXIBIR DADOS (VISUAL C#)........................................................................................................................65 CRIANDO APLICATIVOS MVEIS E INCORPORADOS (VISUAL C#) .................................................................................66

Visual C# Consolidado

CRIANDO E ACESSANDO SERVIOS DA WEB (VISUAL C#)...........................................................67 CRIANDO COMPONENTES (VISUAL C#)....................................................................................................68 DESENVOLVENDO NA PLATAFORMA DO OFFICE (VISUAL C#) ......................................................................................68 Programao do Office (Como Fazer em C#).........................................................................................................68 Como: Atualizar solues das Ferramentas do Visual Studio para o Office ..........................................................69 O EXCEL USANDO EXPLICAES PASSO-A-PASSO.............................................................................71 COLETA DE DADOS USANDO UM FORMULRIO DO WINDOWS WALKTHROUGH .............................................................71 ALTERANDO PLANILHA FORMATAO USANDO CONTROLES CHECKBOX WALKTHROUGH: .........................................73 EXIBINDO TEXTO EM UMA CAIXA DE TEXTO EM UMA PLANILHA USANDO UM BOTO WALKTHROUGH: ........................76 PROGRAMAO CONTRA EVENTOS DE UM CONTROLE NAMEDRANGE WALKTHROUGH:...............................................78 PASSO-A-PASSO: CONCEDENDO E REMOVENDO PERMISSES PARA UMA SOLUO DO OFFICE .....................................81 PASSO-A-PASSO: LIGANDO UMA CLULA DE PLANILHA A UM CAMPO DE BANCO DE DADOS ..........................................84 WALKTHROUGH: VINCULAO CLULAS PARA VRIAS COLUNAS EM UMA TABELA .....................................................87 CRIANDO UMA RELAO MESTRE / DETALHES USANDO UM DATASET EM CACHE WALKTHROUGH: .............................91 WALKTHROUGH: ATUALIZANDO UM GRFICO EM UMA PLANILHA USANDO BOTES DE OPO ....................................94 VINCULAO DE DADOS PARA CONTROLES EM UM PAINEL AES DO EXCEL WALKTHROUGH: ..................................99 IMPLANTANDO UM WORD OU SOLUTION DO EXCEL USANDO UM MANIFESTO DEPLOYMENT WALKTHROUGH: ..........103 IMPLANTANDO UM WORD OU SOLUTION DO EXCEL USANDO UM ARQUIVO DO WINDOWS INSTALLER WALKTHROUGH: ....................................................................................................................................................................................107 PASSO-A-PASSO: CONCEDENDO E REMOVENDO PERMISSES PARA UMA SOLUO DO OFFICE ...................................112 O WORD USANDO EXPLICAES PASSO-A-PASSO ..........................................................................116 WALKTHROUGH: CHANGING DOCUMENT FORMATAO USANDO CONTROLES CHECKBOX .......................................116 EXIBINDO TEXTO EM UMA CAIXA DE TEXTO EM UM DOCUMENTO USANDO UM BOTO WALKTHROUGH:....................119 WALKTHROUGH: CRIANDO MENUS DE ATALHO PARA INDICADORES ...........................................................................121 WALKTHROUGH: ATUALIZANDO UM GRFICO EM UM DOCUMENTO USANDO BOTES DE OPO ................................124 VINCULAO DE DADOS PARA CONTROLES EM UM PAINEL AES DO WORD WALKTHROUGH: ................................128 WALKTHROUGH: CRIAR UMA MARCA INTELIGENTE QUE CONVERTE TEMPERATURES DE FAHRENHEIT PARA CELSIUS133 IMPLANTANDO UM WORD OU SOLUTION DO EXCEL USANDO UM MANIFESTO DEPLOYMENT WALKTHROUGH: ..........135 IMPLANTANDO UM WORD OU SOLUTION DO EXCEL USANDO UM ARQUIVO DO WINDOWS INSTALLER WALKTHROUGH: ....................................................................................................................................................................................139 PASSO-A-PASSO: CONCEDENDO E REMOVENDO PERMISSES PARA UMA SOLUO DO OFFICE ...................................144 COMO: ADICIONAR CONTROLES A DOCUMENTOS DO OFFICE ...................................................................................147 COMO: EXECUTAR CLCULOS DO EXCEL POR PROGRAMAO.................................................................................149 COMO: CRIAR MENUS DO OFFICE PROGRAMATICAMENTE ...........................................................................................149 COMO: CRIAR BARRAS DE FERRAMENTAS DO OFFICE POR PROGRAMAO .............................................................150 DESENVOLVIMENTO CORPORATIVO (VISUAL C#)...........................................................................152 PROGRAMAO DO TABLET PC (VISUAL C#) ..........................................................................................152 UDIO, VDEO, JOGOS E ELEMENTOS GRFICOS (VISUAL C#) ......................................................152 CRIANDO STARTER KITS (VISUAL C#).......................................................................................................154 MIGRANDO PARA O VISUAL C#...................................................................................................................155 C# PARA DESENVOLVEDORES JAVA ............................................................................................................................155 CONVERTENDO APLICATIVOS JAVA PARA VISUAL C#.................................................................................................155 PARA DESENVOLVEDORES C++ C# .............................................................................................................................155 GUIA DE PROGRAMAO C# .........................................................................................................................158 EM UM PROGRAMA C# ................................................................................................................................................158 Hello world-seu primeiro programa (guia de programao C#)..........................................................................159 Estrutura geral de um programa C# (guia de programao C#)..........................................................................160 MAIN() E ARGUMENTOS DE LINHA DE COMANDO (GUIA DE PROGRAMAO C#) ........................................................160 ARGUMENTOS DE LINHA DE COMANDO (GUIA DE PROGRAMAO C#)........................................................................161 COMO: EXIBIR ARGUMENTOS DE LINHA DE COMANDO (GUIA DE PROGRAMAO C#) ..............................................162 COMO: ACESSAR ARGUMENTOS DE LINHA DE COMANDO USANDO FOREACH (GUIA DE PROGRAMAO C#).............163 MAIN() RETORNA VALORES (GUIA DE PROGRAMAO C#).........................................................................................163 TIPOS DE DADOS (GUIA DE PROGRAMAO C#) ..........................................................................................................164 MATRIZES (GUIA DE PROGRAMAO DO C#).....................................................................................165 MATRIZES COMO OBJETOS (GUIA DE PROGRAMAO C#) ...........................................................................................165

Visual C# Consolidado

MATRIZES MULTIDIMENSIONAIS (GUIA DE PROGRAMAO C#) ..................................................................................166 MATRIZES PASSAGEM COMO PARMETROS (GUIA DE PROGRAMAO C#)..................................................................166 PASSANDO REF USANDO MATRIZES E OUT (GUIA PROGRAMAO C#) .......................................................................168 SEQNCIAS (GUIA DE PROGRAMAO C#) ................................................................................................................169 USANDO STRINGS (GUIA DE PROGRAMAO C#) ........................................................................................................169 ESPECIFICAO DA LINGUAGEM C# ........................................................................................................173 REFERNCIA C# ....................................................................................................................................................174 PALAVRAS-CHAVE C#.................................................................................................................................................174 PALAVRA-CHAVE ABSTRACT.......................................................................................................................................174 PALAVRA-CHAVE EVENT .............................................................................................................................................177 PALAVRA-CHAVE NEW ................................................................................................................................................181 OPERADOR NEW ....................................................................................................................................................181 MODIFICADOR NEW..............................................................................................................................................184 PALAVRA-CHAVE STRUCT..................................................................................................................................186 PALAVRA-CHAVE AS............................................................................................................................................189 PALAVRA-CHAVE EXPLICIT .........................................................................................................................................190 PALAVRA-CHAVE NULL ...............................................................................................................................................191 PALAVRA-CHAVE SWITCH ...........................................................................................................................................192 PALAVRA-CHAVE BASE ...............................................................................................................................................194 PALAVRA-CHAVE EXTERN...........................................................................................................................................196 PALAVRA-CHAVE OBJECT ...........................................................................................................................................197 PALAVRA-CHAVE THIS ................................................................................................................................................198 PALAVRA-CHAVE BOOL ..............................................................................................................................................200 PALAVRA-CHAVE FALSE .............................................................................................................................................201 OPERADOR FALSE .................................................................................................................................................201 FALSE (LITERAL) ...................................................................................................................................................201 PALAVRA-CHAVE OPERATOR ......................................................................................................................................202 PALAVRA-CHAVE THROW ...........................................................................................................................................204 PALAVRA-CHAVE BREAK ............................................................................................................................................205 PALAVRA-CHAVE TRY-FINALLY ..................................................................................................................................206 PALAVRA-CHAVE OUT.................................................................................................................................................207 PALAVRA-CHAVE TRUE ...............................................................................................................................................208 OPERADOR TRUE...................................................................................................................................................208 TRUE (LITERAL) .....................................................................................................................................................208 PALAVRA-CHAVE BYTE ...............................................................................................................................................209 PALAVRA-CHAVE FIXED ..............................................................................................................................................210 PALAVRA-CHAVE OVERRIDE .......................................................................................................................................212 PALAVRA-CHAVE TRY-CATCH .....................................................................................................................................213 PALAVRA-CHAVE SWITCH ...........................................................................................................................................216 PALAVRA-CHAVE FOAT ...............................................................................................................................................218 PALAVRA-CHAVE PARAMS ..........................................................................................................................................219 PALAVRA-CHAVE TYPEOF ...........................................................................................................................................220 PALAVRA-CHAVE TRY-CATCH .....................................................................................................................................222 PALAVRA-CHAVE FOR .................................................................................................................................................225 PALAVRA-CHAVE PRIVATE ..........................................................................................................................................226 PALAVRA-CHAVE UINT................................................................................................................................................227 PALAVRA-CHAVE CHAR......................................................................................................................................228 PALAVRA-CHAVE FOREACH, IN ...................................................................................................................................228 PALAVRA-CHAVE VOLATILE .......................................................................................................................................229 PALAVRA-CHAVE DELEGATE.......................................................................................................................................230 PALAVRA-CHAVE OCK ................................................................................................................................................232 PALAVRA-CHAVE STACKALOC ....................................................................................................................................234 OPERADORES C# ..................................................................................................................................................237 OPERADORES SOBRECARREGADOS ..........................................................................................................................238 OPERADOR [ ]..............................................................................................................................................................239 OPERADOR ( )..............................................................................................................................................................240 OPERADOR . (PONTO) ..................................................................................................................................................241 OPERADOR + ...............................................................................................................................................................241 OPERADOR -................................................................................................................................................................242 OPERADOR * ...............................................................................................................................................................243

Visual C# Consolidado

OPERADOR / ................................................................................................................................................................244 OPERADOR %..............................................................................................................................................................245 OPERADOR & ..............................................................................................................................................................245 OPERADOR | ................................................................................................................................................................246 OPERADOR ^ ...............................................................................................................................................................247 OPERADOR !................................................................................................................................................................248 OPERADOR ~ ...............................................................................................................................................................248 OPERADOR = ...............................................................................................................................................................249 OPERADOR < ...............................................................................................................................................................250 OPERADOR > ...............................................................................................................................................................250 OPERADOR ?: ..............................................................................................................................................................251 OPERADOR ++.............................................................................................................................................................252 OPERADOR -- ..............................................................................................................................................................253 OPERADOR && ...........................................................................................................................................................254 DIRECTIVES PREPROCESSOR C# ................................................................................................................256 #IF (REFERNCIA C#) ..................................................................................................................................................256 #ELSE PESSOA (REFERNCIA C#) ................................................................................................................................257 #ENDIF (REFERNCIA C#)............................................................................................................................................257 # DEFINIR (REFERNCIA C#) .......................................................................................................................................258 #UNDEF (REFERNCIA C#)...........................................................................................................................................258 #WARNING (REFERNCIA C#)......................................................................................................................................258 #ERROR (REFERNCIA C#) ..........................................................................................................................................259 # LINE (REFERNCIA C#).............................................................................................................................................259 #REGION (REFERNCIA C#).........................................................................................................................................260 #ENDREGION (REFERNCIA C#)...................................................................................................................................260 # PRAGMA (REFERNCIA C#).......................................................................................................................................260 AVISO # PRAGMA (REFERNCIA C#)............................................................................................................................260 SOMA DE VERIFICAO # PRAGMA (REFERNCIA C#) .................................................................................................261 OPES DO COMPILADOR C#.......................................................................................................................262 CRIANDO DE LINHA DE COMANDO ...............................................................................................................................262 COMO CONSTRUIR A PARTIR DA LINHA DE COMANDO: ................................................................................................263 IMPLANTAO DE APLICATIVOS C# ........................................................................................................264 OPES DO COMPILADOR C# LISTADAS POR CATEGORIA ............................................................................................264 Otimizao.............................................................................................................................................................264 Arquivos de sada ..................................................................................................................................................264 Conjuntos .NET Framework..................................................................................................................................264 Erros Debugging / verificao ..............................................................................................................................265 Preprocessor .........................................................................................................................................................265 Recursos ................................................................................................................................................................265 Diversos.................................................................................................................................................................265 OPES DO COMPILADOR C# LISTADAS ALFABETICAMENTE ......................................................................................266 COMO LOCALIZAR AJUDA PARA ERROS DO COMPILADOR: ...........................................................................................267 PARA ENCONTRAR AJUDA PARA UM ERRO ..................................................................................................................267 EXEMPLOS DO VISUAL C#...............................................................................................................................268 EXEMPLO WORLD DE SAUDAO................................................................................................................................269 EXEMPLO DE PARMETROS DA LINHA DE COMANDO ...................................................................................................271 EXEMPLO MATRIZES ...................................................................................................................................................272 EXEMPLO PROPRIEDADES ............................................................................................................................................272 EXEMPLO BIBLIOTECAS ...............................................................................................................................................273 EXEMPLO DE VERSO ..................................................................................................................................................274 COLEO EXEMPLO CLASSES .....................................................................................................................................275 EXEMPLO STRUCTS .....................................................................................................................................................276 EXEMPLO INDEXADORES .............................................................................................................................................277 INDEXADO EXEMPLO PROPRIEDADES ..........................................................................................................................278 EXEMPLO CONVERSIONS DEFINIDAS PELO USURIO ...................................................................................................279 EXEMPLO GENERICS (C#)............................................................................................................................................279 EXEMPLO REPRESENTANTES .......................................................................................................................................281 EXEMPLO EVENTOS .....................................................................................................................................................282

Visual C# Consolidado

EXEMPLO DE IMPLEMENTAO DE INTERFACE EXPLCITA ..........................................................................................283 EXEMPLO DOS MTODOS CONDICIONAL .....................................................................................................................284 EXEMPLO DE DOCUMENTAO XML..........................................................................................................................285 PLATAFORMA INVOKE EXEMPLO ................................................................................................................................286 EXEMPLO PARTE 1 INTEROP COM ..............................................................................................................................287 EXEMPLO PARTE 2 INTEROP COM ..............................................................................................................................288 EXEMPLO ATRIBUTOS..................................................................................................................................................289 EXEMPLO DE SEGURANA ...........................................................................................................................................290 SEGMENTAO DE EXEMPLO ......................................................................................................................................291 EXEMPLO DE CDIGO NO SEGUROS ...........................................................................................................................292 EXEMPLO BD OLE .....................................................................................................................................................293 PRODUZIR EXEMPLO ...................................................................................................................................................294 ANNIMO EXEMPLO REPRESENTANTES .......................................................................................................................295 EXEMPLO TIPOS PARCIAL ............................................................................................................................................296 EXEMPLO ANULVEL ..................................................................................................................................................296 TERMINOLOGIA C# .............................................................................................................................................298 EXEMPLOS DO VISUAL C#...............................................................................................................................301 EXEMPLO WORLD DE SAUDAO................................................................................................................................303 EXEMPLO DE PARMETROS DA LINHA DE COMANDO ...................................................................................................304 EXEMPLO MATRIZES ...................................................................................................................................................305 EXEMPLO PROPRIEDADES ............................................................................................................................................306 EXEMPLO BIBLIOTECAS ...............................................................................................................................................307 EXEMPLO DE VERSO ..................................................................................................................................................308 COLEO EXEMPLO CLASSES .....................................................................................................................................309 EXEMPLO STRUCTS .....................................................................................................................................................310 EXEMPLO INDEXADORES .............................................................................................................................................311 INDEXADO EXEMPLO PROPRIEDADES ..........................................................................................................................311 EXEMPLO CONVERSIONS DEFINIDAS PELO USURIO ...................................................................................................312 EXEMPLO GENERICS (C#)............................................................................................................................................313 EXEMPLO OVERLOADING DO OPERADOR ....................................................................................................................314 EXEMPLO REPRESENTANTES .......................................................................................................................................315 EXEMPLO EVENTOS .....................................................................................................................................................316 EXEMPLO DE IMPLEMENTAO DE INTERFACE EXPLCITA ..........................................................................................317 EXEMPLO DOS MTODOS CONDICIONAL .....................................................................................................................318 EXEMPLO DE DOCUMENTAO XML..........................................................................................................................318 PLATAFORMA INVOKE EXEMPLO ................................................................................................................................319 EXEMPLO PARTE 1 INTEROP COM ..............................................................................................................................320 EXEMPLO PARTE 2 INTEROP COM ..............................................................................................................................322 EXEMPLO ATRIBUTOS..................................................................................................................................................323 EXEMPLO DE SEGURANA ...........................................................................................................................................324 SEGMENTAO DE EXEMPLO ......................................................................................................................................325 EXEMPLO DE CDIGO NO SEGUROS ...........................................................................................................................326 EXEMPLO BD OLE .....................................................................................................................................................327 PRODUZIR EXEMPLO ...................................................................................................................................................328 ANNIMO EXEMPLO REPRESENTANTES .......................................................................................................................328 EXEMPLO TIPOS PARCIAL ............................................................................................................................................329 EXEMPLO ANULVEL ..................................................................................................................................................330 COMO FAZER EM C#................................................................................................................................................332 LINGUAGEM C# (COMO EU FAO EM C#).........................................................................................................334 O QUE H DE NOVO NA C# 2.0 IDIOMA E COMPILER ....................................................................................................340 Usando Starter Kits C# .........................................................................................................................................340 Especificao da Linguagem C# ...........................................................................................................................341 Main() e argumentos de linha de comando (Guia de programao C#)...............................................................341 Main() retorna valores (Guia de programao C#)..............................................................................................343 base (Referncia do C#) ........................................................................................................................................343 Construtores de instncia (Guia de programao C#) .........................................................................................345 CLASSES GENRICAS NO .NET FRAMEWORK ..............................................................................................................357 Viso geral sobre Generics no .NET Framework..................................................................................................357 Tipos e Generics aninhadas ..................................................................................................................................358 System.Collections.Generic ...................................................................................................................................359

Visual C# Consolidado

System.Collections.ObjectModel ...........................................................................................................................359 O encadeamento representantes............................................................................................................................361 Igualdade e classificao Comparisons ................................................................................................................361 Funcionalidade coleo ........................................................................................................................................361 Vantagens de Generics ..........................................................................................................................................362 A palavra-chave default em cdigo fonte "genrico" (Guia de programao C#) ...............................................363 Mtodos genrico (Guia de programao C#)......................................................................................................363 Restries em parmetros de tipo (Guia de programao C#) .............................................................................365 Representantes genricos (Guia de programao C#)..........................................................................................367 Uma tabela imposto exemplo ................................................................................................................................375 Criar um suplemento de automao para Excel usando o Visual Studio e cdigo gerenciado ............................375 Executar o suplemento do Excel............................................................................................................................376 Executar cdigo em outro domnio de aplicao (Guia de programao C#)......................................................392 Exemplos do Visual C#..........................................................................................................................................394 .NET FRAMEWORK (COMO FAZER EM C#).......................................................................................................397 INTRODUO LINGUAGEM C# E AO .NET FRAMEWORK ..........................................................................................408 Viso geral sobre o .NET Framework...................................................................................................................410 Viso Geral Conceitual Sobre o .NET Framework ...............................................................................................410 COMMON LANGUAGE RUNTIME ..................................................................................................................................416 Viso geral do Common Language Runtime .........................................................................................................416 Gerenciamento automtico de memria................................................................................................................417 CTS (Common Type System) .................................................................................................................................420 Viso Geral do CTS (Common Type System) ........................................................................................................420 Definies de Tipo.................................................................................................................................................422 Membros de Tipos .................................................................................................................................................424 Tipos de valor no Common Type System...............................................................................................................426 Classes no Common Type System..........................................................................................................................427 Delegados no Common Type System.....................................................................................................................428 Matrizes em Common Type System .......................................................................................................................430 Interfaces no Common Type System ......................................................................................................................431 Ponteiros no Common Type System (CTS) ............................................................................................................431 OS METADADOS E OS COMPONENTES AUTODESCRITIVOS ............................................................................................433 Viso Geral Sobre Metadados...............................................................................................................................433 Estrutura e uso de metadados ...............................................................................................................................434 Metadados e Estrutura do Arquivos PE ................................................................................................................434 Uso de metadados em tempo de execuo.............................................................................................................435 ASSEMBLIES NO COMMON LANGUAGE RUNTIME........................................................................................................436 Viso Geral Sobre Assemblies...............................................................................................................................437 Benefcios do Assembly .........................................................................................................................................438 Sumrio de assembly .............................................................................................................................................439 Manifesto do Assembly ..........................................................................................................................................440 Cache Global de Assemblies .................................................................................................................................442 Assemblies de Nomes Fortes .................................................................................................................................443 Consideraes sobre segurana de assemblies .....................................................................................................443 Versionamento de Assembly ..................................................................................................................................445 Nmero de Verso do Assembly ............................................................................................................................446 Verso Informativa do Assembly ...........................................................................................................................447 Posicionamento do Assembly ................................................................................................................................447 Assemblies e execuo lado a lado........................................................................................................................448 Viso Geral da Biblioteca de Classes do .NET Framework..................................................................................448 Localizador rpido de tecnologia..........................................................................................................................451 Criando Novas Seqncias de Caracteres.............................................................................................................458 Aparando e Removendo Caracteres ......................................................................................................................460 Preenchendo Seqncias de Caracteres................................................................................................................461 Comparando Seqncias de Caracteres................................................................................................................462 Alterando a Caixa..................................................................................................................................................466 Usando a Classe StringBuilder .............................................................................................................................467 Acrescentar............................................................................................................................................................468 Colees e Estruturas de Dados............................................................................................................................472 Definir colees.....................................................................................................................................................472 Comumente usados tipos da coleo.....................................................................................................................474 Colees de bits.....................................................................................................................................................474

Visual C# Consolidado

Colees especializados ........................................................................................................................................475 Criando e Manipulating colees..........................................................................................................................475 Selecionando uma Classe de Coleo ...................................................................................................................476 Enumerar uma coleo..........................................................................................................................................477 Colees e sincronizao (segurana do segmento) .............................................................................................478 Comparaes e classifica em colees..................................................................................................................478 Quando Usar Colees Genricas ........................................................................................................................479 Classe genrica List ..............................................................................................................................................480 Consideraes sobre desempenho.........................................................................................................................481 Classe genrica SortedDictionary.........................................................................................................................483 DEPURAO (COMO FAZER EM C#) ............................................................................................................................495 Compilando no Visual Studio ................................................................................................................................495 Compilao Durante o Desenvolvimento de Aplicativos ......................................................................................495 Configuraes de Compilao ..............................................................................................................................496 Compilar plataformas ...........................................................................................................................................498 Compilar elementos de interface do usurio.........................................................................................................504 Caixa de Dilogo Batch Build...............................................................................................................................504 Janela de sada ......................................................................................................................................................506 Caixa de Dilogo Configuration Manager............................................................................................................507 Depurao no Visual Studio..................................................................................................................................508 O que h de novo no depurador Visual Studio 2005 .............................................................................................508 Segurana do Depurador ......................................................................................................................................511 Segurana de Depurao Gerenciada...................................................................................................................511 Segurana em Depurao Remota ........................................................................................................................511 Segurana de Depurao de Servios da Web ......................................................................................................512 Componentes Externos ..........................................................................................................................................512 Smbolos e Cdigo Fonte.......................................................................................................................................512 Preparao e configuraes de depurao ...........................................................................................................512 Configuraes do Projeto do Depurador ..............................................................................................................513 Requisitos de software depurao SQL.................................................................................................................513 Configuraes do projeto para um C++ depurar configurao...........................................................................515 Como definir permisses SQL Server para depurao: ........................................................................................518 Configuraes do projeto para uma configurao de depurao no Visual Basic ...............................................519 Arquivos PDB (C++) ............................................................................................................................................521 Arquivos DBG .......................................................................................................................................................521 Instalando smbolos para sistema de depurao chamada Crashes .....................................................................522 Depurao de projetos DLL ..................................................................................................................................523 Preparao da depurao: Projetos de console ...................................................................................................526 Preparao de Depurao: Tipos de Projeto do Visual C++ ..............................................................................526 Preparao da Depurao: Configuraes de Propriedades Recomendveis .....................................................527 Depurao preparao: Applications formulrios Windows (.NET)....................................................................527 Projetos Win32 depurao preparao: ...............................................................................................................528 Preparao da Depurao: Web Services XML (C++)........................................................................................529 Preparao para depurao: tipos de projeto C#, J# e Visual Basic ...................................................................529 Aplicativos da Web depurao preparao: .........................................................................................................529 Preparao para depurao : Aplicativos ASP.NET da Web ...............................................................................530 Projetos Servio da Web XML depurao preparao:........................................................................................530 Preparao para depurao: Servios da Web ATL Server..................................................................................532 Preparao para depurao: Projetos ATL Server ..............................................................................................532 Instalao de depurao remota ...........................................................................................................................533 Depurao na uma plataforma de 64 bits .............................................................................................................539 Depurao e o processo Hosting...........................................................................................................................540 Explicao detalhada sobre o depurador..............................................................................................................542 Depurando o cdigo gerenciado ...........................................................................................................................542 Diagnstico de mensagens na janela de sada ......................................................................................................542 Assero no cdigo gerenciado.............................................................................................................................543 Parar instrues no Visual Basic ..........................................................................................................................546 Depurar o mtodo OnStart como: .........................................................................................................................549 Depurao de cdigo nativo..................................................................................................................................551 Como debug otimizado cdigo: .............................................................................................................................551 DebugBreak e __debugbreak ................................................................................................................................553 Declaraes...........................................................................................................................................................553 _DEBUG ...............................................................................................................................................................554

Visual C# Consolidado

Deteco vazamento de memria e isolamento.....................................................................................................555 Para depurar cdigo de montagem embutido .......................................................................................................556 Tcnicas de depurao atl.....................................................................................................................................556 Tcnicas de depurao MFC.................................................................................................................................557 Tcnicas de depurao CRT..................................................................................................................................558 Depurao Native FAQs do cdigo.......................................................................................................................559 COM e depurando ActiveX....................................................................................................................................560 Depurar aplicativos da Web..................................................................................................................................562 Depurao SQL .....................................................................................................................................................563 Depurao referncia Interface de usurio...........................................................................................................564 Aperfeioando a depurao com o atributo de exibio do depurador ................................................................573 Descrio...............................................................................................................................................................575 Cdigo ...................................................................................................................................................................575 Para criar o formulrio do Windows para essa explicao passo a passo...........................................................579 Para anexar ao formulrio do Windows para depurao.....................................................................................581 Banco de dados de depurao T-SQL ...................................................................................................................590 SEGURANA (COMO FAZER EM C#) ............................................................................................................................596 Segurana no Visual Studio...................................................................................................................................596 Noes Bsicas sobre Segurana de Accesso a Cdigo........................................................................................596 Prticas recomendadas de poltica de segurana .................................................................................................597 Viso geral da administrao de poltica de segurana .......................................................................................597 Administrao de diretiva de segurana geral......................................................................................................599 Determinando quando para modificar a diretiva de segurana............................................................................599 Ferramentas de administrao..............................................................................................................................600 Aumentar permisses.............................................................................................................................................601 Administrao com atributos Grupo de cdigos ...................................................................................................602 Dicas de administrao.........................................................................................................................................603 Administrao de diretiva corporativa..................................................................................................................604 Administrao de diretiva da mquina..................................................................................................................604 Administrao de diretiva de usurio....................................................................................................................604 EXPLICAES PASSO-A-PASSO DO .NET FRAMEWORK SDK ......................................................................................719 Como Registrar Assemblies de Interoperabilidade Primrios ..............................................................................784 Como Empacotar Vrias Verses de Bibliotecas de Tipos ...................................................................................785 APLICATIVOS DO WINDOWS (COMO FAZER EM C#) ....................................................................................................786 Componente Timer (Windows Forms)...................................................................................................................797 Viso geral do componente de timer (Windows Forms)........................................................................................797 Limitaes do componente Timer de formulrios do Windows na propriedade Interval......................................798 Controle toolBar Windows (formulrios)..............................................................................................................800 Viso geral sobre de controle toolBar (formulrios do Windows)........................................................................800 Como adicionar botes a um controle ToolBar usando o criador:.......................................................................801 PGINAS DA WEB E SERVIOS DA WEB (COMO FAZER EM C#)................................................................806 O que h de novo no desenvolvimento para Web no Visual Studio.......................................................................806 Servidor de Desenvolvimento do ASP.NET ...........................................................................................................807 Publicao de Web Sites .......................................................................................................................................808 Extensibilidade de Controle ..................................................................................................................................811 Ligao de Dados com Controles de Fonte de Dados ..........................................................................................812 Controles de dados avanados ..............................................................................................................................812 Vinculao bidirecional de dados .........................................................................................................................813 Armazenamento de seqncia de caracteres de conexo ......................................................................................813 Acesso a dados em duas e trs camadas ...............................................................................................................813 Compatibilidade com Verses Anteriores para Acesso a Dados ..........................................................................814 INTRODUO A PGINAS DA WEB DO ASP.NET.........................................................................................................815 Postagem cruzada de pginas ...............................................................................................................................816 Preservando o estado da pgina ...........................................................................................................................816 Controles de servidor ............................................................................................................................................817 Compatibilidade do navegador .............................................................................................................................818 Documentos e dados XML.....................................................................................................................................818 O que h de novo no System.Xml ..........................................................................................................................818 Migrando de verso 1.1 das classes XML .............................................................................................................819 Arquitetura Overview of XML no .NET Framework .............................................................................................822 Segurana e seus aplicativos System.Xml .............................................................................................................822 Consideraes sobre segurana System.Xml.........................................................................................................823

Visual C# Consolidado

Processamento DTD..............................................................................................................................................824 Processamento de esquema ...................................................................................................................................824 Recursos externos..................................................................................................................................................824 Compartilhar objetos XmlReaderSettings .............................................................................................................825 Suporte componentes.............................................................................................................................................825 Processamento de dados .......................................................................................................................................825 Processamento DTD..............................................................................................................................................825 Tratamento de entidade .........................................................................................................................................825 Recursos externos..................................................................................................................................................825 Recursos externos..................................................................................................................................................826 Blocos de script .....................................................................................................................................................826 Objetos de extenso...............................................................................................................................................826 System.Xml codificao diretrizes .........................................................................................................................827 Acesso externo .......................................................................................................................................................827 Negao de Servio ...............................................................................................................................................827 Processamento.......................................................................................................................................................828 Dados XML processo In-Memory..........................................................................................................................829 Processo dados XML usando o modelo DOM.......................................................................................................829 Processo dados XML usando o modelo de dados XPath.......................................................................................830 Lendo XML com o XmlReader...............................................................................................................................831 Escrevendo XML com o XmlWriter .......................................................................................................................832 Novos recursos na classe XmlWriter.....................................................................................................................832 Verificao de caracteres......................................................................................................................................833 Verificando a conformidade ..................................................................................................................................833 Usando o XmlWriter..............................................................................................................................................833 Transformaes em XSLT......................................................................................................................................834 Usando a classe XslCompiledTransform...............................................................................................................834 Migrando da classe XslTransform ........................................................................................................................835 Consideraes sobre segurana XSLT ..................................................................................................................837 Transformaes em XSLT com a classe XslTransform..........................................................................................839 Modelo de objeto de esquema (SOM) do XML......................................................................................................841 Viso geral do modelo de objeto do esquema XML ..............................................................................................841 Leitura e escrita esquemas XML ...........................................................................................................................843 Criando esquemas XML ........................................................................................................................................844 Atravessando esquemas XML................................................................................................................................847 Editar Esquemas XML...........................................................................................................................................849 Incluindo ou importar esquemas XML ..................................................................................................................853 Integrao XML com dados relacional e ADO.NET .............................................................................................855 Resolver externos recursos XML nomeados por um URI......................................................................................857 Resolvendo recursos usando o XmlResolver .........................................................................................................857 Fornecer credenciais de autenticao para XmlResolver quando leitura de um arquivo ....................................858 Para criar um objeto XmlReader que usa um XmlSecureResolver .......................................................................860 Codificao de caracteres de nomes XML e converso de tipos de dados XML...................................................860 Espaos para nomes em um documento XML .......................................................................................................860 Suporte tipo nas classes System.Xml .....................................................................................................................861 Mapear tipos de dados XML para tipos CLR ........................................................................................................861 Observaes de implementao de suporte tipo XML...........................................................................................863 Converso de tipos de dados XML ........................................................................................................................864 SERVIOS DA WEB XML NO CDIGO GERENCIADO ....................................................................................................866 Introduo programao servios XML da Web no cdigo gerenciado ............................................................866 Programao na Web com XML Web Services .....................................................................................................867 Criando XML Web Services em cdigo gerenciado ..............................................................................................867 Acessando XML Web Services no cdigo gerenciado ...........................................................................................869 Criado usando clientes do servio XML da Web ASP.NET e Servios XML da Web ...........................................870 Acessar a Pgina de Ajuda de Servio ..................................................................................................................878 Acessar a descrio de servio..............................................................................................................................878 Fornecendo um nome de mensagem para um mtodo de XML Web Service ........................................................883 Criando uma nova transao com um mtodo de XML Web Service....................................................................884 Protegendo Servios da Web XML Criados Usando ASP.NET.............................................................................895 ACESSO A DADOS (COMO FAZER EM C#) ....................................................................................................................900 Criando os controles para exibir os pedidos para cada cliente (registros filho) ..................................................902 Viso geral sobre como conectar-se a dados no Visual Studio.............................................................................903 Viso Geral do Adaptador de Tabela....................................................................................................................921

Visual C# Consolidado

10

Viso Geral do Preenchimento de DataSets e Consultas de Dados......................................................................927 Viso Geral da Exibio dados .............................................................................................................................936 Ligao de Objeto no Visual Studio ......................................................................................................................962 Viso Geral da Edio de dados em DataSets ......................................................................................................966 Viso geral sobre validao de dados...................................................................................................................967 Viso Geral do Salvar dados.................................................................................................................................972 Introduo ao CONCURRENCY dados em ADO.NET .........................................................................................982 CONCURRENCY pessimista.................................................................................................................................982 CONCURRENCY otimista.....................................................................................................................................983 ltima no WINS.....................................................................................................................................................983 A abordagem nmero verso.................................................................................................................................984 Para adicionar o tratamento de erro para o erro de concorrncia ......................................................................989 Elementos de Dados de Interface de Usurio .......................................................................................................994 Adaptadores de Dados do ADO.NET ....................................................................................................................997 Projetos SQL Server ..............................................................................................................................................998 CRIANDO CLASSES (COMO FAZER EM C#) ................................................................................................................1004 COMO: Criar Tipos em Diagramas de Classe ...................................................................................................1004 Criando e Configurando Membros de Tipos .......................................................................................................1005 Criar membros tipo .............................................................................................................................................1005 COMO: Modificar membros de tipo....................................................................................................................1006 COMO: Adicionar um parmetro a um mtodo..................................................................................................1006 COMO: Abrir a janela Class Details ..................................................................................................................1007 Atalhos de teclado para a janela Detalhes de classe ..........................................................................................1007 Usando o teclado.................................................................................................................................................1008 Observaes teis sobre a janela Class Details ..................................................................................................1009 Exibio de informaes somente leitura............................................................................................................1010 Elementos da janela Class Details ......................................................................................................................1011 Linhas membro ....................................................................................................................................................1011 Linhas de parmetro............................................................................................................................................1012 COMO: Herdar de um Tipo Genrico.................................................................................................................1012 COMO: Definir herana entre tipos....................................................................................................................1013 COMO: Definir associaes entre tipos..............................................................................................................1013 COMO: Excluir formas de tipos e cdigo associado de diagramas classe.........................................................1014 COMO: Aplicar atributos personalizados a tipos ou membros de tipo...............................................................1015 COMO: Exibir Herana entre Tipos ...................................................................................................................1015 COMO: Exibir tipos derivados............................................................................................................................1016 COMO: Remover formas de tipos de diagramas de classe .................................................................................1016 COMO: Exibir compartimentos em formas de tipo.............................................................................................1017 COMO: Exibir detalhes do tipo: .........................................................................................................................1018 COMO: Alternar entre notao de membro e notao de associao................................................................1019 COMO: Exibir membros de tipo .........................................................................................................................1019 COMO: Adicionar diagramas de classes a projetos ...........................................................................................1020 COMO: Exibir tipos existentes............................................................................................................................1021 Ententendo um cdigo que voc no escreveu ....................................................................................................1022 COMO: Agrupar membros de tipo ......................................................................................................................1022 COMO: Adicionar comentrios a diagramas de classe ......................................................................................1022 Personalizando diagramas de classe...................................................................................................................1023 COMO: Copiar elementos de diagrama de classe para um documento do Microsoft Office .............................1024 COMO: Imprimir diagramas de classe ...............................................................................................................1024 COMO: Ignorar membros de tipo .......................................................................................................................1025 COMO: Renomear tipos e membros de tipo........................................................................................................1025 COMO: Mover um membro de tipo de um tipo para outro .................................................................................1026 COMO: Implementar uma interface....................................................................................................................1026 COMO: Implementar uma classe abstrata..........................................................................................................1027 COMO: Extrair para interface (C# somente)......................................................................................................1027 COMO: Reordenar parmetros (C# somente) ....................................................................................................1027 COMO: Criar um membro ..................................................................................................................................1027 COMO: Implementar um designer para um controle..........................................................................................1029 COMO: Criar e configurar componentes no modo Design.................................................................................1030 Como: Acessar suporte em tempo de design no Windows Forms .......................................................................1036 COMO: Implementar um provedor Extender HelpLabel ....................................................................................1037 COMO: Acessar servios em tempo de criao ..................................................................................................1041 COMO: Serializar colees de tipos padro com o DesignerSerializationVisibilityAttribute............................1048

Visual C# Consolidado

11

Como: Executar inicializao personalizada para controles no modo de design...............................................1049 COMO: Implementar um conversor de tipo ........................................................................................................1050 Para implementar um conversor de tipo simples que pode converter uma seqncia para um ponto................1050 Para implementar um conversor de tipo simples que fornece uma lista drop-down de valores padro em um navegador Propriedade.......................................................................................................................................1051 Para implementar um conversor tipo que produz Propriedade baseado no construtor-cdigo de inicializao1053 COMO: Implementar um editor UI de tipo .........................................................................................................1054 Como: Estender a aparncia e comportamento de controles no modo de design...............................................1055 COMO: Criar um controle de formulrios do Windows que tira vantagem de recursos em tempo de criao..1064 COMO: Anexar marcas inteligentes para um componente de formulrios do Windows ....................................1071 COMO: Ajustar atributos, eventos e propriedades de um componente no modo Design ...................................1073 PROGRAMAO DO OFFICE (COMO FAZER EM C#) ...................................................................................................1080 Como: Atualizar solues das Ferramentas do Visual Studio para o Office ......................................................1080 O Excel Usando Explicaes Passo-a-passo.......................................................................................................1081 Coleta de dados usando um formulrio do Windows Walkthrough: ...................................................................1081 Para criar um novo projeto .................................................................................................................................1081 Para adicionar um intervalo nomeado para Sheet1............................................................................................1081 Para adicionar um formulrio do Windows ........................................................................................................1082 Para exibir o formulrio e coletar informaes..................................................................................................1082 Para enviar informaes para a planilha ...........................................................................................................1083 Para testar sua pasta de trabalho .......................................................................................................................1083 Alterando planilha formatao usando controles CheckBox Walkthrough: .......................................................1083 Para criar um novo projeto .................................................................................................................................1084 Para adicionar trs caixas de seleo.................................................................................................................1084 Para adicionar texto a um controle NamedRange ..............................................................................................1085 Exibindo texto em uma caixa de texto em uma planilha usando um boto Walkthrough: ..................................1086 Para testar sua pasta de trabalho .......................................................................................................................1088 Programao contra eventos de um controle NamedRange Walkthrough: ........................................................1088 Walkthrough: vinculao clulas para vrias colunas em uma tabela ...............................................................1099 Criando uma relao mestre / detalhes usando um DataSet em cache Walkthrough:........................................1103 Para criar um novo projeto .................................................................................................................................1104 Armazenar em cache DataSet..............................................................................................................................1105 Para percorrer os registros.................................................................................................................................1106 Para testar o cache de dados ..............................................................................................................................1106 Para adicionar os dados .....................................................................................................................................1107 Para adicionar um grfico ..................................................................................................................................1108 Para criar um novo projeto .................................................................................................................................1108 Para alterar o nome do controle grfico.............................................................................................................1109 Para adicionar um controle de usurio...............................................................................................................1109 Para adicionar controles Windows Form ao controle de usurio ......................................................................1109 Para criar um evento e propriedade em um controle de usurio........................................................................1110 Para manipular o evento CheckedChanged dos botes de opo.......................................................................1110 Para adicionar o controle do usurio sua planilha ............................................................................................1111 Para alterar o tipo de grfico que exibido na planilha ....................................................................................1111 Para testar sua pasta de trabalho .......................................................................................................................1112 Vinculao de Dados para controles em um painel Aes do Excel Walkthrough:............................................1112 Para criar um novo projeto .................................................................................................................................1113 Para adicionar uma nova fonte de dados para o projeto....................................................................................1113 Para adicionar um NamedRange e um controle ListObject ................................................................................1114 Para adicionar um controle painel Aes ...........................................................................................................1114 Para adicionar controles Windows Forms ligados a dados a um controle painel Aes ...................................1114 Para definir propriedades de vinculao de dados do controle..........................................................................1115 Para mostrar o painel Aes ...............................................................................................................................1115 Para testar seu documento ..................................................................................................................................1115 Implantando um Word ou Solution do Excel usando um manifesto Deployment Walkthrough: .........................1116 Para criar um novo projeto .................................................................................................................................1117 Para adicionar uma caixa de mensagem a um evento de inicializao ..............................................................1117 Para publicar a soluo ......................................................................................................................................1117 Para atualizar o manifesto do aplicativo incorporado........................................................................................1118 Para atualizar a manifesto de implantao.........................................................................................................1119 Para atualizar o manifesto do aplicativo externo ...............................................................................................1119 Para copiar os arquivos de soluo para o servidor ..........................................................................................1120 Para conceder confiana total para a pasta de rede...........................................................................................1120

Visual C# Consolidado

12

Para testar a implantao ...................................................................................................................................1120 Implantando um Word ou Solution do Excel usando um arquivo do Windows Installer Walkthrough: .............1121 Para criar um novo projeto .................................................................................................................................1122 Para adicionar uma caixa de mensagem a um evento de inicializao ..............................................................1122 Para criar um projeto de instalao para a soluo...........................................................................................1122 Para adicionar o documento e conjunto ao projeto de instalao......................................................................1123 Para criar um projeto ao personalizada..........................................................................................................1123 Para criar uma ao personalizada que edita o manifesto do aplicativo ...........................................................1124 Para adicionar a sada primria do projeto ao personalizada ao projeto de instalao................................1125 Para testar a instalao ......................................................................................................................................1125 Passo-a-passo: Concedendo e removendo permisses para uma soluo do Office ..........................................1126 Para criar um novo projeto .................................................................................................................................1126 Para adicionar uma caixa de mensagem a um evento de inicializao ..............................................................1126 Para remover um grupo de cdigos ....................................................................................................................1127 Para criar um nome forte ....................................................................................................................................1128 Para conceder confiana com base em nome forte .............................................................................................1128 Para testar sua pasta de trabalho .......................................................................................................................1128 O Word Usando Explicaes Passo-a-passo.......................................................................................................1129 Walkthrough: Changing Document formatao usando controles CheckBox ....................................................1129 Para criar um novo projeto .................................................................................................................................1129 Para adicionar trs caixas de seleo.................................................................................................................1130 Para adicionar texto e um controle indicador.....................................................................................................1130 Para alterar a formatao quando uma caixa de seleo marcada.................................................................1131 Para testar seu documento ..................................................................................................................................1132 Exibindo texto em uma caixa de texto em um documento usando um boto Walkthrough: ................................1132 Para criar um novo projeto .................................................................................................................................1133 Para adicionar um boto e uma caixa de texto ...................................................................................................1133 Para escrever para a caixa de texto quando o boto clicado...........................................................................1133 Para testar seu documento ..................................................................................................................................1134 Walkthrough: Criando menus de atalho para indicadores .................................................................................1134 Para criar um novo projeto .................................................................................................................................1135 Para adicionar texto ao seu documento ..............................................................................................................1135 Para adicionar um controle indicador ao seu documento ..................................................................................1135 Para criar o menu de atalho................................................................................................................................1135 Para formatar o texto contido no indicador........................................................................................................1136 Para testar seu documento ..................................................................................................................................1137 Walkthrough: atualizando um grfico em um documento usando botes de opo............................................1137 Para criar um novo projeto .................................................................................................................................1138 Para adicionar um grfico ..................................................................................................................................1138 Para adicionar um controle de usurio...............................................................................................................1139 Para adicionar controles Windows Form ao controle de usurio ......................................................................1139 Para adicionar uma referncia 11.0 biblioteca objeto do Graph Microsoft ....................................................1140 Para criar um evento e propriedade em um controle de usurio........................................................................1140 Para manipular o evento CheckedChange dos botes de opo.........................................................................1140 Para adicionar o controle de usurio do documento ..........................................................................................1141 Para alterar o tipo de grfico que exibido no documento ................................................................................1141 Para testar seu documento ..................................................................................................................................1142 Vinculao de Dados para controles em um painel Aes do Word Walkthrough:............................................1142 Para criar um novo projeto .................................................................................................................................1143 Para adicionar um controle painel Aes ...........................................................................................................1143 Para adicionar uma nova fonte de dados para o projeto....................................................................................1143 Para adicionar controles Windows Forms ligados a dados a um controle painel Aes ...................................1144 Para carregar o controle com dados...................................................................................................................1145 Para definir propriedades de vinculao de dados do controle..........................................................................1145 Para formatar os ttulos de tabela.......................................................................................................................1145 Para criar a tabela ..............................................................................................................................................1146 Para inserir texto em uma tabela do Word..........................................................................................................1146 Para mostrar o painel Aes ...............................................................................................................................1147 Para testar seu documento ..................................................................................................................................1147 Walkthrough: criar uma marca inteligente que converte Temperatures de Fahrenheit para Celsius ................1148 Para criar um novo projeto .................................................................................................................................1148 Para configurar seu projeto ................................................................................................................................1148 Para criar a marca inteligente ............................................................................................................................1149

Visual C# Consolidado

13

Para criar o manipulador de eventos..................................................................................................................1149 Para testar sua pasta de trabalho .......................................................................................................................1150 Implantando um Word ou Solution do Excel usando um manifesto Deployment Walkthrough: .........................1150 Para criar um novo projeto .................................................................................................................................1151 Para adicionar uma caixa de mensagem a um evento de inicializao ..............................................................1151 Para publicar a soluo ......................................................................................................................................1152 Para atualizar o manifesto do aplicativo incorporado........................................................................................1152 Para atualizar a manifesto de implantao.........................................................................................................1153 Para atualizar o manifesto do aplicativo externo ...............................................................................................1153 Para copiar os arquivos de soluo para o servidor ..........................................................................................1154 Para conceder confiana total para a pasta de rede...........................................................................................1154 Para testar a implantao ...................................................................................................................................1154 Implantando um Word ou Solution do Excel usando um arquivo do Windows Installer Walkthrough: .............1155 Para criar um novo projeto .................................................................................................................................1156 Para adicionar uma caixa de mensagem a um evento de inicializao ..............................................................1156 Para criar um projeto de instalao para a soluo...........................................................................................1156 Para adicionar o documento e conjunto ao projeto de instalao......................................................................1157 Para criar um projeto ao personalizada..........................................................................................................1157 Para criar uma ao personalizada que edita o manifesto do aplicativo ...........................................................1158 Para adicionar a sada primria do projeto ao personalizada ao projeto de instalao................................1159 Para testar a instalao ......................................................................................................................................1159 Passo-a-passo: Concedendo e removendo permisses para uma soluo do Office ..........................................1160 Para criar um novo projeto .................................................................................................................................1160 Para adicionar uma caixa de mensagem a um evento de inicializao ..............................................................1160 Para remover um grupo de cdigos ....................................................................................................................1161 Para criar um nome forte ....................................................................................................................................1162 Para conceder confiana com base em nome forte .............................................................................................1162 Para testar sua pasta de trabalho .......................................................................................................................1162 COMO: Adicionar Controles a Documentos do Office.......................................................................................1162 Para arrastar um Windows Forms controle para o documento..........................................................................1163 Para desenhar um Windows Forms controle sobre o documento .......................................................................1163 Para adicionar um controle Windows Forms para o documento clicando uma nica vez sobre o controle ......1164 Para adicionar um controle Windows Forms para o documento clicando duas vezes no controle ....................1164 Para adicionar um controle Windows Forms para o documento, pressionando a tecla ENTER........................1164 Para adicionar um Windows Forms controlar programaticamente ...................................................................1165 COMO: Executar Clculos do Excel por Programao .....................................................................................1165 Para executar clculos em um controle NamedRange ........................................................................................1165 Executar clculos para o aplicativo inteiro ........................................................................................................1165 Para executar clculos em todas as pastas de trabalho abertas.........................................................................1165 Como: Criar menus do Office programaticamente .............................................................................................1166 COMO: Criar Barras de Ferramentas do Office por Programao...................................................................1167 DISPOSITIVOS INTELIGENTES ....................................................................................................................................1168 O que h de novo em projetos Smart Device.......................................................................................................1168 O que h de novo no desenvolvimento visual aplicativos dispositivos C++.......................................................1168 Destino vrios sistemas operacionais .................................................................................................................1168 Sistema do projeto ...............................................................................................................................................1168 O IntelliSense ......................................................................................................................................................1168 Modo misto Solutions ..........................................................................................................................................1168 Instalar do aplicativo ..........................................................................................................................................1168 Aplicativos personalizados e assistentes de classe..............................................................................................1168 Editor de recursos ...............................................................................................................................................1169 ATL ......................................................................................................................................................................1169 MFC ....................................................................................................................................................................1170 O que h de novo no Managed projetos de dispositivo .......................................................................................1170 Como Iniciar o Emulador de Dispositivo no Visual Studio.................................................................................1171 Viso geral do acesso de dados (projetos do dispositivo gerenciado) ................................................................1172 Viso geral Solutions do dispositivo de embalagem ...........................................................................................1173 Alternar plataformas em projetos de dispositivo.................................................................................................1174 Ferramentas Remotas para Projetos de Dispositivos .........................................................................................1174 Viso geral sobre segurana (dispositivos).........................................................................................................1175 Seleo mtodo de conexo.................................................................................................................................1176 Atualizando Projetos Criados com Ferramentas Anterior..................................................................................1178 Selecionando uma Linguagem de Desenvolvimento............................................................................................1179

Visual C# Consolidado

14

Programao para Dispositivos usando o .NET Compact Framework ..............................................................1182 Referncia do .NET Compact Framework para Projetos de Dispositivos ..........................................................1183 Gerenciando Trechos de Cdigo em Projetos Dispositivos ................................................................................1186 Diferenas entre depuradores de dispositivos e de desktop ................................................................................1194 IMPLANTAO (COMO FAZER EM C#) .......................................................................................................................1235

Visual C# Consolidado

15

VISUAL C#
Microsoft Visual C# 2005, pronunciado C sharp, uma linguagem de programao projetada para criar uma ampla variedade de aplicativos executados no .NET Framework. C# simples, poderoso, com segurana de tipos, e orientada a objetos. Com suas muitas inovaes, C# permite o desenvolvimento rpido de aplicativos mantendo a expressividade e elegncia das linguagens do estilo C. Visual Studio oferece suporte ao Visual C# com um editor de cdigos completo, modelos de projeto, designers, assistentes de cdigo, depurador poderoso e de fcil uso, e outras ferramentas. A biblioteca de classes do .NET Framework fornece acesso a uma grande variedade de servios do sistema operacional e outras classes teis, e bem estruturadas que aceleram o ciclo de desenvolvimento significativamente.

Nesta seo
Guia de Introduo ao Visual C#
Apresenta os recursos do C# 2.0 para programadores novos para a linguagem ou novos para o Visual Studio, e fornece um roadmap para encontrar ajuda no Visual Studio. Isso tambm est localizado nas pginas "Como Fazer".

Usando o Visual C# IDE


Apresenta o ambiente de desenvolvimento do Visual C#.

Escrevendo aplicativos com Visual C#


Fornece uma orientao de alto nvel abrangendo tarefas comuns de programao usando C# e o .NET Framework, com links para a documentao mais detalhada.

Migrando para o Visual C#


Compara a linguagem C# com Java e C++ e descreve como usar o Java Language Conversion Assistant para converter aplicativos Java e Visual J++ para Visual C#.

Guia de programao C #
Fornece informaes e exemplos prticos sobre como usar construes de linguagem C#.

Referncia C#
Fornece informaes de referncia detalhadas em conceitos de programao C#, palavras-chave, tipos, operadores, atributos, diretivas de pr-processador, opes de compilador, e erro de compilador e avisos.

Especificao da linguagem C#
Links para a verso mais recente das especificaes C# no formato Microsoft Word.

Exemplos de Visual C#
Exemplo de cdigo fonte que demonstram como programar usando Visual C#.

Visual C# Consolidado

16

GUIA DE INTRODUO AO VISUAL C#


Os tpicos a seguir ajudam a iniciar o desenvolvimento de aplicativos usando o Microsoft Visual C# 2005. Esses tpicos tambm lhe introduziro a muitos novos recursos no Microsoft Visual Studio 2005 como verso 2.0 da linguagem C#. Nesta seo Guia da documentao do Visual C# Fornece uma orientao de alto nvel sobre o contedo da documentao Visual C#. Introduo linguagem C# e ao Framework .NET Fornece uma viso geral sobre a linguagem C# e a plataforma .NET. O Que H de Novo no Visual C-# 2005 O que h de novo no Microsoft Visual C# 2005. O Que H de Novo na Linguagem e Compilador C# 2.0 O que h de novo na verso 2.0 do C#. Atualizando Aplicativos Visual C# para Visual Studio 2005 Atualizando seus projetos existentes para o Microsoft Visual Studio 2005. Criando Seu Primeiro Aplicativo C# Escrevendo, compilando e executando um simples aplicativo C#. Usando Starter Kits C# Usando os Starter Kits C#. Recursos de ajuda adicionais (Visual C#) Links para outros recursos de ajuda. Como Fazer em C# Links para tpicos que mostram como executar uma variedade de tarefas especficas.

Guia da Documentao do Visual C#


A documentao do Microsoft Visual C# 2005 contm informaes que so especficas para a linguagem C#, como palavras-chave, opes de compilador, mensagens de erro e conceitos de programao. Esta documentao tambm oferece uma viso geral de como usar o ambiente de desenvolvimento integrado (IDE). Alm disso, existem muitos links para obter ajuda detalhada sobre classes .NET Framework, desenvolvimento da Web do ASP.NET, depurao, programao de banco de dados SQL e muito mais. O diagrama a seguir fornece uma exibio dos conceitos do contedo da documentao do Visual C# e o relacionamento deste contedo com outras sees relevantes da documentao do Visual Studio e a MSDN on-line.

Visual C# Consolidado

17

Introduo linguagem C# e ao .NET Framework


C# uma linguagem elegante orientada a objetos e fortemente tipada que permite aos desenvolvedores criar uma ampla variedade de aplicativos seguros e eficientes que so executados sob o .NET Framework. Voc pode usar C# para criar aplicativos clientes tradicionais do Windows , XML Web services, componentes distribudos, aplicativos cliente-servidor, aplicativos de banco de dados, e muito, muito mais. Microsoft Visual C# 2005 fornece um editor de cdigo avanado, designers de interface de usurio convenientes, depurador integrado, e muitas outras ferramentas para facilitar o rpido desenvolvimento de aplicativos com base na verso 2.0 da linguagem C# e do .NET Framework. Observao A documentao Visual C# presume que voc tenha uma compreenso dos conceitos bsicos existentes de programao. Se voc for um completo principiante, convm explorar Visual C# Express Edition, que est disponvel na Web. Voc tambm pode aproveitar qualquer um dos diversos livros excelentes e recursos da Web em C# para aprender tcnicas de prtica de programao. Linguagem C# A sintaxe C# altamente expressiva, mas com menos de 90 palavras-chave, tambm simples e fcil para aprender. A sintaxe do C# utilizando chaves como marcador de blocos ser instantaneamente reconhecvel para qualquer pessoa familiarizada com C, C++ ou Java. Os desenvolvedores que conhecem qualquer uma dessas linguagens so normalmente capazes de comear a trabalhar produtivamente em C# dentro de muito pouco tempo. A sintaxe C# simplifica muitas das complexidades de C++ enquanto fornece recursos poderosos como tipos de valor anulvel, enumeraes, delegaes, mtodos annimos e acesso direto memria, que no foram localizados em Java. C# tambm oferece suporte a mtodos e tipos genricos, que fornecem aumento de segurana e desempenho, e iteradores, que permitem implementadores das classes de coleo definirem comportamentos personalizados da iterao que so simples para usar pelo cdigo do cliente.

Visual C# Consolidado

18

Como uma linguagem orientada a objetos, C# suporta os conceitos de encapsulamento, herana e polimorfismo. Todas as variveis e mtodos, incluindo o mtodo Main, ponto de entrada do aplicativo, so encapsulados em definies da classe. Uma classe pode herdar diretamente de uma classe pai, mas ela pode implementar qualquer nmero de interfaces. Mtodos que substituem mtodos virtuais em uma classe pai exigem a palavra-chave override como uma forma para evitar redefinio acidental. No C#, uma estrutura como uma classe simplificada; ele um tipo alocado na pilha que pode implementar interfaces mas no tem suporte a herana. Alm desses princpios orientados a objetos, C# facilita o desenvolvimento de componentes de software atravs de vrios construtores inovadores da linguagem, incluindo:

Assinaturas de mtodos encapsulados chamadas delegaes, que permitem notificaes de eventos fortemente tipados. Propriedades, que servem como accessadores de variveis membros privadas. Atributos, que fornecem metadados declarativos sobre tipos no tempo de execuo. Comentrios internos da documentao XML.

Se voc precisar interagir com outro software Windows como objetos COM ou DLLs nativas Win32, voc pode fazer isso em C# atravs de um processo denominado "Interoperabilidade". Interoperabilidade permite que programas C# faam praticamente tudo que um aplicativo C++ nativo pode fazer. C# tambm suporta ponteiros e o conceito de cdigo "inseguro" para os casos no qual o acesso direto a memria absolutamente essencial. O processo de compilao C# simples comparado ao C e C++ e mais flexvel do que em Java. No h nenhum arquivo cabealho separado, e nenhum requisito de que mtodos e tipos sejam declarados em uma ordem especfica. Um arquivo fonte C# pode definir qualquer nmero de classes, estruturas, interfaces, e eventos. Arquitetura da plataforma .NET Framework Programas C# so executados no .NET Framework, um componente integrante do Windows que inclui um sistema de execuo virtual chamado de Common Language Runtime (CLR) e um conjunto unificado de bibliotecas de classe. O CLR implementao comercial da Microsoft do Common Language Infrastructure (CLI), um padro internacional que a base para criar ambientes de execuo e desenvolvimento nos quais linguagens e bibliotecas trabalham perfeitamente juntas. Cdigo fonte escrito em C# compilado em uma linguagem intermediria (IL) que est em conformidade com a especificao CLI. O cdigo IL, juntamente com recursos como bitmaps e seqncias de caracteres, armazenado em disco em um arquivo executvel chamado de assembly, normalmente com uma extenso .exe ou .dll. Um assembly contm um manifesto que fornece informaes sobre tipos do assembly, verso, cultura, e requisitos de segurana. Quando o programa C# executado, o mdulo (assembly) carregado no CLR, que pode levar a vrias aes com base nas informaes no manifesto. Em seguida, se os requisitos de segurana forem atendidos, o CLR executa a compilao Just-In-Time (JIT) para converter o cdigo IL em instrues nativas da mquina. O CLR tambm oferece outros servios relacionados a coleta de lixo automtica, tratamento de exceo, e gerenciamento de recursos. Cdigo que executado pelo CLR as vezes conhecido como "cdigo gerenciado", em contraste com "cdigo no gerenciado" que compilado em linguagem de mquina nativa que atinge um sistema especfico. O diagrama a seguir ilustra os relacionamentos entre o tempo de compilao e o tempo de execuo dos arquivos de cdigo fonte C#, as bibliotecas de classes base, mdulos (assemblies), e o CLR.

Visual C# Consolidado

19

A interoperabilidade da linguagem um recurso chave do .NET Framework. Por estar em conformidade com o Common Type Specification (CTS), o cdigo IL produzido pelo compilador C# pode interagir com cdigo que foi gerado a partir das verses .NET do Visual Basic, Visual C++, Visual J#, ou qualquer uma das outras mais de 20 linguagens CTS-Compliant. Um conjunto nico pode conter vrios mdulos escritos em linguagens .NET diferentes, e os tipos podem se referenciar como se eles fossem escritos na mesma linguagem. Alm dos servios de tempo de execuo, o .NET Framework tambm inclui uma biblioteca abrangente com mais de 4000 classes organizadas em namespaces que fornecem uma variedade de funcionalidades teis para tudo desde entrada e sada de arquivo at manipulao de seqncia para anlise XML e controles de Windows Forms. Uma aplicao C# tpica usa amplamente a biblioteca de classe do .NET Framework para manipular tarefas comuns de "conexes internas".

O que h de novo no Visual C# 2005


O Microsoft Visual C# 2005 inclui novos recursos nas reas a seguir:

Linguagem e Compilador Editor de cdigos Ambiente de desenvolvimento Documentao e especificao de linguagem Depurao

Linguagem e Compilador A linguagem C# agora suporta tipos genrico, iteradores e tipos parciais. A verso mais recente do compilador C# tambm inclui novos recursos e opes. Para mais informaes, consulte O que h de novo na Linguagem e Compilador C# 2.0. Editor de cdigos O Editor de cdigos contm os seguintes recursos novos para Visual C# 2005.

Trechos de cdigo Visual C# Consolidado 20

Trechos de cdigos aumentam a velocidade de entrada de cdigos de construo comuns fornecendo um modelo que pode ser preenchido. Trechos so armazenados como arquivos XML que podem ser facilmente editados e personalizados.

Trechos de cdigos (C#) COMO: Usar trechos de cdigo (C#) COMO: Usar trechos de cdigo circunscritos

Refatorao
Ferramentas de refactorao podem automaticamente reestruturar seu cdigo fonte, por exemplo, promovendo as variveis locais para parmetros ou convertendo um bloco de cdigo em um mtodo.

COMO: Promover varivel local para parmetro Extrair o mtodo Encapsular o campo Extrair a interface Renomear Remover parmetros Reordenar parmetros

Ambiente de Desenvolvimento O ambiente de desenvolvimento inclui os seguintes aperfeioamentos para Visual C# 2005.

O IntelliSense
O IntelliSense foi aprimorado com os novos recursos a seguir:

A lista de concluso de List Members aparece automaticamente quando voc volta com o cursor para um operador de escopo que precede um objeto, ou quando voc desfaz a ao de concluso. Quando voc escreve cdigo de tratamento de erros, o Membros lista o ajuda a descobrir qual exceo atrair filtrando membros irrelevantes da lista de concluso em uma clusula catch. Quando voc precisa inserir cdigo padronizado, o Automatic Code Generation agora permite que voc determine que o IntelliSense insira o cdigo para voc. IntelliSense est disponvel ao criar aplicativos da Web.

Class Designer
O Class Designer um novo editor que exibe graficamente classes e tipos e permite que os mtodos sejam adicionados ou modificados. Tambm possvel usar ferramentas de refatorao a partir da janela Class Designer.

Consulte Projetando e exibindo classes e tipos.

Banco de Testes de Objeto


O banco de testes de objeto projetado para teste simples a nvel de objeto. Permite criar uma instncia de um objeto e chamar seus mtodos.

Consulte Banco de Testes de Objeto.

Implantao ClickOnce
A implantao ClickOnce permite que voc publique aplicativos do Windows em um servidor Web ou em compartilhamento de arquivos de rede para instalaes simplificadas.

Visual C# Consolidado

21

Consulte Implantao ClickOnce.

Suporte a Ferramentas para Assemblies Fortemente Nomeados


A caixa de dilogo Project Properties foi reprojetada, e agora inclui suporte para assinatura a assemblies.

Consulte Propriedades do Projeto.

Assistentes de Cdigo
Os assistentes cdigo a seguir esto agora obsoletos:

Assistente para o mtodo C# Assistente para a propriedade C# Assistente para o campo C# Assistente para o indexador C#

Documentao e Especificao de Linguagem Amplamente a documentao de referncia do C# tem sido regravada para fornecer informaes mais completas para perguntas comuns assim como avanadas de uso que os desenvolvedores podem encontrar ao criar aplicativos em C#. O especificador de linguagem do C# est mais integrado para o ambiente de Ajuda, mas fornecido em dois arquivos .doc. Esses arquivos so instalados por padro em \\Microsoft Visual Studio 8\vcsharp\specifications\1033\. As verses mais atualizadas podem ser baixadas na Central de Desenvolvimento do C# no MSDN. Para mais informaes, consulte Especificao de Linguagem do C#. Melhorias na Depurao Especfica do C# Novos recursos, incluindo Edit e Continue, foram adicionados para auxiliar o desenvolvedor C#.

O que h de novo na C# 2.0 idioma e Compiler


Com o lanamento do Visual Studio 2005, a linguagem C# foi atualizada para verso 2.0, que oferece suporte os seguintes recursos novos: Tipos genricos Tipos genricos so adicionados ao idioma para ativar os programadores para atingir um nvel alto de reutilizao e desempenho avanado para classes coleo. Tipos genricos podem diferir somente por aridade. Parmetros tambm podem ser forados a ser tipos especficos. Para obter mais informaes, consulte Parmetros genricos tipo. Iteradores Iterators facilitam para ditar um foreach loop como ser iterar sobre uma coleo o contedo. Classes parciais Definies de tipo parcial permitem que um tipo simples, a ser dividida em vrios arquivos, como uma classe,. O designer visual studio utiliza esse recurso para separar seu cdigo gerado do cdigo do usurio. Tipos anulvel Tipos anulveis permitem que uma varivel para conter um valor que indefinido. Tipos anulveis so teis quando trabalhar com bancos de dados e outras estruturas de dados que podem conter elementos que contm sem valores especficos. Mtodos annimo

Visual C# Consolidado

22

Agora possvel para passar um bloco de cdigo como um parmetro. Qualquer Lugar um representante esperado, um bloco de cdigo poder ser usado: no necessrio para definir um novo mtodo. Qualificador alias Namespace O qualificador alias espao para nome. proporciona mais controle sobre acessar membros espao para nome (::) O global:: alias permite acesso a raiz que pode estar ocultas por uma entidade em seu cdigo. Classes estticas Classes estticas so uma maneira segura e conveniente de declarar uma classe que contm mtodos estticos que no podem ser instanciados. Em C# verso 1.2 voc seria tenha definido o construtor de classe como particular para impedir que a classe sendo instanciado. Alias assembly externo Referncia verses diferentes do mesmo componente contidos no mesmo conjunto com esse uso expandido de palavra-chave extern. Propriedade acessibilidade Accessor Do get agora possvel para definir diferentes nveis de acessibilidade para e set assessores em Propriedades. Covarincia e Contravariance em representantes O mtodo passado para um representante agora podem ter maior flexibilidade no seu tipo de retorno e parmetros. HOW TO: Declare, Instantiate, e usar um representante Mtodo converso de grupo fornece uma sintaxe simplificada para declarar representantes. Buffers tamanho fixo Em um bloco cdigo desprotegido, agora possvel para declarar estruturas de tamanho fixo com matrizes incorporados. Conjuntos de amigo Conjuntos podem fornecer acesso a tipos no-pblicos para outros conjuntos. Controle de aviso embutido A #pragma diretiva de aviso pode ser usada para desativar e ativar determinados avisos do compilador. voltil Agora pode ser aplicada a IntPtr palavra-chave volatile e UIntPtr. O compilador C# apresenta os seguintes adies e alteraes para esta verso: Opo /errorreport Pode ser usado para relatar erros de compilador interno Microsoft atravs da Internet. Opo /incremental Foi removido. e /keycontainer/KeyFile Opes Oferecer suporte especificao chaves criptogrficas. Opo /langversion Pode ser usado para especificar compatibilidade com uma verso especfica do idioma.

Visual C# Consolidado

23

Opo /linkresource Contm opes adicionais. Opo /moduleassemblyname Permite que voc se criar um.netmodule tipos de arquivo e acesso no-pblicos em um conjunto existente. Opo /PDB Especifica o nome e local do arquivo.pdb. Opo /Platform Permite que voc para arquiteturas Family (IPF) Itanium e x 64 de destino. Aviso # pragma Usado para desativar e ativar individuais avisos no cdigo.

Atualizando Aplicativos Visual C# para Visual Studio 2005


Quando voc abre um arquivo de projeto ou de soluo criado por uma verso anterior do Visual Studio, o Assistente para Atualizao guia voc atravs do processo de converter seu projeto para Visual Studio 2005. O Assistente para Atualizao executa vrias tarefas, entre elas: cria novas propriedades e atributos e exclui os obsoletos, mas como a verificao de erros tornou-se mais rgida, voc pode encontrar novos erros ou mensagens de aviso que no foram produzidos pela verso anterior do compilador. Assim, a etapa final na atualizao de um aplicativo existente fazer as alteraes de cdigo necessrias para resolver quaisquer novos erros. Freqentemente, um cdigo que produzia uma certa mensagem nas verses anteriores do compilador de C# produz uma mensagem diferente na verso atual. Normalmente, isso se deve ao fato de que uma mensagem geral foi substituda por uma mais especfica. Como nenhuma alterao no cdigo necessria, essas diferenas no foram documentadas. A seguir, esto as novas mensagens que o 'Assistente para Atualizao' gera devido verificao de erros mais rigorosa. Novas Mensagem de Erro e de Aviso

CS0121: Ambiguous call (Chamada ambgua)


Devido a uma converso implcita, o compilador no foi capaz de chamar uma implementao especfica de um mtodo sobrecarregado. Voc pode resolver este erro das seguintes formas:

Especificar os parmetros do mtodo de tal forma que a converso implcita no exista. Remover todos as outras implementaes do mtodo. Converter para um tipo apropriado antes de chamar o mtodo.

CS0122: Method inaccessible due to its protection level (Mtodo inacessvel devido ao seu nvel de proteo)
Voc poder receber este erro ao fazer referncia um tipo em um assembly compilado pelo C++ que foi compilado com a opo de compilador /d1PrivateNativeTypes. Este erro ocorre porque, na verso atual, um assembly C++ produz uma assinatura que usa um tipo que no est marcado como pblico. Voc pode contornar esse problema usando a opo /test:AllowBadRetTypeAccess do compilador. Esta opo ser removida quando este recurso foi corrigido.

CS0429: Unreachable expression code detected (Expresso de cdigo inatingvel detectada)

Visual C# Consolidado

24

Este erro ocorre sempre que parte de uma expresso em seu cdigo inatingvel. Por exemplo, a condio false && myTest() casa com esse critrio, pois o mtodo myTest() nunca ser executado j que o lado esquerdo da operao && sempre falso. Para corrigir isso, refaa o teste lgico para eliminar o cdigo inacessvel.

CS0441: A class cannot be both static and sealed (Uma classe no pode ser ao mesmo tempo esttica e lacrada)
Todas as classes estticas so tambm classes lacradas. A especificao de linguagem C# probe a especificao de ambos os modificadores em uma classe e o compilador agora relata isso como um erro. Para corrigir esse erro, remova sealed da classe.

CS1699: Warning on use of assembly signing attributes (Alerta no uso de atributos de assinatura de assembly)
Os atributos de assembly que especificam assinatura foram movidos do cdigo para opes do compilador. Usar os atributos AssemblyKeyFile ou AssemblyKeyName no cdigo produz este aviso. Em vez desses atributos, voc deve usar as opes de compilador a seguir:

Use a opo de compilador /keyfile (Especifica um Arquivo Chave de Nome Forte) (Opes do Compilador de C#) ao invs do atributo AssemblyKeyFile, e use /keycontainer (Especifica um Continer de Chave de Nome Forte) (Opes do Compilador de C#) ao invs de AssemblyKeyName.

No mudar para as opes de linha de comando no pode dificultar os diagnsticos do compilador quando friend assemblies estiverem sendo usados. Se voc estiver usando /warnaserror (Trata Aviso como Erros) (Opo do Compilador de C#), voc pode converter de volta para um aviso adicionando /warnaserror-:1699 a linha de comando do seu compilador. Se necessrio, voc pode desativar o aviso usando /nowarn:1699.

Incremental compilation removed (Compilao incremental removida)


A opo /incremental do compilador foi removida. O recurso de Edio e Continuao substitui essa funcionalidade.

Criando Seu Primeiro Aplicativo C#


Somente leva um minuto para criar um aplicativo C#. Siga estas etapas para criar um programa que abre uma janela e reage a um pressionamento de boto. Procedimentos

Para criar um aplicativo C#


1. 2. No menu File, aponte para New, e em seguida, clique em Project Verifique se o modelo Windows Application est selecionado, no campo Name, digite MyProject , e clique em OK. Voc ver um Windows Form no designer de Windows Forms. Essa a interface de usurio para seu aplicativo. 3. 4. 5. No menu View, clique em Toolbox para tornar a lista de controles visvel. Expanda a lista Common Controls, e arraste o controle Label para seu formulrio. Tambm da lista Common Controls, arraste um boto para o formulrio, prximo ao Label.

Visual C# Consolidado

25

6. 7. 8.

Clique duas vezes no novo boto para abrir o Editor de Cdigo. Visual C# inseriu um mtodo chamado button1_Click que executado quando o boto for clicado. Altere o mtodo para ter esta aparncia: private void button1_Click(object sender, EventArgs e) {label1.Text = "Hello, World!";} Pressione F5 para compilar e executar o aplicativo. Quando voc clicar no boto, exibida uma mensagem de texto. Parabns! Voc acabou de escrever seu primeiro aplicativo C#.

Usando Starter Kits C#


Um Starter Kit um aplicativo completo e independente pronto para voc carregar e compilar. Um Starter Kit vem com sua prpria documentao, incluindo descries de tcnicas de programao, e sugestes para como ele pode ser personalizado. Starter Kit uma maneira excelente de ver um aplicativo C# que funciona em ao. Para carregar e compilar um Starter Kit Visual C# 1. No menu File, clique em New Project. A caixa de dilogo New Project ser exibida. Esta caixa de dilogo lista os diferentes tipos de aplicativos padro que Visual C# pode criar. 2. 3. Selecione um tipo de aplicativo Starter Kit, e clique em OK. O Starter Kit carregado no Visual C#. Para compilar e iniciar o projeto Starter Kit, pressione F5.

Recursos de Ajuda Adicionais (Visual C#)


Os sites e grupos de notcias a seguir lhe ajudaro a encontrar respostas para problemas comuns e no to comuns. Recursos Microsoft Os sites a seguir so mantidos pela Microsoft e hospedam artigos e grupos de discusso sobre tpicos de interesse para os desenvolvedores C#.

Na Web
A Ajuda do Microsoft e Suporte Fornece acesso a artigos da KB, downloads e atualizaes, WebCasts de suporte e outros servios. O Microsoft Visual C# Developer Center Fornece exemplos de cdigo, informaes sobre atualizao, e contedo tcnico. Grupos de discusso MSDN Fornece uma maneira para conectar-se a uma comunidade de especialistas de todo o mundo.

Fruns
Forums tcnico da Microsoft Fruns discusso baseados na Web para muitas tecnologias Microsoft incluindo C# e o Framework .NET.

Grupos de notcias
microsoft.public.dotnet.languages.csharp Fornece um frum para perguntas e discusso geral sobre Visual C#.

Visual C# Consolidado

26

microsoft.public.vsnet.general Fornece um frum para perguntas e problemas no Visual Studio. microsoft.public.vsnet.IDE Fornece um frum para perguntas sobre como trabalhar no ambiente Visual Studio. microsoft.public.vsnet.documentation Fornece um frum para perguntas e problemas na documentao Visual C#. Recursos de terceiros O site do MSDN fornece informaes sobre sites de terceiros e grupos de notcias de atual interesse. Para a lista mais atual dos recursos disponveis, consulte o Site MSDN Community.

Como Fazer em C#
Como Fazer sua porta de entrada para tpicos-chave baseados em tarefas sobre programao e desenvolvimento de aplicativos em C#. As categorias essenciais sobre o que voc pode fazer com C# esto listadas neste tpico. Os links fornecem referncias para pginas de ajuda importantes baseadas em procedimento. A Linguagem C# Especificao da Linguagem C# ... Threading Genricos... Trechos de Cdigo Exemplos mais O Framework .NET Entrada e Sada em Arquivos Strings Colees Serializao Componentes Mdulos (assemblies) e Domnios de Aplicativo mais Aplicativos do Windows Criando Aplicativos do Windows ControlesWindows Forms Desenhando mais Pginas Web e Web Services Pages Web do ASP.NET XML Web Services mais Depurao Usando o Depurador VS Classe Trace .Framework NET Depurao de Transaes SQL mais Accesso a Dados Conectando a Fontes de Dados O SQL Server... Vinculao de Dados mais Criando Classes Class Designer... Trabalhando com Classes e Outros Tipos... Criando e Modificando Membros-tipo... Linhas-mestras para a Criao de Bibliotecas de Classes mais Segurana Segurana no Acesso ao Cdigo Prticas Recomendadas de Poltica de Segurana Conjuntos de Permisses mais Programao do Office Programao do Office Controles Word Excel mais Dispositivos Inteligentes O que h de novo em Projetos para Dispositivos Inteligentes... Programao para Dispositivos Inteligentes... Depurao em Dispositivos Inteligentes... mais Implantao

Visual C# Consolidado

27

ClickOnce O Windows Installer Recursos adicionais Os seguintes sites requerem uma conexo com a Internet. Visual Studio 2005 Developer Center Contm vrios artigos e recursos sobre o desenvolvimento de aplicativos usando o Visual Studio 2005. Este site atualizado regularmente com novo contedo. Visual C# Developer Center Contm vrios artigos e recursos sobre desenvolvimento de aplicativos C#. Este site atualizado regularmente com novo contedo. Microsoft .NET Framework Developer Center Contm vrios artigos e recursos em desenvolvimento e depurao de aplicativos do Framework .NET. Este site atualizado regularmente com novo contedo.

Visual C# Consolidado

28

USANDO O IDE DO VISUAL C#


Esta seo lhe apresenta ao ambiente de desenvolvimento integrado (IDE) do Visual C# e descreve como ele usado em todas as fases do ciclo de desenvolvimento, indo desde como configurar um projeto at distribuir o aplicativo concludo para usurios finais.

Introduo IDE (Visual C#)


O ambiente de desenvolvimento integrado (IDE) do Visual C# uma coleo de ferramentas de desenvolvimento expostas por meio de uma interface de usurio comum. Algumas das ferramentas so compartilhados com outras linguagens do Visual Studio, e algumas, como o compilador C#, so exclusivas para Visual C#. A documentao nesta seo fornece uma viso geral de como usar as ferramentas mais importantes do Visual C# enquanto voc trabalha na IDE em vrias fases do processo de desenvolvimento. Observao Se voc estiver desenvolvendo um aplicativo ASP.NET 2.0, voc ir usar a IDE Visual Web Developer, que uma parte totalmente integrada do Visual Studio 2005. Entretanto, se suas pginas code-behind estiverem em Visual C#, voc estar utilizando o Editor de Cdigos do Visual C# dentro do Visual Web Developer. Portanto, alguns tpicos nesta seo, como Projetando uma interface de usurio (Visual C#), talvez no sejam completamente aplicveis a aplicativos da Web. Ferramentas Visual C# A seguir esto as mais importantes ferramentas e janelas no Visual C#. As janelas para a maioria dessas ferramentas podem ser abertas a partir do menu View.

O Editor de Cdigos, para escrever cdigo fonte. O compilador C#, para converter cdigo fonte C# em um programa executvel. O depurador do Visual Studio, para testar seu programa. O Toolbox (Caixa de Ferramentas) e o Designer, para o desenvolvimento rpido de interfaces de usurio usando o mouse. Solution Explorer (Gerenciador de Solues) para exibir e gerenciar arquivos de projeto e configuraes. Designer de Projeto, para configurar opes do compilador, caminhos de implantao, recursos, e mais. Modo de Exibio de Classe, para navegar atravs de cdigo fonte de acordo com tipos, no arquivos. Janela Properties (Janela de Propriedades), para configurar propriedades e eventos nos controles na sua interface de usurio. Pesquisador de objetos para exibir os mtodos e as classes disponveis em bibliotecas de vnculo dinmico incluindo assemblies do .NET Framework e objetos COM. Gerenciador de Documento, para navegao e pesquisa de documentao do produto em sua mquina local e na Internet.

Como a IDE expe as ferramentas Voc interage com as ferramentas atravs de janelas, menus, pginas de propriedades, e assistentes na IDE. A IDE bsica tem mais ou menos esta aparncia:

Visual C# Consolidado

29

Rapidamente voc pode acessar qualquer janela de ferramenta aberta ou arquivos, pressionando CTRL + TAB. Para mais informaes, consulte Navegando e procurando (Visual C#).

Janelas do Editor e do Windows Form Designer


A janela principal usada pelo Editor de Cdigos e pelo Windows Forms Designer. Voc pode alternar entre o modo Cdigo e o modo Design pelo pressionamento da tecla F7, ou clicando em Code ou Designer no menu View. Enquanto estiver no modo Design, voc pode arrastar controles da Caixa de Ferramentas para a janela , que voc poder tornar visvel clicando na guia Toolbox na margem esquerda. Para obter mais informaes sobre o Editor de Cdigos, consulte Editando Cdigo (Visual C#). Para obter mais informaes sobre o Windows Forms Designer, consulte O Windows Forms Designer. A janela Properties no canto inferior direito povoada somente no modo Design. Ela permite a voc definir propriedades e ligar eventos a controles de interface de usurio como botes, caixas de texto, e assim por diante. Quando voc define esta janela como Ocultar Automaticamente, ela ser colapsada na margem direita sempre que voc alternar para o Modo Cdigo. Para obter mais informaes sobre a janela Properties e o Designer, consulte Projetando uma interface de usurio (Visual C#).

Gerenciador de Solues e Designer de Projeto


A janela na parte superior direita a do Gerenciador de Solues, que mostra todos os arquivos em seu projeto em um modo de exibio de rvore hierrquica. Quando voc usa o menu Project para adicionar novos arquivos ao seu projeto, voc os ver refletidos no Gerenciador de Solues. Alm dos arquivos, o Gerenciador de Solues tambm exibe as configuraes do projeto, e referncias a bibliotecas externas exigidas pelo seu aplicativo. As pginas de propriedades do Designer de Projeto so acessadas com o boto direito do mouse no n Properties no Gerenciador de Solues, e clicando Open. Use essas pginas para modificar opes de compilao, requisitos de segurana, detalhes de implantao, e muitas outras propriedades do projeto. Para obter mais informaes sobre o Gerenciador de Solues e o Designer de Projeto, consulte Criando um Projeto (Visual C#).

Janela do Compilador, do Depurador, e de Lista de Erros


O compilador C# no tem nenhuma janela porque ele no uma ferramenta interativa, mas voc pode definir opes do compilador no Designer de Projeto. Quando voc clica em Build no menu Build , o compilador C# chamado pela IDE. Se a compilao for bem sucedida, o painel de status exibe uma mensagem compilao bem sucedida. Se houver erros de compilao, a janela Error List aparece abaixo da janela Editor/Designer com uma lista de erros. D um duplo clique em um erro para ir para a linha com problema no seu cdigo fonte. Pressione F1 para consultar a documentao de Ajuda para o erro realado. O Depurador tem vrias janelas que exibem valores de variveis e informaes de tipo quando o seu aplicativo est sendo executado. Voc pode usar a janela do Editor de Cdigos durante a depurao para especificar uma linha na qual pausar a execuo, e depurar o cdigo linha a linha. Para mais informaes, consulte Criando e Depurando (Visual C#).

Visual C# Consolidado

30

Personalizando a IDE Toda janela no Visual C# pode ser feita ancorvel ou flutuante, oculta ou visvel, ou pode ser movida para novos locais. Para alterar o comportamento de uma janela, clique nos cones da seta para baixo ou push-pin na barra de ttulo e selecione dentre as opes disponveis. Para mover uma janela ancorada para um novo local ancorado, arraste a barra de ttulo at que os cones de conta-gotas da janela apaream. Mantendo pressionado o boto esquerdo do mouse, mova o ponteiro do mouse sobre o cone no novo local. Posicione o ponteiro sobre os cones esquerda, direita, superior ou inferior para encaixar a janela no lado especificado. Posicione o ponteiro sobre o cone meio para tornar a janela uma janela com guias. Como voc posiciona o ponteiro, um retngulo azul semi-transparente aparece, o qual indica onde a janela ser ancorada no novo local.

Voc pode personalizar muitos outros aspectos da IDE clicando em Options no menu Tools. Para mais informaes, consulte Opes de Caixa de Dilogo do Visual Studio.

Criando um Projeto (Visual C#)


Quando voc estiver pronto para iniciar a codificao, a primeira etapa configurar um projeto. O projeto contm todos os materiais processados para seu aplicativo, incluindo no apenas arquivos de cdigo fonte, mas tambm arquivos de recursos como cones, referncias a arquivos externos que seu programa depende, e dados de configurao como configuraes do compilador. Quando voc cria um projeto, Visual C# chama o compilador C# e outras ferramentas internas para criar um conjunto executvel usando os arquivos em seu projeto. Criando um novo projeto Voc cria um novo projeto, clicando no menu File, apontando para New, e clicando em Project. Observao Se voc selecionar Web Site em vez de Project, a IDE (ambiente de desenvolvimento integrado) Visual Web Developer abre. Este um ambiente separado e distinto dentro do Visual Studio para criar aplicativos ASP.NET. A IDE Visual Web Developer usa o editor de cdigo do Visual C# para edio de arquivos code-behind no C#. Se voc estiver criando aplicativos da Web, voc deve usar a documentao do Visual Web Developer principalmente, mas consulte Editando cdigo (Visual C#) para obter informaes sobre o editor C#. A ilustrao a seguir mostra a caixa de dilogo New Project. Voc pode ver que Visual C# est selecionado por padro na janela em esquerda, e direita, voc tem a opo de seis ou mais modelos de projeto para escolher. Se voc expandir o Smart Device ou o n Other Project Types esquerda, voc pode ver que diferentes tipos de projeto aparecem no lado direito.

Visual C# Consolidado

31

Starter Kits so outros tipos de modelo de projeto. Se voc instalar um Starter Kit, voc o ver listado na caixa de dilogo New Project. Para mais informaes, consulte Starter Kits. Depois que voc selecionar um modelo de projeto e clicar OK, Visual Studio cria o projeto e voc est pronto para comear a codificao. Arquivos de projeto, referncias, configuraes, e recursos esto visveis na janela Solution Explorer (Gerenciador de Solues) direita.

Visual C# Consolidado

32

O que h em seu projeto?

Propriedades
O n Properties representa definies de configurao que se aplicam a seu projeto inteiro e so armazenados no arquivo .csproj na sua pasta soluo. Essas configuraes incluem opes de compilao, segurana, configuraes de implantao e muito mais. Voc faz modificaes em seu projeto usando o Designer de Projeto, que um conjunto de Pginas de Propriedades que voc acessa clicando com o boto direito do mouse em Properties, e selecionando Open. Para mais informaes, consulte Modificando propriedades de projeto (Visual C#).

Referncias
No contexto de um projeto, uma referncia simplesmente identifica um arquivo binrio que seu aplicativo requer para executar. Normalmente, uma referncia identifica um arquivo DLL como um dos arquivos de biblioteca de classe do .NET Framework. Ele tambm pode fazer referncia um assembly .NET (chamado de um shim) que permite seu aplicativo chamar mtodos em um objeto COM ou DLL Win32 nativa. Se seu programa cria uma instncia de uma classe que est definida em algum outro assembly, voc deve adicionar uma referncia a esse arquivo em seu projeto antes de voc compilar o projeto. Para adicionar uma referncia, clique em Add Reference no menu Project. Todos os projetos C# por padro incluem uma referncia mscorlib.dll, que contm as classes principais do .NET Framework. Voc pode adicionar referncias a DLLs adicionais do .NET Framework e outros arquivos, clicando no menu Project, e selecionando Add Reference. Observao No confunda o conceito de uma referncia de projeto com o conceito de tipos referncia em C# ou outras linguagens de programao. O primeiro refere-se a um arquivo e seu local esperado no disco. O ltimo refere-se a tipos C#, que so declarados usando a palavra-chave class.

Recursos
Um recurso um dado que est includo no seu aplicativo mas pode ser armazenado de tal forma que pode ser modificado independentemente de outro cdigo fonte. Por exemplo, voc pode armazenar todas as suas seqncias como recursos em vez de embut-las no cdigo fonte. Voc pode converter as seqncias em diferentes idiomas mais adiante, e adicion-las pasta do aplicativo que voc entrega a clientes sem precisar recompilar seu assembly. Os cinco tipos de recursos definidos pelo Visual C# so: seqncias, imagens, cones, udio, e arquivos. Voc adiciona, remove ou edita recursos usando o Designer de Recursos, que acessado na guia Resources no Designer de Projeto.

Formulrios
Quando voc cria um projeto Windows Forms, o Visual C# adiciona um formulrio no projeto por padro e chama-o Form1. Os dois arquivos que representam o formulrio so chamados Form1.cs e Form1.designer.cs. Voc escreve seu cdigo no Form1.cs; o arquivo designer.cs onde o Windows Forms Designer escreve o cdigo que implementa todas as aes que voc realizou arrastando e soltando controles da Caixa de Ferramentas. Voc pode adicionar um novo formulrio, clicando no item de menu Project, e selecionando Add Windows Form. Cada formulrio tem dois arquivos associados a ele. Form1.cs, ou qualquer outro nome que voc d, contm o cdigo fonte que voc escreveu para configurar o formulrio e seus controles, como caixas de listagem e caixas de texto, e responde a eventos como clique de boto e pressionamento de tecla. Em projetos simples do Windows Forms, voc faz a maioria ou toda a sua codificao nesse arquivo. O arquivo Designer.cs contm o cdigo fonte que o Forms Designer escreve quando voc arrasta controles para o formulrio, define propriedades na janela Properties, e assim por diante. Normalmente, voc no deve editar esse arquivo manualmente.

Visual C# Consolidado

33

Observao Obviamente, se voc criar um projeto de aplicativos de console, ele no conter arquivos cdigo fonte para Windows Forms.

Outros arquivos de cdigo fonte


Um projeto pode incluir qualquer nmero de arquivos .cs adicionais que pode ou no estar associado a um Windows Form especfico. Na ilustrao anterior do Gerenciador de Solues, program.cs contm o ponto de entrada para o aplicativo. Um nico arquivo .cs pode conter qualquer nmero de definies de classe e estrutura. Voc pode adicionar arquivos novos ou existentes ou classes no seu projeto, clicando em Add New Item ou Add Existing Item no menu Project.

Projetando uma interface de usurio (Visual C#)


No Visual C#, a maneira mais rpida e conveniente de criar sua interface de usurio (UI) faz-la visualmente, usando o Windows Forms Designer e o Toolbox. H trs etapas bsicas para criar todas as interfaces de usurio:

Adicionar controles a superfcie de criao. Definir propriedades iniciais para os controles. Escrever manipuladores para eventos especificos.

Embora voc tambm possa criar sua UI escrevendo seu prprio cdigo, designers permitem que voc realize este trabalho muito mais rapidamente que na codificao manual. Observao Voc pode usar Visual C# para criar aplicativos de console que possuem uma interface simplesmente baseada em texto. Para mais informaes, consulte Criando aplicativos de console (Visual C#). Adicionando controles No designer, voc usa o mouse para arrastar, por Exemplo botes e caixas de texto, para uma superfcie de projeto que representa o formulrio. A ilustrao a seguir mostra uma caixa de combinao que foi arrastado da janela Toolbox para um formulrio no Windows Forms Designer.

Visual C# Consolidado

34

Enquanto voc trabalha visualmente, o designer converte suas aes em cdigo fonte C# e os grava em um arquivo de projeto chamado <nome>designer.cs onde <nome> o nome que voc deu para o formulrio. Quando seu aplicativo executado, esse cdigo fonte ir posicionar e dimensionar os elementos de UI para que elas apaream da mesma maneira que na superfcie de projeto. Para mais informaes, consulte O Windows Forms Designer. Definindo propriedades Aps voc adicionar um controle ao seu formulrio, voc pode usar a janela Properties para definir suas propriedades, como cor do plano de fundo e texto padro. Os valores que voc especificar na janela Properties so simplesmente os valores iniciais que sero atribudos a essa propriedade quando o controle criado em tempo de execuo. Em muitos casos, esses valores podem ser acessados ou alterados programaticamente em tempo de execuo simplesmente obtendo ou definindo a propriedade na instncia da classe de controle em seu aplicativo. A janela Properties til em tempo de criao porque ela permite que voc procure por todas as propriedades, eventos e mtodos suportados por um controle. Para mais informaes, consulte Janela Properties. Tratamento de eventos Programas com interfaces de usurio grficas so principalmente direcionadas a eventos. Elas aguardam at que um usurio faa algo como inserir texto em uma caixa de texto, clicar em um boto, ou alterar uma seleo em uma caixa de listagem. Quando isso acontece, o controle, que apenas uma instncia de uma classe do .NET Framework, envia um evento para seu aplicativo. Voc pode optar por manipular um evento escrevendo um mtodo especial em seu aplicativo que ser chamado quando o evento recebido. Voc pode usar a janela Properties para especificar que eventos deseja tratar em seu cdigo; selecione um controle no designer e clique no boto Events, com o cone de um raio, na barra de ferramentas da janela Properties para ver os seus eventos. O diagrama a seguir mostra o boto de eventos. Quando voc adiciona um manipulador de eventos atravs da janela Properties, o designer automaticamente escrever para voc o corpo do mtodo como vazio, e fica por sua conta

Visual C# Consolidado

35

escrever o cdigo para que o mtodo faa algo til. A maioria dos controles geram um nmero grande de eventos, mas na maioria dos casos, um aplicativo somente precisar manipular alguns deles, ou mesmo somente um. Por exemplo, voc provavelmente precisa manipular um evento de Click de boto, mas no necessrio manipular seu evento Paint a menos que voc deseje personalizar a aparncia de alguma maneira avanada. Prximas Etapas Para obter mais informaes sobre interfaces de usurio do Windows Forms, consulte os seguintes tpicos:

Criando aplicativos baseados no Windows Passo a passo: Criando um formulrio do Windows simples Elementos de interface de usurio do Windows Forms Designer

Na biblioteca de classe do. NET Framework, System.Windows.Forms e namespaces relacionados contm as classes usadas no desenvolvimento do Windows Forms.

Editando Cdigo
Este um contedo traduzido automaticamente que os membros da comunidade podem editar. Como tal, a Microsoft no pode garantir a exatido ou fidelidade em relaao ao contedo original. Voc pode melhor-lo usando os controles direita. guest : fazer logon minhas configuraes faq | sugerir alteraes Ambiente de desenvolvimento do Visual C# Editando cdigo (Visual C#) O Editor de cdigos do Visual C# um processador de texto para escrever cdigo fonte. Assim como o Microsoft Word fornece suporte abrangente para frases, pargrafos, e gramtica, o editor de cdigos C# faz o mesmo para sintaxe C# e para o .NET Framework. Este suporte pode ser agrupado em cinco categorias principais:

O IntelliSense: Documentao continuamente atualizada sobre as classes .NET Framework e os mtodos bsicos medida que voc digita no editor, e a gerao de cdigo automtica. Refactoring: reestruturao inteligente de sua base de cdigo medida que ela evolui durante o perodo de um projeto de desenvolvimento. Trechos de cdigo: Voc pode procurar uma biblioteca que contm padres de cdigo repetidos freqentemente. Sublinhado ondulado: Notificaes visuais de palavras incorretas, erro de sintaxe e situaes de aviso conforme voc digita. Auxlios de legibilidade: Estrutura de tpicos e colorizao.

O IntelliSense
IntelliSense o nome de um conjunto de recursos relacionados que so criados para minimizar o tempo gasto procurando por ajuda e para ajudar voc a inserir cdigo de forma mais precisa e eficiente. Todos esses recursos fornecem informaes sobre palavras-chave de linguagem, tipos .NET Framework e assinaturas de mtodo medida que voc digita no editor. As informaes so exibidas em dicas de ferramentas, caixas de listagem, e marcas inteligentes. Visual C# Consolidado 36

Observao Muitos dos recursos do IntelliSense so compartilhados com outras linguagens do Visual Studio e esto documentadas com ilustraes no n Ajuda de Codificao da biblioteca do MSDN. As sees a seguir fornecem uma viso geral sobre o IntelliSense, com links para a documentao mais completa.

Listas de concluso
Quando voc insere cdigo-fonte no editor, o IntelliSense exibe uma caixa de listagem que contm todas as palavras-chave C# e classes .NET Framework. Se ele encontrar uma correspondncia na caixa de listagem para o nome que voc est digitando, ele seleciona o item. Se o item selecionado for o que voc deseja, simplesmente voc pode teclar TAB e o IntelliSense terminar a digitao do nome ou palavra-chave para voc. Para mais informaes, consulte Listas de concluso no C#.

Informaes rpidas
Quando voc passa o cursor sobre um tipo .NET Framework, o IntelliSense exibir um Quick Info ToolTip que contm a documentao sobre esse tipo bsico. Para mais informaes, consulte Informaes rpidas.

Membros da lista
Quando voc inserir um tipo .NET Framework no Editor de Cdigos, e ento digitar o operador ponto ( . ), o IntelliSense exibe uma caixa de listagem que contm os membros do mesmo tipo. Quando voc fizer uma seleo e pressionar TAB, o IntelliSense insere o nome membro. Para mais informaes, consulte Membros da lista.

Informaes de parmetro
Quando voc inserir um nome do mtodo no Editor de cdigos, e digitar um parnteses de abertura, o IntelliSense exibir um parmetro Info ToolTip que mostra a ordem e tipos de parmetros do mtodo. Se o mtodo estiver sobrecarregado, voc pode rolar para baixo atravs de todas as assinaturas sobrecarregadas. Para mais informaes, consulte Informaes de parmetro. Visual C# Consolidado 37

Adicionando diretivas 'using'


s vezes, voc pode tentar criar uma instncia de uma classe .NET Framework sem um nome suficientemente qualificado. Quando isso acontece, o IntelliSense exibe uma marca inteligente aps o identificador no resolvido. Quando voc clicar a marca inteligente, o IntelliSense exibir uma lista de diretivas using que permitir que o identificador seja resolvido. Quando voc seleciona um da lista, o IntelliSense adiciona a diretiva para a parte superior de seu arquivo de cdigo fonte e voc pode continuar a codificao em sua localidade atual. Para mais informaes, consulte Adicionar diretivas 'using'.

Refatorao
Como uma base de cdigo cresce e evolui durante o perodo de um projeto de desenvolvimento, s vezes desejvel fazer alteraes para torn-lo mais legvel para humanos ou mais portvel. Por exemplo, convm dividir alguns mtodos de backup em mtodos menores ou alterar parmetros do mtodo, ou renomear identificadores. O recurso Refactoring, que acessvel clicando no Editor de cdigos, faz tudo isso de uma maneira que muito mais conveniente, inteligente, e completa que as ferramentas tradicionais como pesquisa e substituio. Para mais informaes, consulte Refatorao.

Trechos de cdigo
Trechos de cdigo so unidades de uso comum em cdigo fonte C# que voc pode inserir rapidamente com preciso e com o pressionamentos de apenas algumas teclas. O menu trecho de cdigo acessado clicando no Editor de Cdigos. Voc pode navegar entre os muitos trechos fornecidos com o Visual C#, e voc tambm pode criar seus prprios trechos. Para mais informaes, consulte Trechos de cdigo (C#).

Sublinhado ondulado
Sublinhado ondulado fornece comentrios instantneos sobre erros em seu cdigo enquanto voc digita. Um sublinhado ondulado vermelho identifica um erro de sintaxe como ponto-e-vrgula ausente ou chaves no correspondentes. Um sublinhado ondulado verde identifica um aviso de compilao em potencial, e azul identifica um problema Editar e Continuar. A ilustrao a seguir mostra um sublinhado ondulado vermelho:

Visual C# Consolidado

38

Ajuda de Legibilidade
Estrutura de tpicos
Automaticamente o Editor de Cdigos trata namespaces, classes e mtodos como regies que voc pode recolher para facilitar a localizao e leitura de outras partes do arquivo de cdigo fonte. Voc tambm pode criar suas prprias regies recolhveis, envolvendo o cdigo com as diretivas #region e #endregion

Colorizao
O editor oferece diferentes cores a vrias categorias de identificadores em um arquivo de cdigo fonte C#. Para mais informaes, consulte Colorizao de Cdigo .

Visual C# Consolidado

39

NAVEGANDO E PROCURANDO
O Visual C# fornece as seguintes ferramentas para ajud-lo a navegar e pesquisar o cdigo fonte, arquivos de projeto e janelas abertas.

Exibio de classe Barras de navegao Navegao CTRL+TAB Localizao em arquivos

Exibio de classe
A janela Class View fornece uma exibio do seu projeto com base nas classes em vez de usar arquivos, como no Solution Explorer. Voc pode usar a Class View para navegar rapidamente para qualquer classe ou membro da classe em seu projeto. Para acessas a Class View, clique em Class View no menu View.

Navegao CTRL+TAB
A qualquer momento voc pode ter vrias janelas ativas em um projeto no Visual C#. Para navegar rapidamente para uma janela, pressione CTRL+TAB para exibir uma janela que lista todas as ferramentas ativas e janelas do cdigo fonte. Mova as teclas de seta mantendo pressionada a tecla CTRL para selecionar a janela a exibir.

Visual C# Consolidado

40

Barras de navegao
Na parte superior de cada janela de cdigo do editor est a barra de navegao, que consiste em duas caixas de listagem. A da esquerda lista todas as classes definidas no arquivo atual, e a da direita lista todos os membros para a classe que est selecionado na caixa da lista esquerda. Voc pode ir diretamente para um mtodo selecionando-o na caixa de listagem da direita.

Visual C# Consolidado

41

Localizar em arquivos
Pressionando CTRL+SHIFT+F voc pode abrir a caixa de dilogo Find in Files para executar pesquisa e substituir operaes em um projeto inteiro. Observao Para renomear mtodos ou tipos, ou alterar os parmetros do mtodo, use o recurso Refactoring, que mais completo e inteligente do que pesquisar e substituir. Para mais informaes, consulte Refactorao.

Visual C# Consolidado

42

CRIANDO E DEPURANDO (VISUAL C#)


No Visual C# voc criar um aplicativo executvel clicando em Build no menu Build (ou pressionando CTRL+SHIFT+B). Voc pode criar e iniciar o aplicativo em uma operao pressionando F5 ou clicando em Run no menu Debug. O desenvolvimento implica a introduo dos seus arquivos de projeto no compilador C#, que converte seu cdigo fonte no Microsoft Intermediate Language (MSIL) e depois associa o MSIL com os metadados, recursos, manifesto e outros mdulos, se houver algum, para criar um assembly. Um assembly um arquivo executvel que normalmente tem uma extenso .exe ou.dll. medida que voc desenvolve seu aplicativo, voc pode criar uma verso de depurao para test-lo e ver como ele executa. Finalmente, quando tudo est correto, voc criar um verso de lanamento para implantar aos clientes. Para obter mais informaes sobre assemblies, consulte Viso Geral Sobre assemblies. Criar configuraes Para especificar vrias configuraes de criao, clique com o boto direito do mouse no item de projeto no Solution Explorer e selecione o painel Build no Project Designer. Para obter mais informaes, consulte Introduo ao Project Designer e Opes de Compilao C#. O Visual Studio usa a ferramenta MSBuild para criar assemblies. O MSBuild tambm pode ser executado a partir da linha de comando e pode ser personalizado de vrias maneiras. Para mais informaes, consulte MSBuild. Construir erros Se no h erros na sintaxe C#, ou identificadores que no podem ser resolvidos em um tipo conhecido ou membro, ento a compilao no ter xito e voc ver uma lista de erros em que aparece, por padro, diretamente abaixo do editor de cdigo. Voc pode dar um clique duplo com o mouse na mensagem de erro para ir para a linha do seu cdigo onde ocorreu o erro.

Visual C# Consolidado

43

As mensagens de erro do compilador C# so geralmente muito claras e descritivas, mas se voc no puder descobrir o problema, voc pode ir para a pgina de Ajuda da mensagem, pressionando F1 com a mensagem de erro selecionada na lista de erro. A pgina de Ajuda contm informaes adicionais teis. Se voc ainda no puder resolver o problema, ento, a prxima etapa fazer sua pergunta em um dos grupos de notcias ou fruns do C#. Para acessar o fruns, clique em Ask A Question no menu Community. Observao Se voc encontrar uma pgina de ajuda de erro de compilao que no foi til para o seu erro especfico, voc pode ajudar a Microsoft melhorar a documentao, enviando uma descrio do problema. Para enviar o email, clique no link na parte inferior da pgina de Ajuda que contm o erro.

Configuraes Verso vs. Depurao


Enquanto voc estiver trabalhando ativamente em seu projeto, voc geralmente criar seu aplicativo usando a configurao de depurao, porque essa configurao permite que voc exiba o valor de variveis e controle a execuo no depurador. Voc tambm pode criar e testar compilaes na verso de configurao para garantir que no introduziu quaisquer erros que somente s se manifestam em um tipo de compilao ou outro. Na programao do .NET Framework, esses erros so muito raros, mas eles pode acontecer. Quando voc estiver pronto para distribuir seu aplicativo para usurios finais, crie uma verso de compilao, que ser muito menor em tamanho e geralmente no ter melhor desempenho que a correspondente configurao de depurao. Voc pode definir a configurao de compilao no painel Build do Project Designer, ou na barra de ferramentas Build. Para mais informaes, consulte Compilar configuraes. Depurao A qualquer momento que voc estiver trabalhando no editor de cdigo, voc pode definir um ponto de interrupo (breakpoint) em uma linha de cdigo, pressionando F9. Quando voc pressionar F5 para executar seu aplicativo no depurador do Visual Studio, o aplicativo ir parar naquela linha e voc poder examinar o valor de qualquer varivel, ou observar como ou quando a execuo se liberta de um loop, passar pelo cdigo linha a linha pressionando F10, ou configurar pontos de parada adicionais.

Voc tambm pode definir pontos de interrupo condicionais (tracepoints), que s iro parar a execuo se uma condio especificada for satisfeita. Tracepoints so semelhantes aos pontos de

Visual C# Consolidado

44

interrupo exceto que eles no param a execuo, mas simplesmente gravam o valor da varivel especificada para a janela de sada. Para mais informaes, consulte Pontos de interrupo e Tracepoints. Quando a execuo interrompida em um ponto de interrupo, voc pode focalizar sobre qualquer varivel no escopo para exibir informaes sobre essa varivel. A ilustrao a seguir mostra uma dica de dados no depurador:

Voc pode depurar seu cdigo uma linha por vez pressionando F10 aps o depurador ser interrompido em um ponto de interrupo. Voc pode at corrigir determinados tipos de erros em seu cdigo, e continuar a depurao sem precisar parar e recompilar o aplicativo O depurador do Visual Studio uma ferramenta poderosa e vlido levar um tempo para ler a documentao para compreender diferentes conceitos como Edit e Continue, Exibir Dados no Depurador, Depurao Just-In-Time e Visualizadores.

Visual C# Consolidado

45

MODELAGEM E ANLISE DE CDIGO (VISUAL C#)


No incomum para desenvolvedores de software trabalhar com cdigo fonte cuja arquitetura bsica desconhecida, pois ele foi escrito por outra pessoa, ou porque ele foi escrito h tanto tempo que seus criadores originais no mais recordam como ele funciona. Outro cenrio comum a necessidade de entender o contedo de uma biblioteca que s est disponvel no formato binrio. Visual C# fornece as seguintes ferramentas para ajudar voc a modelar, analisar e compreender tipos e relacionamentos de tipos em cdigo fonte como tambm em mdulos binrios (assemblies):

Classe Designer, para representar visualmente relacionamentos de herana e associao entre tipos. Pesquisador de Objetos, para examinar os tipos, mtodos e eventos exportados pelos assemblies do .NET Framework, e DLLs nativas incluindo os objetos COM. Metadados como fonte, para exibir informaes de tipo em mdulos (assemblies) gerenciados como se fosse cdigo fonte em seu prprio projeto.

Alm das ferramentas listadas acima, Visual Studio Team System inclui a ferramenta Anlise de Cdigo para Cdigo Gerenciado que inspeciona seu cdigo para uma variedade de problemas potenciais. Classe Designer A classe Designer uma ferramenta grfica para modelagem visual da relao entre tipos em um aplicativo de software ou componente; voc tambm pode us-la para criar novos tipos e refazer ou excluir tipos existentes. A ilustrao a seguir mostra a criao de uma classe simples:

Visual C# Consolidado

46

Para adicionar um diagrama de classe a um projeto, clique em Add New Item no menu Project , e em seguida, clique em Add Class Diagram. Para mais informaes, consulte Projetando e exibindo classes e tipos. Pesquisador de Objetos O Pesquisador de Objetos permite que voc veja informaes de tipo em DLLs nativas e gerenciadas, incluindo objetos COM. Embora as informaes que voc v no Pesquisador de Objetos sejam semelhantes as que voc v no Class View, voc pode usar o Pesquisador de Objetos para examinar qualquer DLL em seu sistema, no apenas aquelas referenciadas no seu prprio projeto. Alm disso, o Pesquisador de Objetos tambm exibe comentrios da documentao XML para o tipo selecionado. A ilustrao a seguir mostra como o Pesquisador de Objetos exibe informaes de tipo em arquivos binrios.

Para mais informaes, consulte Pesquisador de Objetos Os metadados como fonte: O recurso Metadata As Source (Metadados como fonte) permite que voc veja informaes de tipo das classes em mdulos (assemblies) gerenciados como se eles fossem cdigo fonte em seu prprio projeto. Essa uma maneira conveniente para exibir as assinaturas para todos os mtodos pblicos em uma classe quando voc no tem acesso ao cdigo fonte real. Por exemplo, se voc inserir a instruo System.Console.WriteLine() no editor de cdigo, coloque o ponto de insero no Console e clique com o boto direito do mouse e selecione Go To Definition, voc ver algo parecido com um arquivo de cdigo fonte que contm a declarao da classe Console. Essa declarao construda a partir dos metadados no assembly usando Reflexo, e embora no exponha a implementao de todos os mtodos, mostra comentrios da documentao XML que esto presentes. Voc tambm pode usar o recurso Metadata As Source, selecionando um tipo gerenciado no Pesquisador de Objetos, e clicando em Code Definition Window no menu View.

Visual C# Consolidado

47

Para obter mais informaes e uma ilustrao, consulte Os metadados como fonte: Anlise de cdigo para cdigo gerenciado A ferramenta de anlise de cdigo para cdigo gerenciado analisa informaes de assemblies gerenciados e relatrios assim como possveis problemas de segurana, e violaes de regras de programao e projeto definidas nas diretrizes de projeto do Microsoft .NET Framework. Essas informaes so apresentadas como avisos. Voc acessa a ferramenta no Designer de Projeto clicando com o boto direito do mouse em Properties no Solution Explorer, e selecionando Open.

Visual C# Consolidado

48

ADICIONANDO E EDITANDO RECURSOS (VISUAL C#)


Aplicativos do Visual C# geralmente incluem dados que no esto no cdigo fonte. Esses dados so conhecidos como um project resource (recurso de projeto) e ele pode incluir dados binrios, arquivos de texto, arquivos de udio ou vdeo, tabelas de seqncia de caracteres, cones, imagens, arquivos XML ou qualquer outro tipo de dados que seu aplicativo requer. Dados de recurso de projetos so armazenados em formato XML no arquivo resx. (chamado Resources.resx por padro) que pode ser aberta no Solution Explorer. Para obter mais informaes sobre os recursos de projeto, consulte Trabalhando com Arquivos de Recursos. Adicionando Recursos a Projetos Voc pode adicionar recursos a um projeto clicando em Add Existing Item no menu Project, ou clicando no boto Add Resource na pgina Resources no Project Designer. Voc pode adicionar recursos ao seu projeto como recursos vinculados, que so arquivos externos, ou como recursos incorporados, que so incorporados diretamente ao arquivo .resx.

Quando voc adiciona um recurso vinculado, o arquivo resx. que armazena suas informaes de recurso de projeto inclui apenas um caminho relativo para o arquivo de recurso no disco. Se voc adicionar imagens, vdeos ou outros arquivos complexos como recursos vinculados, voc pode edit-los usando um editor padro no qual voc associa a esse tipo de arquivo no Resource Designer. Quando voc adiciona um recurso incorporado, os dados so armazenados diretamente no arquivo de recurso (.resx) do projeto. Somente seqncias de caracteres podem ser armazenadas como recursos incorporados.

Editando Recursos O Resource Designer permite que voc adicione e modifique recursos de projeto durante o desenvolvimento ao associar um aplicativo padro para editar cada recurso. Voc acessa o Resource Designer clicando com o boto direito do mouse em Properties no Solution Explorer, clicando em Open e clicando na guia Resources em Project Designer. Para mais informaes, consulte Pginas de Recursos, Project Designer. A ilustrao a seguir mostra as opes de menu Resource Designer:

Para editar recursos incorporados, voc deve trabalhar diretamente no arquivo .resx para manipular os caracteres individuais ou bytes. Isto porque ele mais conveniente para armazenar tipos de arquivos complexos como recursos vinculados durante o desenvolvimento. Voc pode usar o Binary Editor para editar arquivos de recursos, incluindo o arquivo .resx, no nvel binrio em formato hexadecimal ou ASCII. Voc pode usar a Image Editor para editar cones e cursores assim como arquivos JPEG e GIF, que so armazenados como recursos vinculados. Voc tambm pode escolher outros aplicativos como editores para esses tipos de arquivo. Para mais informaes, consulte Exibindo e Editando Recursos no Resource Editor.

Visual C# Consolidado

49

Compilando Recursos em Assemblies Quando voc cria seu aplicativo, o Visual Studio chama a ferramenta resgen.exe para converter os recursos do aplicativo em uma classe interna chamada Resources. Essa classe est contida no arquivo Resources.Designer.cs que est aninhado no arquivo Resources.resx no Solution Explorer. A classe Resources encapsula todos os recursos do projeto em propriedades get, somente-leitura estticas, como uma forma de fornecer recursos fortemente tipados em tempo de execuo. Quando voc constri atravs do Visual C# IDE, todos os dados de recurso encapsulados, incluindo os dois recursos que foram incorporados ao arquivo .resx e os arquivos vinculados, so compilados diretamente para o aplicativo assembly (o arquivo .exe ou .dll). Em outras palavras, o Visual C# IDE sempre usa a opo /resource de compilador. Se voc constri a partir da linha de comando, voc pode especificar a opo de compilador /linkresource que permitir implantar recursos em um arquivo separado do aplicativo assembly principal. Este um cenrio avanado e s necessrio em certas situaes raras. Uma situao mais comum para implantao de recursos separadamente do aplicativo assembly principal usar assemblies satlites conforme discutido abaixo. Acessando Recursos em Tempo de Execuo Para acessar um recurso em tempo de execuo, simplesmente referencie-o como voc faria para qualquer outro membro da classe. O Exemplo a seguir mostra como recuperar um recurso bitmap que voc nomeou para Image01. System.Drawing.Bitmap bitmap1 = Resources.Image01; Internamente a propriedade get utiliza a classe ResourceManager para criar uma nova instncia do objeto. Para obter mais informaes, consulte Recursos em Aplicativos e Gerador de Arquivos de Recurso (Resgen.exe). Recursos em Assemblies Satlites Se voc estiver criando aplicativos que sero localizados (traduzidos) em vrios idiomas, voc pode armazenar cada conjunto de seqncia de caracteres especficos de cada cultura como um recurso em seu prprio assembly satlite. Quando voc distribuir seu aplicativo, voc incluir o aplicativo assembly principal junto com qualquer montagem satlite adequada. Voc pode adicionar assemblies satlite ou modificar arquivos existentes sem recompilar o aplicativo assembly principal. Para obter mais informaes, consulte Criando Assemblies Satlites e Localizando e Usando Recursos para uma Cultura Especfica.

Visual C# Consolidado

50

OBTENDO AJUDA (VISUAL C#)


A documentao da ajuda do Visual Studio est contida na Biblioteca MSDN, que voc pode instalar localmente em seu prprio computador ou rede, e que tambm est disponvel na Internet em http://msdn.microsoft.com/Library. A verso local da biblioteca consiste em uma coleo de compactada arquivos HTML com o formato.hxs. Voc pode optar por instalar a biblioteca em sua mquina total ou parcialmente; a instalao completa do MSDN fica prxima de 2 GB em tamanho e inclui documentao para muitas tecnologias Microsoft. Voc pode exibir a documentao MSDN local eonline usando o navegador do Visual Studio Help chamado Microsoft Document Explorer. Existem seis maneiras para acessar a ajuda enquanto trabalha no Visual C#:

Pesquisar F1 Pesquisa ndice ndice Analtico Como Eu Ajuda Dinmica

Ajuda Online versus Local Na pgina de propriedades Help Options no menu Options, voc pode especificar as seguintes opes para o comportamento da pesquisa, inclusive a pesquisa F1:

Tente a Biblioteca MSDN on-line primeiro, depois a documentao local se nenhuma coincidncia for encontrada. Tente a Biblioteca MSDN local primeiro, depois a documentao on-line se nenhuma coincidncia for encontrada. Tente somente a Biblioteca MSDN local.

Essas opes tambm sero exibidas na primeira vez voc chamar qualquer pesquisa. A documentao MSDN on-line pode conter atualizaes mais recentes que a documentao local. Portanto, se voc tiver uma conexo Internet enquanto trabalha no Visual C#, recomendvel que voc escolha a opo de pesquisa para testar a Biblioteca MSDN on-line primeiro. De tempos em tempos, atualizaes para a documentao local podem ser disponibilizadas para download. Para obter mais informaes sobre atualizaes documentao, verifique o Visual Studio Developer Center. Pesquisa F1 F1 fornece recursos de pesquisa contextual. No editor de cdigo, voc pode acessar a documentao da Ajuda para palavras-chave C# e classes do Framework .NET posicionando o cursor de insero sobre ou imediatamente aps a palavra-chave ou membro da classe e pressionando F1. Quando uma caixa de dilogo ou qualquer outra janela tiver o foco, voc pode pressione F1 para obter ajuda sobre essa janela. Uma pesquisa F1 retorna no mais de uma pgina. Se nenhuma correspondncia for encontrada, ser exibida uma pgina informativa que fornece algumas dicas de soluo de problemas. Pesquisa Use a interface de pesquisa para retornar todos os documentos que correspondam a qualquer termo especificado ou conjunto de termos. A interface de pesquisa tem esta aparncia:

Visual C# Consolidado

51

Voc tambm pode usar a pgina Help Options no menu Options para especificar se voc deseja para procurar sites Codezone alm da Biblioteca MSDN. Sites Codezone so mantidos por parceiros da Microsoft e fornecem informaes teis sobre o C# e o .NET Framework. Somente contedo Codezone estar disponvel on-line. As mesmas opes de busca online versus pesquisa local se aplicam s pesquisas F1 e comum. Na interface de pesquisa voc pode restringir ou expandir sua pesquisa especificando quais tipos de documentos incluir. Existem trs opes, Linguagem, Tecnologia, e Tipo de Tpico. Voc geralmente obter os melhores resultados marcando somente as opes que se aplicam a seu cenrio desenvolvimento atual. ndice O ndice fornece uma maneira rpida para localizar documentos na sua Biblioteca MSDN local. No se trata de uma pesquisa do texto completo; ele procura somente as palavras-chave ndice que tiverem sido atribudas a cada documento. Uma pesquisa por ndice geralmente mais rpida e mais relevante que uma pesquisa de texto completo. Se mais de um documento contiver a palavra-chave que voc especificar na a caixa de pesquisa de ndice, depois uma janela de resoluo de ambigidade abre e permite que voc selecione dentre as opes possveis. A janela ndice estar localizada, como padro, no lado esquerdo do Document Explorer. Voc pode acess-la a partir do menu Help do Visual C#. ndice Analtico O ndice analtico da Biblioteca MSDN mostra todos os tpicos na biblioteca numa estrutura hierrquica num modo de exibio de rvore. Ele uma ferramenta til para navegar atravs da documentao para ter uma idia do que est contido na biblioteca, e para explorar documentos que voc talvez no localize atravs do ndice ou da pesquisa. Freqentemente, quando voc encontrar um documento pelo F1, ndice ou pesquisa, til saber onde ele est localizado no ndice analtico para que voc possa ver qual outra documentao relacionada existe para um determinado tpico. Clique no boto Sync with Table of Contents na barra de ferramentas Document Explorer para ver onde a pgina atualmente exibida est localizada na Biblioteca MSDN. Como Fazer

Visual C# Consolidado

52

Como Fazer uma exibio filtrada da Biblioteca MSDN que principalmente inclui documentos chamados Como ou Explicao Passo-a-passo que mostram como realizar uma tarefa especfica. Voc pode acessar a ajuda Como Fazer na barra de ferramentas Document Explorer ou no menu Help, ou na pgina inicial. Cada linguagem no Visual Studio tem sua prpria pgina Como Fazer, e a pgina que voc v depender do tipo de projeto que est atualmente ativo. Ajuda Dinmica A janela de ajuda dinmica exibe links para a documentao de referncia do Framework .NET e a linguagem C# baseada na posio atual do ponto de insero no editor de cdigo. Para mais informaes, consulte COMO: Personalizar a Ajuda Dinmica.

Visual C# Consolidado

53

IMPLANTANDO APLICATIVOS C#
Implantao o processo pelo qual voc distribui um aplicativo concludo ou componente para ser instalado em outros computadores. Para aplicativos de console, ou aplicativos Smart Client com base em Windows Forms, duas opes de implantao esto disponveis: ClickOnce e o Windows Installer. Implantao ClickOnce Implantao ClickOnce permite a voc publicar aplicativos do Windows para um servidor Web ou para uma rede de compartilhamento de arquivos para instalao simplificada. Para a maioria dos cenrios, ClickOnce a opo recomendada para implantao porque permite a auto atualizao de aplicativos baseados no Windows que podem ser instalados e executados com a mnima interao do usurio. Para configurar propriedades de implantao ClickOnce, voc pode usar o Assistente de publicao (acessvel no menu Build) ou a pgina Publicar no Designer de Projeto. Para mais informaes, consulte Pgina Publicar, Designer de Projeto. Para mais informaes sobre o ClickOnce, veja Implantao ClickOnce. O Windows Installer Implantao do Windows Installer permite a voc criar pacotes de instalao a serem distribudos aos usurios; o usurio executa o arquivo de instalao e segue passos com um assistente para instalar o aplicativo. Isso feito, adicionando um projeto de instalao sua soluo; quando criado, ele cria um arquivo de instalao que voc distribui para os usurios; o usurio executa o arquivo de instalao e etapas com um assistente para instalar o aplicativo. Para obter mais informaes sobre o Windows Installer, consulte Implantao do Windows Installer.

Recursos do Code Editor do Visual C#


Fornece ferramentas que ajudam a editar e navegar pelo seu cdigo Visual C#.

Refatorao
Refatorao o processo de melhorar seu cdigo depois ele foi gravado, alterando a estrutura interna do cdigo sem alterar o comportamento do cdigo externo. Visual C# fornece os seguintes comandos refactoring sobre o menu Refactoring:

Extrair o mtodo Renomear Encapsular o campo Extrair a interface Promover varivel local para parmetro Remover parmetros Reordenar parmetros

Multi-Project Refactoring O Visual Studio oferece suporte multi-Project refatorao. Todas as operaes que Corrigir referncias em arquivos refactoring corrigir essas referncias em todos os projetos de mesmo idioma. Isso funciona para quaisquer referncias projeto projeto-para-. Por exemplo, se voc tiver um aplicativo de console que referencia uma biblioteca de classes, quando voc renomeia um tipo

Visual C# Consolidado

54

de biblioteca (usando a Rename operao refactoring), classe as referncias para o tipo de biblioteca de classe no aplicativo do console tambm sero atualizadas. Caixa de dilogo Alteraes de visualizao Muitas operaes refactoring fornecem uma oportunidade para voc a revisar todas as alteraes de referncia que uma operao refactoring deve executar no seu cdigo, antes de confirmar a essas alteraes. Uma preview reference changes opo para estas operaes refactoring, ser exibido na caixa de dilogo refactoring. Aps selecionar essa opo e aceitar a operao refactoring, o Caixa de dilogo Alteraes de visualizao ser exibido. Observe que a Preview Changes caixa de dilogo tem duas exibies. A exibio inferior exibir seu cdigo com todas as atualizaes de referncia devido operao refactoring. Na caixa Preview Changes de dilogo pressionando Cancel ir parar a operao refactoring, e nenhuma alterao ser feita para o seu cdigo. Tolerant erros Refactoring Refatorao erro falhas. Em outras palavras, voc pode executar um refatorao em um projeto que no possvel criar. O processo refactoring no Entretanto, nesses casos pode atualizar referncias ambguas corretamente.

Trechos de cdigos (C#)


O Visual Studio fornece um novo recurso chamado trechos . de cdigo Voc pode usar trechos de cdigo para digitar um alias curta, e ento expandi-lo em uma construo de programao comuns. Por exemplo, o for trecho de cdigo cria um loop vazia for. Alguns trechos de cdigo so surround-com trechos de cdigo, que permitem que voc se selecionar linhas de cdigo, escolha um trecho de cdigo que ir incorporar as linhas de cdigo selecionadas. Por exemplo, selecionar linhas de cdigo depois ativar o for trecho de cdigo cria um for loop com essas linhas de cdigo dentro do bloco loop. Trechos de cdigo podem tornar programa escrever cdigo mais rpido, mais fcil, e mais confivel. Usando trechos de cdigo Trechos de Cdigo normalmente so usados no Editor do cdigo pelo digitando um nome curto para o alias um atalho trecho de cdigo e pressionar TAB. O menu IntelliSense tambm oferece um Insert Code Snippet Comando de menu, fornecendo uma lista de trechos de cdigo disponvel para ser inserida no Editor de Cdigo. Voc pode ativar a lista trecho de cdigo, digitando Ctrl+K, depois X. Para obter mais informaes, consulte COMO: Usar trechos de cdigo (C#) e COMO: Usar trechos de cdigo circunscritos. Aps um trecho de cdigo tenha sido escolhido, o texto do trecho de cdigo inserido automaticamente na posio do cursor. Nesse ponto, os campos editveis no trecho de cdigo so realados em amarelo, e o primeiro campo editvel selecionado automaticamente. O campo selecionado no momento Boxed em vermelho. No for trecho de cdigo, por exemplo, os campos editveis esto a varivel inicializador (i por padro (length). e a expresso comprimento) por padro Quando um campo selecionado, os usurios podem digitar um novo valor para o campo. Pressionar TAB percorre os campos do trecho de cdigo editveis; pressionando SHIFT + TAB ciclos atravs de em ordem inversa. Clicar em um campo coloca o cursor no campo, e duas vezes em um campo selecion-lo. Quando um campo estiver realado, uma dica de ferramenta pode ser exibida, oferecendo uma descrio do campo. Somente a primeira instncia de um determinado campo editvel; quando esse campo estiver realado, as outras instncias do campo so descritas. Quando voc alterar o valor de um campo editvel, esse campo alterado em todos os lugares ele usado no trecho de cdigo. Pressionar ENTER ou ESC ser cancelar a edio de campo e retorne o editor de cdigo para Normal.

Visual C# Consolidado

55

As cores padro para campos trecho, cdigos editveis podem ser alteradas, modificando a Code Snippet Field configurao no painel Fonts and Colors da caixa Options de dilogo. Para obter mais informaes, consulte Como alterar face da fonte, tamanho, e cores usadas no Editor:. Criar trechos de cdigo Voc pode criar e utilizar trechos de cdigo personalizado, juntamente com os trechos de cdigo que esto includos com o Visual Studio por padro. Para obter mais informaes sobre como criar trechos de cdigo personalizado, consulte Criar trechos de cdigo. Observao Para trechos de cdigo C#, os caracteres que so vlidos para especificar o < atalho > campo so: caracteres alfanumricos, sinal numrico (#), o caractere til (~), o caractere de sublinhado (_), e o hfen trao caractere (-). Para obter mais informaes sobre trechos de cdigo que esto includos na Visual C# por padro, consulte Trechos de cdigo padro.

Cdigo Colorization
Editor de Cdigo analisa tokens e cdigo constri para que sejam facilmente reconhecvel e distinguishable de outros contedos de cdigo no Editor de Cdigo. Aps o Editor de Cdigo analisa seu cdigo, ele colorizes construes de cdigo adequadamente. Smbolos Editor de Cdigo colorizes o seguinte token tipos. Comment Cdigo excludo Identificador Keyword Nmero Operador Palavra-chave pr-processamento String Seqncia (C# @ Verbatim) Tipos de usurio Usurio tipos (tipos valor) Tipos de usurio (interface) Usurio tipos (enums) Usurio tipos (representantes) Seo CDATA XML Comentrio XML Atributo doc XML Comentrio XML doc

Visual C# Consolidado

56

Marca doc XML Voc pode modificar colorization padro da configurao usando o Fontes e cores, Ambiente, caixa de dilogo Opes.

Palavras-chave contextuais
Editor de Cdigo colorizes palavras-chave contextuais adequadamente. O Exemplo a seguir, o tipo yield est colorized turquesa, enquanto a palavra yield est azul colorized.

Brace Colorization correspondncia Editor de Cdigo facilita colorization negrito ou colorization de realce para Brace correspondncia.

Negrito Colorization
Quando voc editar qualquer uma dos pares construo de cdigo a seguir a seqncia, ou pares construo de cdigo rapidamente so exibidos em negrito para indicar uma associao entre elas: "" @" " #if, #endif #region, #endregion case, break default, break for, break for, continue foreach, break foreach, continue while, break while, continue Uma seqncia Uma seqncia verbatim Pr-processamento diretivas para sees condicionais Pr-processamento diretivas para sees condicionais Palavras-chave instruo controle Palavras-chave instruo controle Palavras-chave expresso avaliao Palavras-chave expresso avaliao Palavras-chave expresso avaliao Palavras-chave expresso avaliao Palavras-chave expresso avaliao Palavras-chave expresso avaliao

Visual C# Consolidado

57

Voc pode desativar este recurso por unselecting a Automatic delimiter highlighting propriedade no Geral, editor de texto, caixa de dilogo Opes.

Realar Colorization
Quando o cursor est posicionado imediatamente antes um delimitador inicial, ou imediatamente aps um delimitador de trmino, retngulos cinza aparecem para realar tanto inicial e final delimitadores para indicar uma associao entre eles. Esse recurso est disponvel para os seguintes pares correspondentes: {} [] () Chaves Colchetes Parntese

Exemplo
Para ilustrar Brace correspondncia colorization, digite fazer (No copie e cole) o cdigo a seguir no Editor de Cdigo. class A { public A() { if(true) int x =0; else int x =1; } } Configuraes colorization Configuraes colorization so persistentes atravs de Configuraes do Visual Studio.

Metadados como fonte


Metadados como fonte permite-lhe Exibir metadados que aparece como C# cdigo-fonte em um buffer somente leitura. Isso permite que um modo de exibio das declaraes dos tipos e membros (com nenhum implementaes). Voc pode exibir metadados como origem ao executar o Go To Definition Comando para tipos ou membros cujo cdigo de fonte no est disponvel do seu projeto ou soluo. Observao Quando voc tenta executar o Go To Definition Comando para tipos ou membros marcados como internos, o IDE (ambiente de desenvolvimento integrado) no exibe seus metadados como fonte, independentemente do se o conjunto de referncia um amigo ou no. Voc pode exibir metadados como fonte no Editor de Cdigo ou a Code Definition janela. Exibindo metadados como no Editor do cdigo fonte Quando voc executa o Go To Definition comando para um item cujo cdigo de fonte no estiver disponvel, um documento que contm uma exibio de metadados, esse item exibido como fonte, com guias exibida no editor do cdigo. O nome do tipo, seguido por [from metadata], aparecer na guia do documento. Por exemplo, se voc executar o Go To Definition comando para Console metadados de Console aparece no Editor do cdigo como cdigo fonte C# que parea como sua declarao, mas com nenhum implementao.

Visual C# Consolidado

58

Exibindo metadados como fonte no Code Definition Window Quando a Code Definition janela estiver ativa ou visvel, o IDE executa automaticamente o Go To Definition Comando para itens sob o cursor no Editor do cdigo e para itens que esto selecionados no Class View ou o Object Browser. Se o cdigo fonte no est disponvel para esse item, o IDE exibir metadados do item como origem na janela Code Definition. Por exemplo, se voc colocar o cursor dentro a palavra Console no Editor do cdigo, metadados para Console aparecer como fonte na janela Code Definition. A fonte procura algo como a Console declarao, mas com nenhum implementao. Se voc deseja ver a Declarao de um item que aparece na janela Code Definition, voc deve usar o Go To Definition comando porque a Code Definition janela apenas um nvel de profundidade explicitamente

Configuraes do IDE Visual C#


Visual configuraes C# so uma configurao de janelas de ferramentas, menus e atalhos de teclado predefinida. Essas configuraes so parte do recurso Configuraes do Visual Studio, que voc pode personalizar para ajustar seus hbitos de trabalho. Windows e modos de exibio Recurso Class View Exibido por padro? Observaes No

Exibir de classe est disponvel no menu View. Filtragem est ativada.

Janela de Comando Dynamic Help Window

No No Pressionar a tecla F1 no exibe a janela da Ajuda dinmica. Para obter mais informaes sobre a janela Ajuda

Visual C# Consolidado

59

dinmico, consulte Como: Personalizar Ajuda dinmica ou Como controlar a janela da Ajuda dinmico:. Pesquisador de objetos Janela Output No No Explorer de soluo aparece encaixado no lado direito de IDE. A pgina inicial Exibe artigos na alimentao RSS MSDN no Visual C#.

No exibida membros herdados por padro.

Solution Explorer Sim Start Page Lista de tarefas (Visual Studio) Toolbox Sim, quando voc inicia o IDE No Sim, quando voc cria um aplicativo do Windows Forms

A caixa de ferramentas aparece como uma janela que encaixada no lado esquerdo de IDE recolhida.

Teclado Recurso Teclas de atalho Comportamento Essas configuraes de chave de atalho oferece suporte Visual C#: Emulao breve Emulao Emacs Visual C++ 2,0 padro teclas de atalho Teclas de atalho padro Studio 6.0 Visual

Atalhos de Teclado Visual C#


Visual C# fornece um nmero de atalhos de teclado que voc pode usar para executar aes sem usar o mouse ou menus.

Teclas de atalho
O IDE (ambiente de desenvolvimento integrado) fornece vrios esquemas de ligao do teclado predefinidos. Voc pode criar seu prprio teclado personalizado esquemas de mapeamento do painel de ambiente opes na caixa de dilogo Opes teclado. Voc pode acessar a caixa de dilogo Opes no menu Ferramentas. Os esquemas de ligao do teclado disponveis incluem o seguinte:

2003 Studio visual teclas de atalho padro 6,0 Studio visual teclas de atalho padro Breve teclas de atalho padro Teclas de atalho padro Emacs Teclas de Atalho Padro do Visual Basic 6.0 Visual C++ 6.0 padro teclas de atalho Visual C++ 2,0 padro teclas de atalho

As combinaes de teclas de atalho a seguir funcionam no IDE. Muitos so padro combinaes teclas usadas na maioria dos aplicativos Windows; a tabela lista a funo especfica que tem o pressionamento de teclas no IDE. Name (Nome) Teclas de Descrio

Visual C# Consolidado

60

atalho Ativar menu aplicativo Ativar menu Janela Documento Ativar ferramenta menu Janela Aplicativo de fechamento Fechar documento Recolher Todos os ns de rvore Expandir todos os ns de rvore Mover para Barra de menus Mova para ferramentas prxima Mover para Barra de ferramentas anterior ALT + espaos ALT + HFEN Abre o menu Programa, permitindo ao usurio para gerenciar o estado da janela do aplicativo, por exemplo, mover ou redimensionar. Abre o menu de documento, permitindo ao usurio para gerenciar o estado da janela do documento ativo, por exemplo, mover ou redimensionar. Disponvel somente enquanto no modo MDI de dentro uma janela de documento. Abre o menu Janela ferramenta, permitindo ao usurio para mover a janela ferramenta no IDE. Disponvel somente ao dentro de uma janela ferramenta. Fecha o IDE. Fecha o documento aplicativo ativo. Recolhe todos os ns no modo de exibio de rvore atual. Expande todos os ns no modo de exibio de rvore atual. Ativa a barra de menus IDE principal. Move para a prxima barra de ferramentas visvel. Disponvel somente enquanto a barra de menus principal estiver ativa. Move para a barra de ferramentas visvel anterior. Disponvel somente enquanto a barra de menus principal estiver ativa. Ativa a barra de ferramentas Janela ferramenta. Disponvel somente em uma janela ferramenta contendo uma barra de ferramentas. Move o foco em modo de exibio de rvore para baixo sem alterar a seleo. Este atalho pode ser utilizado para selecionar vrios itens na rvore. Move o foco em modo de exibio de rvore backup sem alterar a seleo. Este atalho pode ser utilizado para selecionar vrios itens na rvore. Exibe o menu de atalho. Oculta e mostra uma lista drop-down. Disponvel somente de uma lista drop-down. Alterna uma seleo para o foco atual em modo de exibio de rvore.

ALT + HFEN

ALT + F4 CTRL+F6 Num +Num + * ALT CTRL + TAB

CTRL + SHIFT + TAB

Mova para SHIFT + ALT ferramentas Janela ferramenta Mover o foco de rvore abaixo Move o foco de rvore cima Menu de atalho Alternar visibilidade lista drop-down Alternar seleo foco de rvore CTRL + DOWN. CTRL + UP

SHIFT + F10 F4

CTRL + SPACEBAR

Visual C# Consolidado

61

Teclas de atalho padro configuraes Development gerais


Os tpicos a seguir listam as combinaes de teclas padro disponveis para o esquema de mapeamento do teclado Visual Studio 2003.

Lista Global teclas de atalho, definies gerais de desenvolvimento comuns combinaes de teclas de atalho, bem como combinaes de teclas que podem ser usadas em uma variedade de locais dentro do IDE. Lista Designer de HTML teclas de atalho, definies gerais de desenvolvimento as combinaes de teclas de atalho disponveis ao trabalhar no modo Design e modo de exibio de HTML do Designer de HTML. Lista XML teclas de atalho do criador, definies gerais de desenvolvimento as combinaes de teclas de atalho disponveis ao trabalhar em exibio Esquema de designer XML. Lista Teclas de acelerao para o Editor de dilogo disponveis ao trabalhar no Editor de dilogo. Lista Teclas de acelerao para o editor de imagem disponveis ao trabalhar no editor de imagem. as combinaes de teclas de atalho as combinaes de teclas de atalho as combinaes

Lista Depurao teclas de atalho, definies gerais de desenvolvimento de teclas de atalho disponveis ao usar o depurador.

Lista Pesquisar e substituir teclas de atalho, definies gerais de desenvolvimento o atalho chave combinaes disponveis ao usar a localizar Localizar, substituir, em arquivos, e substituir nas caixas de dilogo Arquivos. Lista Dados teclas de atalho, definies gerais de desenvolvimento as combinaes de teclas de atalho disponveis ao usar o Query Designer ou designer de banco de dados. Lista Controlar manipulao teclas de atalho, definies gerais de desenvolvimento as combinaes de teclas de atalho disponveis para mover e redimensionar controles em uma superfcie de design. Lista Texto teclas de atalho de navegao, definies gerais de desenvolvimento as combinaes de teclas de atalho disponveis ao mover dentro de cdigo em um documento aberto. Lista Texto teclas de atalho de seleo, definies gerais de desenvolvimento as combinaes de teclas de atalho disponveis ao selecionar texto em um documento aberto. Lista Texto teclas de atalho de manipulao, definies gerais de desenvolvimento as combinaes de teclas de atalho disponveis quando movendo, excluindo ou formatar texto em um documento aberto. Lista Janela teclas de atalho de gerenciamento, definies gerais de desenvolvimento combinaes de teclas de atalho disponveis para mover, Fechar, ou navegar em janelas ferramenta e documentos. Lista Integrada teclas de atalho da Ajuda, definies gerais de desenvolvimento combinaes de teclas de atalho disponveis ao exibir e procurar tpicos da Ajuda. Lista Objeto teclas de atalho do navegador, definies gerais de desenvolvimento combinaes de teclas de atalho disponveis ao trabalhar no Pesquisador de objetos. Lista Macro teclas de atalho, definies gerais de desenvolvimento teclas de atalho disponveis para trabalhar com macros. as as as

as combinaes de as

Lista Ferramenta janela teclas de atalho, definies gerais de desenvolvimento combinaes de teclas de atalho que exibem as janelas ferramenta vrios.

Lista Projeto teclas de atalho, definies gerais de desenvolvimento as combinaes de teclas de atalho que podem ser usadas para adicionar novos itens a um projeto, criar um projeto, ou abrir arquivos ou Projetos.

Visual C# Consolidado

62

Lista Acelerador e teclas de atalho Editor de seqncia, definies gerais de desenvolvimento as combinaes de teclas de atalho disponveis ao trabalhar em componente editor, editor STRING, e Accelerator editor.

Visual C# Consolidado

63

ESCREVENDO APLICATIVOS COM O VISUAL C#


C# uma linguagem Type-Safe, orientada a objetos que simples mas sofisticada, permitindo que os programadores para criem um abrangncia dos aplicativos. Combinado com o Framework .NET, o Visual C# permite a criao de aplicativos Windows, Web Services, ferramentas de banco de dados, componentes, controles e mais. Esta seo contm informaes sobre vrias tecnologias da plataforma Microsoft nas quais voc pode basear aplicativos C#.

Usando a Biblioteca de Classe do .NET Framework (Visual C#)


A maioria dos projetos de desenvolvimento Visual C# usam amplamente a Biblioteca de Classe do .NET Framework para tudo desde acesso ao sistema de arquivos e manipulao de seqncia a controles de interface de usurio do Windows Forms e do ASP.NET. A biblioteca de classe organizada em namespaces, cada um deles contm um conjunto de classes relacionadas e estruturas. Por exemplo, o namespace System.Drawing contm vrios tipos que representam fontes, canetas, linhas, formas, cores, e assim por diante. Diretivas de uso e Referncias Antes de voc poder usar as classes de um dado namespace em um programa C#, voc deve adicionar uma diretiva de uso para aquele namespace no seu arquivo de origem C#. Em alguns casos, voc tambm deve adicionar uma referncia para a DLL que contm o namespace; Visual C# adiciona automaticamente referncias para as DLLs de biblioteca de classe mais comumente usadas. Voc pode ver quais referncias foram adicionadas em Solution Explorer sob o n References. Para mais informaes, consulte Criando um Projeto (Visual C#). Aps ter adicionado a diretiva using para um namespace, voc pode criar instncias de seus tipos, chamar mtodos, e responder a eventos no momento que eles forem declarados no seu prprio cdigo fonte. No editor de cdigo Visual C#, voc tambm pode colocar o ponto de insero sobre membro de nome ou tipo, e pressionar F1 para ver a documentao de Ajuda. Voc tambm pode usar a ferramenta Pesquisador de Objetos e o recurso Metadata As Source para ver informaes de tipo em classes e estruturas do .NET Framework. Para mais informaes, consulte Modelagem e Analise de Cdigo (Visual C#). Para mais informaes

Para obter mais informaes sobre a biblioteca de classe do .NET Framework, consulte Viso geral da estrutura da biblioteca de classe .NET e Programao no .NET Framework. Para obter mais informaes sobre a arquitetura .NET Framework, consulte Viso Geral do .NET Framework. Na Internet, o .NET Framework Developer Center possui vrios artigos e exemplos de cdigo sobre a biblioteca de classe. Para obter informaes sobre como executar tarefas especficas usando as bibliotecas de classe, consulte Como fazer em C# ou clique em How Do I no menu Help do Visual C#.

Visual C# Consolidado

64

Criando aplicativos do Windows Forms (Visual C#)


Windows Forms a tecnologia que voc usa em Visual C# para criar aplicativos de cliente inteligente baseados no Windows que executa em .NET Framework. Quando voc cria um projeto de aplicativos Windows, voc est criando um aplicativo baseado no Windows Forms. Voc usar o o Windows Forms Designer para criar a interface do usurio, e voc ter acesso a outros recursos de design em tempo de execuo, incluindo:

Implantao ClickOnce. Suporte rico a banco de dados com o controle DataGridView . Barras de ferramentas e outros elementos de interface do usurio que podem ter a aparncia e o comportamento do Microsoft Windows XP, do Microsoft Office, ou do Microsoft Internet Explorer.

Para obter mais informaes, consulte Criando uma interface de usurio (Visual C#) e Windows Forms.

Criando Aplicativos de Console (Visual C#)


C# pode ser usado para criar aplicativos de linha de comando que possuam entrada e exibam a sada no console. Esses aplicativos so ideais para aprender o desenvolvimento C# porque a interface do usurio muito simples. Aplicativos console so tambm muito teis para programas utilitrios que requeiram pouca ou nenhuma interao do usurio. Para criar um aplicativo do console em no Visual C#, clique em New no menu File e selecione Project. Clique em em um modelo de projeto de aplicativo de console C#, fornea os nomes de arquivos que voc deseja, e clique em OK. Use a classe System.Console Use a classe Console para ler e escrever caracteres a partir do console, individualmente ou como uma linha inteira. A sada pode ser formatada de diferentes maneiras. Para mais informaes, consulte Viso Geral Sobre Formatao. Argumentos da linha comando podem ser acessados usando a matriz de seqncia de caracteres opcional associada ao mtodo Main. Para mais informaes, consulte Argumentos da Linha Comando (Guia de Programao C#). Exemplos

Como criar um cliente de aplicativo de console:

Exemplo de parmetros da linha de comando

Acessar e exibir dados (Visual C#)


Em aplicativos Visual C#, voc normalmente se conectar a bancos de dados usando a tecnologia ADO.NET conforme exposto no System.Data e namespaces relativos biblioteca de classes do .NET Framework. Para obter mais informaes sobre como trabalhar com dados, consulte Acessando dados (Visual Studio). Em aplicativos do Windows Forms, o controle principal de interface do usurio para exibir dados recuperados de bancos de dados o DataGridView. Para mais informaes, consulte DataGridView Control (Windows Forms). Conectar fontes de dados a controles de interface do usurio tais como caixas de texto e caixas de listagem muito simples atravs de um recurso conhecido como vinculao de dados. Automaticamente, quando voc vincula um controle a um campo em uma fonte de dados, as alteraes feitas em um sero refletidas no outro. Para mais informaes, consulte Vinculao de dados do Windows Forms.

Visual C# Consolidado

65

Para obter mais informaes sobre a criao e gerenciamento de bancos de dados, escrever procedimentos de armazenamento e outras informaes relacionadas, consulte Projetos de Servidor SQL, Livros on-line sobre Servidor SQL e Tutoriais do Servidor SQL. Os seguintes links contm informaes sobre como usar Visual Studio para acessar dados:

Criando aplicativos de dados com Visual Studio Ferramentas de Banco de DadosVisual

Na Internet, o Data Access and Storage Developer Center est sempre atualizado com novos artigos e exemplos.

Criando Aplicativos Mveis e Incorporados (Visual C#)


O Microsoft Visual Studio 2005 oferece suporte rico e integrado para desenvolvimento de software compatvel com dispositivos inteligentes baseados em Windows CE como Pocket PCs e Smartphones. Voc pode usar o Visual C# para escrever aplicativos gerenciados que executam no .NET Compact Framework. Voc ir usar a mesma interface de Editor de Cdigos, designers e depurador que voc usaria ao desenvolver para o PC. Simplesmente selecione de um dos modelos de projeto Smart Device disponveis para o idioma de sua escolha, e comece a codificar. O Visual Studio tambm fornece emuladores para dispositivos inteligentes que permitem que voc execute e depure seu cdigo no seu computador de desenvolvimento, e ferramentas que simplificam o processo de compactao do seu aplicativo e seus recursos em arquivos CAB para implantao em dispositivos de usurio final. Para mais informaes, consulte Dispositivos inteligentes. Voc tambm pode usar o Visual Web Developer para desenvolver aplicativos Web mvel com base no ASP.NET Para mais informaes, consulte Introduo aos Formulrios Mveis da Web.

Visual C# Consolidado

66

CRIANDO E ACESSANDO SERVIOS DA WEB (VISUAL C#)


XML Web Services fornecem a aplicativos a possibilidade de se comunicarem em um ambiente fracamente acoplado usando troca mensagens predefinidas construdas em torno de protocolos padro como HTTP, XML, XSD, SOAP e WSDL. Como os protocolos e as especificaes so pblicos e no especficos de plataforma, XML Web Services podem ser usados para habilitar a comunicao entre aplicativos que residem no mesmo computador ou no, mesmo que eles estejam em plataformas ou dispositivos diferentes. Voc no precisa entender detalhadamente cada especificao para criar ou consumir servios da Web. As classes do .NET Framework e os assistentes do Visual Studio ajudam voc a criar ou interagir com XML Web Services usando um modelo familiar de programao orientada a objetos. Para obter mais informaes sobre XML Web Services, consulte Viso Geral sobre XML Web Services. Para obter informaes sobre a criao e o acesso a XML Web Services usando ASP.NET, consulte XML Web Services Usando ASP.NET. Para obter informaes sobre as ferramentas que o Visual Studio fornece para ajudar a criar e consumir facilmente XML Web Services, consulte XML Web Services (Visual Studio). Para obter mais informaes sobre como criar e acessar XML Web Services, consulte XML Web Services em Cdigo Gerenciado. O Web Services Developer Center na MSDN Online possui artigos e recursos adicionais.

Visual C# Consolidado

67

CRIANDO COMPONENTES (VISUAL C#)


O termo componente na indstria de software freqentemente usado para fazer referncia a um objeto reutilizvel que expe uma ou mais interfaces para clientes de uma maneira padronizada. Um componente pode ser implementado como uma classe nica, ou como um conjunto de classes; o requisito primrio que a interface pblica bsica seja bem definida. Por exemplo, em um contexto de programao nativa do Windows, o COM (Component Object Model) requer que todos os componentes implementem a interface IUnknown alm das outras interfaces especializadas. No contexto do .NET Framework, um componente uma classe ou conjunto de classes que implementa a interface IComponent ou deriva diretamente ou indiretamente de uma classe que implementa esta interface. A implementao da classe base padro da interface IComponent Component. Alguns dos componentes mais comumente usados em programao no .NET Framework so os controles visuais que voc adiciona ao Windows Forms como o Controle de Boto (Windows Forms), Controle de Caixa de Combinao (Windows Forms) e assim por diante. Componentes no visuais incluem o Controle de Timer, SerialPort, e ServiceController entre outros. Quando voc cria um componente em C#, ele pode ser usado por clientes escritos em qualquer outra linguagem que est em conformidade com a Common Language Specification. Para criar seus prprios componentes no Visual C#, voc pode usar o Component Designer para montar classes de componentes no visuais da mesma maneira que voc monta no Windows Forms. Para mais informaes, consulte Explicao passo a passo: Criando um aplicativo de servio Windows no Designer de Componente. Para obter mais informaes sobre programao de componente usando o Visual Studio, consulte Componentes no Visual Studio.

Desenvolvendo na Plataforma do Office (Visual C#)


O Microsoft Visual Studio 2005 Tools para o Microsoft Office System permite a voc personalizar documentos do Microsoft Office e o Microsoft Office Outlook usando cdigo gerenciado. O Visual Studio Tools para o Office adiciona novas funcionalidades ao Visual Studio, tais como hospedar o Microsoft Office Word e o Microsoft Office Excel como designers no ambiente de desenvolvimento do Visual Studio, a habilidade de programar diretamente em objetos de dados e de apresentao e a habilidade de usar os controles do Windows Forms em documentos dentro do painel de tarefas Document Actions.

Programao do Office (Como Fazer em C#)


Esta pgina fornece referncia a ajuda sobre tarefas amplamente executadas de programao do Office. Para exibir outras categorias de tarefas populares abordados na Ajuda Como Fazer em C#. Gerais COMO: Atualizar Solues de Ferramentas do Visual Studio Tools para Office Explica o procedimento que voc deve executar manualmente para concluir a atualizao para o Microsoft Visual Studio 2005 Tools para Office. O Excel Usando Explicaes Passo-a-passo

Visual C# Consolidado

68

Demonstra trs tipos bsicos de tarefas: automatizar Microsoft Office Excel 2003, executar anlises de dados, e trabalhar com controles. O Word Usando Explicaes Passo-a-passo Demonstra maneiras de usar as ferramentas para o Microsoft Office 2003 para automatizar projetos do Microsoft Office Word 2003. COMO: Automatizar Aplicativos do Office que no Word, Excel, ou o Outlook Fornece as etapas a serem executadas em seus projetos existentes para que possa chamar cdigo no gerenciado usando o Visual Basic ou C#. COMO: Adicionar Controles a Documentos do Office Explica como adicionar controles a documentos Office em tempo de design ou em tempo de execuo. Aplicativos Word e Excel COMO: Executar Clculos do Excel por Programao Explica como executar clculos por programao para um intervalo ou para o aplicativo inteiro. COMO: Criar Menus do Office por Programao Fornece um Exemplo que cria um menu chamado New Menu na barra de menus no Microsoft Office Excel 2003. COMO: Criar Barras de Ferramentas do Office por Programao Fornece um Exemplo que cria uma barra de ferramentas denominada Teste no Microsoft Office Word 2003. Ele aparece prximo ao meio do documento e contm dois botes. Quando um boto clicado, uma caixa de mensagem aparece. COMO: Manipular Erros em Projetos do Office Explica como configurar o depurador para paralisar em excees do tempo de execuo de linguagem comum.

Como: Atualizar solues das Ferramentas do Visual Studio para o Office


Aps a atualizao para Microsoft Visual Studio 2005 Tools for the Microsoft Office System, voc pode abrir e executar seus projetos existentes no Visual Studio e eles sero atualizados para funcionam da mesma forma que eles tinham ao usar Visual Studio Tools for Office, Verso 2003. No entanto, para concluir a atualizao para que voc pode tirar proveito do novo sistema do projeto e ferramentas, voc deve executar algumas etapas atualizao manualmente. Para obter mais informaes, consulte Atualizando Overview solues do Office. Para atualizar um Ferramentas do Visual Studio para soluo Office 1. Abra uma soluo existente no Visual Studio com Visual Studio 2005 Tools for Office instalado. O Visual Studio Conversion Wizard aparece. 2. 3. Leia as informaes e avisos na primeira tela, e clique em Next. Se voc desejar criar um backup de sua soluo, selecione Yes, create a backup before converting e especifique um local para os arquivos de backup. Se voc no faa desejar criar um backup, selecione No. Clique em Next. Clique em Finish se tudo na pgina de resumo est correto.

4. 5.

Visual C# Consolidado

69

Uma caixa de dilogo aparece com informaes sobre propriedades padro para depurao do projeto. 6. 7. Clique Yes para atualizar para o novo projeto depurao propriedades padro. O projeto se voc clicar em No, no ser compilado at que voc faa alteraes manualmente. Clique no link para o relatrio de converso para ver detalhes sobre o status de converso, ou ento clique em Close. A soluo abre com o novo sistema do projeto visvel no Solution Explorer, mais os arquivos da verso antiga da soluo. 8. 9. Mover o cdigo do arquivo classe principal antigo para o novo ThisDocument,

ThisWorkbook,. e Sheet Classes


Excluir o arquivo classe principal antigo aps remover todo o cdigo. 10. Atualizar qualquer referncia no qualificada para aplicativos com espao para nome System.Windows.Forms.Application totalmente qualificado. Para obter mais informaes, consulte " Atualizando O cdigo " no Atualizando Overview solues do Office. 11. Substituir todos os controles ActiveX no documento ou pasta de trabalho por controles gerenciados do Visual Studio Toolbox.

Visual C# Consolidado

70

O EXCEL USANDO EXPLICAES PASSO-A-PASSO


Walkthroughs fornecem instrues passo a passo para cenrios comuns e so um bom lugar para comear aprendendo sobre Microsoft Visual Studio 2005 Tools for the Microsoft Office System. Orientaes as seguir demonstram vrios tipos bsicos de tarefas: automatizar o Microsoft Office Excel 2003, executar anlise de dados, trabalhar com controles, solues, implantao e definindo a segurana.

Coleta de dados usando um formulrio do Windows Walkthrough


Essa explicao passo a passo demonstra como abrir um formulrio Windows de um planilha do Microsoft Office Excel 2003, coletar informaes do usurio, e gravar essas informaes em uma clula da planilha. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Microsoft Visual Studio 2005 Tools for the Microsoft Office System Excel Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Criando um novo projeto Nesta etapa, voc ir criar um projeto de aplicativos do Excel.

Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome WinFormInput. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o WinFormInput projeto para Solution Explorer. Adicionar um controle NamedRange para a planilha

Para adicionar um intervalo nomeado para Sheet1


1. 2. Selecione a clula A1 no Sheet1. Na caixa Name, digite formInput. A Name caixa est localizada esquerda da barra de frmulas, logo acima coluna A da planilha. 3. Pressione ENTER. Um NamedRange controle adicionado clula A1. No h nenhuma indicao visvel na planilha, mas formInput aparece na caixa Name (logo acima a planilha no lado esquerdo). e na Properties janela quando a clula A1 selecionada

Visual C# Consolidado

71

Adicionar um formulrio do Windows ao projeto Criar um formulrio do Windows para o usurio fornea informaes prompt.

Para adicionar um formulrio do Windows


1. 2. 3. Selecione o projeto WinFormInput no Solution Explorer. No menu Project, clique em Add Windows Form. Nome do formulrio GetInputString.vb ou GetInputString.cs. e, em seguida clique em Add O novo formulrio aberto no designer. 4. 5. Adicionar um TextBox e um Button. para o formulrio Selecione o boto, localizar a propriedade Text na janela Properties, e alterar o texto OK.

Em seguida, adicione cdigo para ThisWorkbook.vb ou ThisWorkbook.cs para coletar informaes do usurio. Exibindo o formulrio do Windows e coletando informaes Criar uma instncia do formulrio GetInputString Windows e exibi-lo, e em seguida, escrever as informaes do usurio em uma clula na planilha.

Para exibir o formulrio e coletar informaes


1. 2. Clique com o boto direito do mouse ThisWorkbook.vb ou ThisWorkbook.cs em Solution Explorer e selecione View Code. No manipulador Open de eventos de ThisWorkbook, adicione o seguinte cdigo para declarar uma varivel para o formulrio GetInputString e depois exibir o formulrio:

Observao Em C#, voc deve adicionar um manipulador de eventos como mostrado no Startup evento abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C# private void ThisWorkbook_Startup(object sender, System.EventArgs e) { this.Open += new Microsoft.Office.Interop.Excel.WorkbookEvents_OpenEventHandler(ThisWorkbook_Open); } private void ThisWorkbook_Open() { GetInputString inputForm = new GetInputString(); inputForm.Show(); } 3. Criar um mtodo chamado WriteStringToCell que grave texto em um intervalo nomeado. Esse mtodo chamado do formulrio, e entrado sero passadas para o NamedRange controle, formInput o usurio,. na clula A1 C# public void WriteStringToCell(string formData) { Globals.Sheet1.formInput.Value2 = formData; } Prxima adicionar cdigo ao formulrio para lidar com clique o boto na evento. Enviar informaes para a planilha

Para enviar informaes para a planilha


1. Clique com o boto direito do mouse GetInputString em Solution Explorer, e selecione View Designer.

Visual C# Consolidado

72

2. 3.

Clique duas vezes no boto para abrir o arquivo de cdigo com manipulador de eventos do boto Click adicionado. Adicione cdigo ao manipulador de eventos para levar a entrada da caixa de texto, envi-lo para a funo WriteStringToCell, e depois feche o formulrio. C#

Globals.ThisWorkbook.WriteStringToCell(this.textBox1.Text); this.Dispose(); Testando Agora voc pode testar sua pasta de trabalho para certificar-se de que o formulrio Windows aparecer, e se a entrada aparece nesta planilha.

Para testar sua pasta de trabalho


1. 2. 3. 4. Pressione F5 para executar o projeto. Confirme se o formulrio Windows aparece. Digite Hello World na caixa de texto e clique em OK. Confirme que Hello World aparece na clula A1 da planilha. Prximas etapas Essa explicao passo a passo mostra os fundamentos bsicos do mostrando um Windows Form e dados passagem para uma planilha. Outras tarefas pode desejar executar incluem:

Implantando o projeto. Para obter mais informaes, consulte Como: Implantar arquivos de soluo usando o Publish Wizard.

Alterando planilha formatao usando controles CheckBox Walkthrough:


Essa explicao passo a passo mostra os fundamentos bsicos do uso caixas de seleo em um planilha do Microsoft Office Excel 2003 para alterar a formatao. Voc usar Microsoft Visual Studio 2005 Tools for the Microsoft Office System para criar e adicionar cdigo ao seu projeto. Para ver o resultado como uma amostra completa, consulte Exemplo do Excel de controles. Durante este explicao passo a passo, voc aprender como:

Adicione texto e controles para uma planilha. Formate o texto quando uma opo selecionada. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Visual Studio Tools for Office Microsoft Office Excel 2003. Criando o projeto

Nesta etapa, voc ir criar um projeto usando Visual Studio Tools for Office pasta de trabalho do Excel.

Visual C# Consolidado

73

Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome My Excel Formatting. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Excel Formatting projeto para Solution Explorer. Adicionar texto e controles a planilha

Para essa explicao passo a passo, voc precisar trs CheckBox controles e algum texto em um NamedRange controle.

Para adicionar trs caixas de seleo


1. 2. 3. 4. Verifique se a pasta de trabalho est abra no designer visual studio e que Sheet1 est aberto. Na guia Common Controls da Toolbox, arraste um CheckBox controle para ou prxima clula B2 na Sheet1. No menu View, selecione Properties Janela. Certifique-se de que que Checkbox1 esteja visvel na caixa de listagem Nome de objeto da janela Properties, e altere as propriedades a seguir: Value (Valor) applyBoldFont Negrito Arraste uma segunda caixa de seleo ou prxima clula B4 e alterar as seguintes propriedades: Value (Valor) applyItalicFont Itlico Arraste uma caixa de seleo terceira ou prxima clula B6 e alterar as seguintes propriedades: Value (Valor) applyUnderlineFont Sublinhado Selecione todos os controles caixa de seleo trs mantendo a tecla CTRL. Na barra de ferramentas do Excel, clique em Align Lefts e, em seguida clique em Make Vertical Spacing Equal. Os controles caixa de seleo trs agora tem igual espaamento vertical e so alinhados no lado esquerdo, na posio do primeiro controle que voc selecionou. Voc em seguida, ser arrastar um NamedRange controle para a planilha. Observao Voc tambm pode adicionar o NamedRange controle digitando textFont na caixa Name.

Propriedade Name Text 5.

Propriedade Name Text 6.

Propriedade Name Text 7. 8.

Visual C# Consolidado

74

Para adicionar texto a um controle NamedRange


1. 2. 3. 4. Na guia Excel Controls da caixa de ferramentas, arraste um NamedRange controle clula B9. Verificar que $B$9 aparece na caixa de texto editvel, e essa clula B9 estiver selecionada. Se no estiver, clique em Clula B9 para selecion-lo. Clique em OK. Clula B9 se torna um intervalo nomeado NamedRange1. No h nenhuma indicao visvel na planilha, mas NamedRange1 aparece no. (logo acima a planilha no lado esquerdo) quando Clula B9 estiver selecionada a Name box 5. Certifique-se de que que NamedRange1 esteja visvel na caixa de listagem Nome de objeto da janela Properties, e altere as propriedades a seguir: Value (Valor) textFont Clique em uma caixa de seleo para alterar a formatao de texto.

Propriedade Name Value2

Em seguida, escreva o cdigo para formatar o texto quando uma opo selecionada. Formatao quando a opo um texto selecionado Voc nesta seo, vai escrever cdigo para que quando o usurio seleciona uma opo de formatao, o formato do texto na planilha for alterado.

Para alterar a formatao quando uma caixa de seleo marcada


1. 2. Clique com o boto direito do mouse Sheet1 e clique View Code no menu de atalho Adicione o seguinte cdigo ao manipulador Click de eventos da caixa applyBoldFont de seleo: C# private void applyBoldFont_Click(object sender, EventArgs e) { this.textFont.Font.Bold = this.applyBoldFont.Checked; } 3. Adicione o seguinte cdigo ao manipulador Click de eventos da caixa applyItalicFont de seleo: C# private void applyItalicFont_Click(object sender, EventArgs e) { this.textFont.Font.Italic = this.applyItalicFont.Checked; } 4. Adicione o seguinte cdigo ao manipulador Click de eventos da caixa

applyUnderlineFont de seleo:
C# private void applyUnderlineFont_Click(object sender, EventArgs e) { if (this.applyUnderlineFont.Checked == true) { this.textFont.Font.Underline = Excel.XlUnderlineStyle.xlUnderlineStyleSingle; } else { this.textFont.Font.Underline = Excel.XlUnderlineStyle.xlUnderlineStyleNone; } } 5. Em C#, adicione manipuladores de eventos para as caixas de seleo para o Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#

Visual C# Consolidado

75

Copiar Cdigo this.applyBoldFont.Click += new EventHandler(applyBoldFont_Click); this.applyItalicFont.Click += new EventHandler(applyItalicFont_Click); this.applyUnderlineFont.Click += new EventHandler(applyUnderlineFont_Click); Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se que o texto est formatado corretamente quando voc marca ou desmarca uma caixa de seleo.

Para testar sua pasta de trabalho


1. 2. 3. Pressione F5 para executar o projeto. Marque ou desmarque uma caixa de seleo. Confirme que o texto est formatado corretamente. Prximas etapas Essa explicao passo a passo mostra as noes bsicas de usando caixas de seleo e formatar texto em planilhas do Excel 2003. Aqui esto algumas tarefas que podem vie em seguida:

Implantando o projeto. Para obter mais informaes, consulte Como implantar solues do Office:. Usando um boto para preencher uma caixa de texto. Para obter mais informaes, consulte Exibindo texto em uma caixa de texto em uma planilha usando um boto Walkthrough:.

Exibindo texto em uma caixa de texto em uma planilha usando um boto Walkthrough:
Essa explicao passo a passo mostra os fundamentos bsicos do uso botes e caixas de texto em planilhas Microsoft Office Excel 2003, e como criar projetos Excel usando Microsoft Visual Studio 2005 Tools for the Microsoft Office System. Para ver o resultado como uma amostra completa, consulte Exemplo do Excel de controles. Durante este explicao passo a passo, voc aprender como:

Adicionar controles a uma planilha. Preencher uma caixa de texto quando um boto clicado. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Visual Studio Tools for Office Excel. Criando o projeto

Nesta etapa, voc ir criar um projeto usando Visual Studio Tools for Office pasta de trabalho do Excel.

Para criar um novo projeto Visual C# Consolidado 76

Criar um projeto de pasta de trabalho do Excel com o nome My Excel Button. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Excel Button projeto para Solution Explorer. Adicionar controles a planilha

Para essa explicao passo a passo, ser necessrio um boto e uma caixa de texto na primeira planilha.

Para adicionar um boto e uma caixa de texto


1. 2. 3. 4. 5. Verifique se a My Excel Button.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. Na guia Common Controls da caixa de ferramentas, arraste para Sheet1. um TextBox No menu View, selecione Properties Window. Certifique-que TextBox1 est visvel na caixa Properties drop-down janela e alterar a Name propriedade da caixa de texto para displayText. Arraste um Button controle at Sheet1 e alterar as seguintes propriedades: Value (Valor) insertText Inserir texto

Propriedade Name Text

Agora Escreva o cdigo a ser executado quando o boto clicado. Preencher a caixa de texto quando o boto Clicked Sempre que o usurio clica no boto, Hello World! acrescentada caixa de texto.

Para escrever para a caixa de texto quando o boto clicado


1. 2. Na Solution Explorer, clique com o boto direito do mouse Sheet1 e, em seguida clique View Code no menu de atalho. Adicione o seguinte cdigo ao manipulador Click de eventos do boto: C# private void insertText_Click(object sender, EventArgs e) { this.displayText.Text += "Hello World! "; } 3. Em C#, adicione um manipulador de eventos para o Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C# this.insertText.Click += new EventHandler(insertText_Click); Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se que a mensagem Hello World! aparece na caixa de texto quando voc clica no boto.

Para testar sua pasta de trabalho


1. 2. Pressione F5 para executar o projeto. Clique no boto.

Visual C# Consolidado

77

3.

Confirme que Hello World! aparece na caixa de texto. Prximas etapas

Essa explicao passo a passo mostra os fundamentos bsicos do uso botes e caixas de texto em planilhas do Excel. Aqui esto algumas tarefas que podem vie em seguida:

Implantando o projeto. Para obter mais informaes, consulte Como: Implantar arquivos de soluo usando o Publish Wizard. Usar caixas de seleo para alterar a formatao. Para obter mais informaes, consulte Alterando planilha formatao usando controles CheckBox Walkthrough:.

Programao contra eventos de um controle NamedRange Walkthrough:


Essa explicao passo a passo demonstra como adicionar um NamedRange controle a um planilha do Microsoft Office Excel 2003 e programa contra seus eventos usando Microsoft Visual Studio 2005 Tools for the Microsoft Office System. Durante este explicao passo a passo, voc aprender como:

Adicionar um NamedRange controle para uma planilha. Programa contra NamedRange Eventos de controle. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Visual Studio Tools for Office Microsoft Office Excel 2003. Criando o projeto

Nesta etapa, voc ir criar pasta de trabalho Excel usando Visual Studio Tools for Office Um do projeto.

Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome My Named Range Events. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Named Range Events projeto para Solution Explorer. Adicionar texto e pipes intervalos para a planilha

Porque controles host so estendidos objetos do Office, voc poder adicion-los para o documento em da mesma maneira, voc adicionar o objeto nativo. Por exemplo, voc pode adicionar um controle Excel NamedRange a uma planilha ao abrir o Insert menu apontando para Name, e escolher Define. Voc tambm pode adicionar um NamedRange controle, arrastando-a partir para a planilha. o Toolbox

Visual C# Consolidado

78

Nesta etapa, voc ir adicionar dois controles Intervalo Nomeado da planilha usando a e adicione texto para a planilha. o Toolbox,

Para adicionar um intervalo para a planilha


1. 2. Verifique se a My Named Range Events.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. Na guia Excel Controls da caixa de ferramentas, arraste um NamedRange controle clula A1 no Sheet1. A Add NamedRange Control caixa de dilogo ser exibida. 3. 4. Verificar que $A$1 aparece na caixa de texto editvel, e essa clula A1 estiver selecionada. Se no estiver, clique em Clula A1 para selecion-lo. Clique em OK. Clula A1 se torna um intervalo nomeado namedRange1. No h nenhuma indicao visvel na planilha, mas namedRange1 aparece na caixa Name (localizada logo acima da planilha no lado esquerdo). Quando Clula A1 estiver selecionada 5. 6. 7. Adicionar um outro NamedRange controle a clula B3. Verificar que $B$3 aparece na caixa de texto editvel, e essa clula B3 estiver selecionada. Se no estiver, clique em Clula B3 para selecion-lo. Clique em OK. Clula B3 se torna um intervalo nomeado namedRange2.

Para adicionar texto a sua planilha


1. 2. Na clula A1, digite o seguinte texto: Na clula A3 (para a esquerda de namedRange2), digite o seguinte texto: Eventos: Voc nas sees a seguir, ser escrever cdigo que insere texto em namedRange2 e modifica propriedades do controle namedRange2 em resposta BeforeDoubleClick, Change., e SelectionChange eventos de namedRange1 Adicionar cdigo para responder ao evento BeforeDoubleClick Este um Exemplo de um controle NamedRange.

Para inserir texto em NamedRange2 com base no Evento BeforeDoubleClick


1. 2. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs. e selecione View Code Adicione cdigo para o namedRange1_BeforeDoubleClick manipulador de eventos semelhante ao seguinte: C# private void namedRange1_BeforeDoubleClick( Microsoft.Office.Interop.Excel.Range Target, ref bool Cancel) { this.namedRange2.Value2 = "The BeforeDoubleClick event occurred."; this.namedRange2.Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red); this.namedRange2.Font.Italic = true; } 3. Em C#, voc deve adicionar manipuladores de eventos para o intervalo nomeado como mostrado no Startup evento abaixo. Para obter informaes sobre como criar

Visual C# Consolidado

79

manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C# this.namedRange1.BeforeDoubleClick += new Microsoft.Office.Interop.Excel. DocEvents_BeforeDoubleClickEventHandler(namedRange1_BeforeDoubleClick); this.namedRange1.Change += new Microsoft.Office.Interop.Excel. DocEvents_ChangeEventHandler(namedRange1_Change); this.namedRange1.SelectionChange +=new Microsoft.Office.Interop.Excel. DocEvents_SelectionChangeEventHandler(namedRange1_SelectionChange); Adicionar cdigo para responder ao evento de alterao

Para inserir texto em namedRange2 com base no evento Change

Adicione cdigo para o NamedRange1_Change manipulador de eventos semelhante ao seguinte: C# private void namedRange1_Change(Microsoft.Office.Interop.Excel.Range Target) { this.namedRange2.Value2 = "The Change event occurred."; this.namedRange2.Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Blue); this.namedRange2.Font.Italic = false; } Observao Como duas vezes em uma clula em um intervalo do Excel entra no modo de edio, um Change evento ocorre quando a seleo movida fora do intervalo mesmo que nenhuma alterao ao texto ocorreu. Adicionar cdigo para responder ao evento SelectionChange

Para inserir texto em namedRange2 com base no evento SelectionChange

Adicione cdigo para o NamedRange1_SelectionChange manipulador de eventos semelhante ao seguinte: C# private void namedRange1_SelectionChange(Microsoft.Office.Interop.Excel.Range Target) { this.namedRange2.Value2 = "The SelectionChange event occurred."; this.namedRange2.AddComment("SelectionChange always occurs before BeforeDoubleClick."); this.namedRange2.Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black); } Observao Porque faz duas vezes em uma clula em um intervalo do Excel com a seleo para mover para o intervalo, um SelectionChange evento ocorre antes de ocorrer o BeforeDoubleClick evento. Testar o aplicativo

Agora voc pode testar sua pasta de trabalho para verificar texto que descreve os eventos de um NamedRange controle que ser inserido no outro intervalo nomeado quando os eventos so aumentados.

Para testar seu documento


1. 2. Pressione F5 para executar o projeto. Coloque o cursor no namedRange1, e verificar que o texto sobre o SelectionChange evento inserido e que um comentrio inserido na planilha.

Visual C# Consolidado

80

3. 4. 5. 6.

Duplo clique dentro namedRange1, e verifique se o texto sobre BeforeDoubleClick eventos est inserido com texto em itlico em namedRange2 vermelho. Clique fora do namedRange1 e observe que o evento de alterao ocorre quando sair Modo Edio mesmo que nenhuma alterao para o texto foi feita. Alterar o texto dentro namedRange1. Clique fora do namedRange1, e verifique se o texto sobre Change evento est inserido com texto em namedRange2 azul. Prximas etapas

Essa explicao passo a passo mostra noes bsicas de programao contra eventos de um NamedRange controle. Aqui esto algumas tarefas que podem vie em seguida:

Implantando o projeto. Para obter mais informaes, consulte Como implantar solues do Office:. Programao contra eventos dos XMLNode controles modo. Para obter mais informaes, consulte Alterando o painel de aes de acordo com contexto do usurio Walkthrough:.

Passo-a-passo: Concedendo e removendo permisses para uma soluo do Office


Essa explicao passo a passo demonstra as noes bsicas de segurana no Microsoft Visual Studio 2005 Tools for the Microsoft Office System. Durante este explicao passo a passo, voc aprender como:

Remova a configurao de segurana padro. Adicionar um novo conjunto de permisses. Testar seu projeto. Pr-requisitos

Para concluir esta explicao passo a passo, ser necessrio:


Visual Studio Tools for Office Microsoft Office Excel 2003. Criando o projeto

Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel.

Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome My Security Test. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Security Test projeto para Solution Explorer. Adicionar cdigo para trs a planilha Nesta etapa, voc adicionar uma caixa de mensagem a um evento de inicializao da planilha.

Para adicionar uma caixa de mensagem a um evento de inicializao


1. Verifique se a My Security Test.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido.

Visual C# Consolidado

81

2. 3.

Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo para o Startup mtodo dentro classe Sheet1 para mostrar uma caixa de mensagem durante a inicializao. C#

private void Sheet1_Startup(object sender, System.EventArgs e) { MessageBox.Show("Security settings are correct."); } 4. 5. 6. 7. 8. 9. No menu File, clique em Save All. Na caixa Save Project de dilogo, digite C:\Walkthroughs na caixa Location. Clique em Save. Pressione F5 para executar o projeto. O Excel iniciado e aparecer a caixa de mensagem. Fechar a caixa de mensagem. Feche o Excel.

10. No designer do Visual Studio, localize e selecione na guia para My Security Test.xls. 11. Feche My Security Test.xls (a superfcie do design de planilha Excel) no designer do Visual Studio. Feche todos os instncias do Excel antes de alterar a diretiva de segurana. Quando voc criado o projeto de pasta de trabalho do Excel, o assistente adicionado um novo grupo de cdigo de segurana e um grupo de cdigos filho diretiva de segurana Runtime no nvel do usurio. Em seguida, voc remover o grupo de cdigos que criou o assistente. Remover o grupo de cdigos padro Localize e remova o grupo de cdigo padro que foi criado.

Para remover um grupo de cdigos


1. 2. 3. No Painel de Controle, abra Administrative Tools. Executar Microsoft .NET Framework 2.0 Configuration. No modo de exibio de rvore no lado esquerdo, expanda .NET Framework 2.0 Configuration,, expandir Runtime Security Policy, expandir User, expandir Code Groups, Expandido All_Code e My Computer expanda VSTOProjects. No um GUID para cada projeto tenha criado. Expanda cada GUID para ver o caminho para o documento associado. 4. Clique com o boto direito do mouse o GUID de C:\Walkthroughs\My Security Test\My Security Test\bin\My Security Test.xls grupo de cdigos, e, em seguida clique Delete no menu de atalho. Ser exibida uma caixa de dilogo perguntando se voc tiver certeza que deseja excluir este grupo de cdigos. 5. 6. Clique em Yes. Voltar para Visual Studio, e pressione F5 para executar o projeto meu teste de segurana. Ser exibida informando a atual poltica de segurana .NET permite que no no que a personalizao para executar uma mensagem de erro. 7. Clique em OK.

Visual C# Consolidado

82

8.

Feche o Excel.

O conjunto no pode ser executado se ele no tiver permisso explcita na Diretiva de Segurana Microsoft .NET. Em seguida, conceda permisso para o conjunto usando um nome forte em vez de uma URL para prova. Dando um nome de alta segurana para o conjunto Um nome forte geralmente mais seguro que uma URL como prova. Ser criar e atribuir um nome forte o conjunto nas prximas etapas.

Para criar um nome forte


1. 2. 3. 4. 5. 6. 7. 8. No menu Project no Visual Studio, clique em My Security Test Properties. Clique na Signing guia. Selecione Sign the assembly. No, o Choose a strong name key file list clique New. Na caixa Create Strong Name Key de dilogo, digite SecurityTestKey na caixa Key file name. Desmarque a Protect my key file with a password caixa de seleo. Clique em OK. O arquivo SecurityTestKey.snk de chave aparece no Solution Explorer. No menu Build, clique em Build Solution Para criar o conjunto contra o par de chaves nome forte. Conceder confiana com base no nome de alta segurana Agora adicionar um novo grupo de cdigo para conceder confiana total para o conjunto com base no nome forte.

Para conceder confiana com base em nome forte


1. 2. 3. 4. 5. 6. Abra Microsoft .NET Framework 2.0 Configuration novamente. Clique com o boto direito do mouse no VSTOProjects n e clique New no menu de atalho Digite o nome Security Test Strong Name para o novo grupo de cdigos, e clique em Next. Na lista Choose the condition type for this code group, clique Strong Name. Clique em Import. Procure C:\Walkthroughs\My segurana Test\My segurana Test.dll segurana Test\bin\My para Visual Basic ou C:\Walkthroughs\My segurana Test\My segurana Test.dll segurana Test\bin\debug\My no C#, e clique em Open. Clique em Next. Clique Next para aceitar o FullTrust conjunto de permisses e clique em Finish. Fechar Microsoft .NET Framework 2.0 Configuration. Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se que seu cdigo seja executado quando a pasta de trabalho aberta.

7. 8. 9.

Para testar sua pasta de trabalho Visual C# Consolidado 83

1. 2.

Pressione F5 para executar o projeto. Confirme se a caixa de mensagem aparece.

Passo-a-passo: Ligando uma clula de planilha a um campo de banco de dados


Essa explicao passo a passo demonstra noes bsicas de vinculao um nico campo de dados em um banco de dados do SQL Server a um intervalo nomeado no Microsoft Office Excel 2003. Ele inclui adicionar controles que permitem que voc para percorrer todos os registros da tabela. Durante este explicao passo a passo, voc aprender como:

Criar uma fonte de dados para um projeto do Excel. Adicionar controles a uma planilha. Rolar pelos registros do banco de dados. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Microsoft Visual Studio 2005 Tools for the Microsoft Office System Microsoft Office Excel 2003. Permisses para ler e gravar no banco de dados do SQL Server. Criando um novo projeto

Acesso a um servidor com o Exemplo de SQL Server do Northwind.

Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel.

Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome My Simple Data Binding, usando o Visual Basic ou C#. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Simple Data Binding projeto para Solution Explorer. Criando o DataSet Use a Data Sources janela para adicionar um DataSet digitado ao seu projeto.

Para criar o DataSet


1. Se a Data Sources janela no estiver visvel, clique Show Data Sources no Data menu.

Observao Se Show Data Sources clique dentro a pasta de trabalho do Excel e depois verificar novamente.

Visual C# Consolidado

84

no estiver disponvel, 2. 3. Clique Add New Data Source Para iniciar o Data Source Configuration Wizard. Selecione Database e, em seguida clique em Next.

Selecionar uma conexo de dados ao banco de dados de Exemplo Northwind do SQL Server ou adicionar uma nova conexo com o New Connection boto. 4. 5. 6. 7. 8. Aps uma conexo foi selecionado ou criado, clique em Next. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next. Expanda o Tables n na janela Database objects. Marque a caixa de seleo ao lado da Customers tabela. Clique em Finish.

O assistente adicionar a Customers tabela para a Data Sources janela. Ele tambm adiciona um DataSet digitado ao seu projeto que est visvel no Solution Explorer. Adicionar controles a planilha Para essa explicao passo a passo, voc precisa de dois intervalos nomeados e quatro botes na primeira planilha. Primeiro, adicione os dois intervalos nomeados a partir da Data Sources janela para que automaticamente eles so vinculados fonte de dados. Em seguida, adicione os botes da Toolbox.

Para adicionar dois intervalos nomeados


1. 2. 3. 4. Verifique se a My Simple Data Binding.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. Abra a Data Sources janela e expanda o Customers n. Selecione a CompanyName coluna, e clique na seta suspensa que aparece. Selecione NamedRange na lista drop-down, e arraste a CompanyName coluna clula A1. Um NamedRange controle denominado companyNameNamedRange criado na clula A1. Ao mesmo tempo, nomeado customersBindingSource, um adaptador de tabela, e uma DataSet instncia so adicionados ao projeto. um BindingSource O controle acoplado que por sua vez est vinculado a DataSet instncia. o BindingSource, 5. 6. 7. Selecione a CustomerID coluna na janela Data Sources, e clique na seta suspensa que aparece. Clique NamedRange na lista drop-down, e arraste a CustomerID coluna clula B1. criado na clula B1, e vinculado a outro NamedRange controle chamado customerIDNamedRange o BindingSource. Na guia Common Controls Da adicionar um Button controle a clula A3 da planilha. o Toolbox, nome Button1 este boto. 2. Adicionar mais trs botes s seguintes clulas nesta ordem, para que os nomes so conforme mostrado: (Nome)

Para adicionar quatro botes


1.

Clula

Visual C# Consolidado

85

B3 C3 D3

Button2 Button3 Button4

A prxima etapa para adicionar texto para os botes, e em C# Adicionar manipuladores de eventos. Inicializando as controles Definir o texto do boto e adicionar manipuladores de eventos durante o Startup evento.

Para inicializar os controles


1. 2. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo para o Sheet1_Startup mtodo para definir o texto para cada boto. C# this.button1.Text = "|<"; this.button2.Text = "<"; this.button3.Text = ">"; this.button4.Text = ">|"; 3. Para C# s, adicionar manipuladores de eventos para o boto clique eventos para o Sheet1_Startup mtodo. C# this.button1.Click += new EventHandler(button1_Click); this.button2.Click += new EventHandler(button2_Click); this.button3.Click += new EventHandler(button3_Click); this.button4.Click += new EventHandler(button4_Click); Agora, adicione cdigo para manipular os Click eventos dos botes para que o usurio pode procurar pelos registros. Adicionar cdigo para ativar rolagem atravs dos registros Adicione cdigo ao manipulador Click de eventos de cada boto para percorrer os registros.

Para mover para o primeiro registro

Adicionar um manipulador de eventos para o Click Evento do boto Button1, e adicione o cdigo para mover para o primeiro registro a seguir: C# private void button1_Click(object sender, System.EventArgs e) { this.customersBindingSource.MoveFirst(); }

Para mover para o registro anterior

Adicionar um manipulador de eventos para o Click Evento do boto Button2, e adicione o cdigo a seguir para mover a posio de volta em um: C# private void button2_Click(object sender, System.EventArgs e) { this.customersBindingSource.MovePrevious(); }

Para mover para o prximo registro

Adicionar um manipulador de eventos para o Click Evento do boto Button3, e adicione o cdigo a seguir para avanar a posio em um: C#

Visual C# Consolidado

86

private void button3_Click(object sender, System.EventArgs e) { this.customersBindingSource.MoveNext(); }

Para mover para o ltimo registro

Adicionar um manipulador de eventos para o Click Evento do boto Button4, e adicione o cdigo a seguir para mover para o ltimo registro: C# private void button4_Click(object sender, System.EventArgs e) { this.customersBindingSource.MoveLast(); } Testar o aplicativo

Agora voc pode testar sua pasta de trabalho para certificar-se que voc pode navegar atravs dos registros no banco de dados.

Para testar sua pasta de trabalho


1. 2. 3. 4. Pressione F5 para executar o projeto. Confirme se o primeiro registro aparece nas clulas A1 e B1. Clique em e B1. (Button3) boto e confirme se o registro seguinte aparece na clula A1 a> Clique nos outros botes de rolagem para confirmar que o registro muda conforme o esperado. Prximas etapas Essa explicao passo a passo mostra os fundamentos bsicos do vinculando um intervalo nomeado a um campo em um banco de dados. Aqui esto algumas tarefas que podem vie em seguida:

Cache os dados para que ele possa ser usado off-line. Para obter mais informaes, consulte Como dados de cache para uso off-line ou em um servidor:. Vincular clulas para vrias colunas em uma tabela, em vez da um campo. Para obter mais informaes, consulte Walkthrough: vinculao clulas para vrias colunas em uma tabela. Usar um BindingNavigator controle para percorrer os registros. Para obter mais informaes, consulte COMO: Navegar em dados com o controle BindingNavigator do Windows Forms.

Walkthrough: vinculao clulas para vrias colunas em uma tabela


Essa explicao passo a passo demonstra noes bsicas de vinculao vrias clulas em uma planilha do Microsoft Office Excel 2003 a campos no banco de dados Northwind do SQL Server. Durante este explicao passo a passo, voc aprender como:

Adicionar controles a uma planilha. Salva qualquer alterao de dados de volta para o banco de dados. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio.

Visual C# Consolidado

87

Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:


Microsoft Visual Studio 2005 Tools for the Microsoft Office System Microsoft Office Excel 2003. Permisses para ler e gravar no banco de dados do SQL Server. Criando um novo projeto

Acesso a um servidor com o Exemplo de SQL Server do Northwind.

Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel.

Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome My Complex Data Binding, usando o Visual Basic ou C#. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Complex Data Binding projeto para Solution Explorer. Criando o DataSet

Use a Data Sources janela para adicionar um DataSet digitado ao seu projeto.

Para criar o DataSet


1. Se a Data Sources janela no estiver visvel, clique Show Data Sources no Data menu.

Observao Se Show Data Sources clique dentro a pasta de trabalho do Excel e depois verificar novamente. no estiver disponvel, 2. 3. Clique Add New Data Source Para iniciar o Data Source Configuration Wizard. Selecione Database e, em seguida clique em Next.

Selecionar uma conexo de dados ao banco de dados de Exemplo Northwind do SQL Server ou adicionar uma nova conexo com o New Connection boto. 4. 5. 6. 7. 8. Aps uma conexo foi selecionado ou criado, clique em Next. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next. Expanda o Tables n na janela Database objects. Marque a caixa de seleo ao lado da Employees tabela. Clique em Finish.

O assistente adicionar a Employees tabela para a Data Sources janela. Ele tambm adiciona um DataSet digitado ao seu projeto que est visvel no Solution Explorer. Adicionar controles a planilha Para essa explicao passo a passo, voc precisa um ListObject controle e um Button controle na primeira planilha. Primeiro, adicione o ListObject controle a partir da Data Sources janela para que ela est vinculada automaticamente fonte de dados. Em seguida, adicione o Button controle da Toolbox.

Para adicionar um ListObject Visual C# Consolidado 88

1. 2. 3. 4.

Verifique se a My Complex Data Binding.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. Abra a Data Sources janela e selecione o Employees n. Clique na seta suspensa que aparece. Selecione ListObject na lista drop-down, e arraste a Employees tabela clula A6. Um ListObject controle denominado EmployeesListObject criado na clula A6. Ao mesmo tempo, nomeado EmployeesBindingSource, um adaptador de tabela, e uma DataSet instncia so adicionados ao projeto. um BindingSource O controle acoplado que por sua vez est vinculado a DataSet instncia. o BindingSource,

Para adicionar um boto

Na guia Common Controls Da adicionar um Button controle a clula A4 da planilha. o Toolbox, Inicializao do controle

A prxima etapa para adicionar texto ao boto quando a planilha abre. Adicionar texto ao boto no manipulador Startup de eventos.

Ao inicializar o controle
1. 2. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo para o Sheet1_Startup mtodo para definir o texto para o b utton. C# this.button1.Text = "Save"; 3. C# somente, para adicionar um manipulador de eventos para o Click evento para o

Sheet1_Startup mtodo.
C# this.button1.Click += new EventHandler(button1_Click); Agora, adicione cdigo para manipular o Click Evento do boto. Salvar alteraes no banco de dados As alteraes tenham sido feitas o dados existe somente no dataset local at que eles so salvos explicitamente volta para o banco de dados.

Para salvar as alteraes feitas o banco de dados

Adicionar um manipulador de eventos para o Click evento do b utton, e adicione o cdigo a seguir para confirmar todas as alteraes que foram feitas no dataset volta para o banco de dados: C# private void button1_Click(object sender, EventArgs e) { try { this.employeesTableAdapter.Update(this.northwindDataSet.Employees); } catch (System.Data.DataException ex) { MessageBox.Show(ex.Message); } }

Visual C# Consolidado

89

Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se de que os dados aparecem como esperado, e que voc pode manipular os dados de um objeto lista.

Para testar a vinculao de dados

Pressione F5. Verifique que quando abrir a pasta de trabalho, o objeto lista preenchido com dados da tabela Employees.

Para modificar dados


1. 2. Clique em Clula B7, que deve conter o nome Davolio. Digite o nome Anderson, e pressione ENTER. Clique na clula que contm no cabealho LastName da coluna. Digitar Last Name, incluindo um espao entre as duas palavras, e pressione ENTER. Clique Save na planilha. Feche a pasta de trabalho. Clique em No Quando solicitado a salvar as alteraes feitas. Pressione F5 para executar o projeto novamente. O objeto lista preenchido com dados da tabela Employees. 4. Observe que o nome na clula B7 ainda Anderson, que a alterao de dados que voc feitas e salvas volta para o banco de dados. No cabealho LastName da coluna foi alterado para seu formato original sem nenhum espao, porque no cabealho da coluna no est vinculado ao banco de dados e voc no foi salvar as alteraes feitas para a planilha. Selecione uma clula dentro do objeto lista. Uma nova linha aparece na parte inferior da lista, com um asterisco (*.) na primeira clula da nova linha 2. Adicionar as informaes a seguir na linha vazia: Sobrenome ITO FirstName Shu Ttulo Gerenciador de vendas

Para modificar um cabealho de coluna


1. 2.

Para salvar dados


1. 2. 3.

Para adicionar novas linhas


1.

CdigoDoFuncionrio 10

Para excluir linhas


1. 2. Selecionar linha 16, que deve conter a nova linha que voc adicionou, clicando no nmero 16 no lado esquerdo da planilha. No menu Edit, clique em Delete. Selecione uma clula dentro da lista. Botes de seta aparecem em cada cabealho de coluna. 2. 3. Clique no boto SETA no cabealho da Last Name coluna. Clique em Sort Ascending.

Para classificar as linhas na lista


1.

Visual C# Consolidado

90

As linhas so classificadas em ordem alfabtica por sobrenome.

Para filtrar informaes


1. 2. 3. 4. 5. Selecione uma clula dentro da lista. Clique no boto SETA no cabealho da Title coluna. Clique em Sales Representative. A lista mostra somente as linhas que tm Sales Representative na coluna Title. Clique no boto SETA no cabealho da Title coluna novamente. Clique em (All). Filtragem removida e todas as linhas aparecem. Prximas etapas Essa explicao passo a passo mostra os fundamentos bsicos do vinculando uma tabela em um banco de dados a um objeto de lista. Aqui esto algumas tarefas que podem vie em seguida:

Cache os dados para que ele possa ser usado off-line. Para obter mais informaes, consulte Como dados de cache para uso off-line ou em um servidor:. Implantar a soluo. Para obter mais informaes, consulte Como implantar solues do Office:. Criar uma relao mestre / detalhes entre um campo e uma tabela. Para obter mais informaes, consulte Criando uma relao mestre / detalhes usando um DataSet em cache Walkthrough:.

Criando uma relao mestre / detalhes usando um DataSet em cache Walkthrough:


Essa explicao passo a passo demonstra criar uma relao mestre / detalhes em uma planilha, e cache os dados para que a soluo pode ser usada off-line. Durante este explicao passo a passo, voc aprender como:

Adicionar controles a uma planilha. Configurar um DataSet para ser armazenados em uma planilha. Adicione cdigo para Habilitar rolagem pelos registros. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Microsoft Visual Studio 2005 Tools for the Microsoft Office System Microsoft Office Excel 2003.

Acesso ao Exemplo de SQL Server do Northwind. O banco de dados pode ser no seu computador de desenvolvimento ou em um servidor.

Permisses para ler e gravar no banco de dados do SQL Server.

Visual C# Consolidado

91

Criando um novo projeto Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel.

Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome My Master-Detail, usando o Visual Basic ou C#. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My MasterDetail projeto para Solution Explorer. Criando o DataSet Use a Data Sources janela para adicionar um DataSet digitado ao seu projeto.

Para criar o DataSet


1. 2. 3. Se a Data Sources janela no estiver visvel, clique Show Data Sources no Data menu. Clique Add New Data Source Para iniciar o Data Source Configuration Wizard. Selecione Database e, em seguida clique em Next.

Selecionar uma conexo de dados ao banco de dados de Exemplo Northwind do SQL Server ou adicionar uma nova conexo usando o New Connection boto. 4. 5. 6. 7. 8. Aps selecionar ou criar uma conexo, clique em Next. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next. Expanda o Tables n na janela Database objects. Selecione a Orders tabela e a Order Details tabela. Clique em Finish.

O assistente adicionar as duas tabelas para a Data Sources janela. Ele tambm adiciona um DataSet digitado ao seu projeto que est visvel no Solution Explorer. Adicionar controles a planilha Nesta etapa, voc adicionar um intervalo nomeado, um objeto de lista, e dois botes primeira planilha. Primeiro, adicionar o intervalo nomeado e o objeto lista a partir da Data Sources janela para que automaticamente eles so vinculados fonte de dados. Em seguida, adicione os botes da Toolbox.

Para adicionar um intervalo nomeado e um objeto de lista


1. 2. 3. 4. Verifique se a My Master-Detail.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. Abra a Data Sources janela e expanda o Orders n. Selecione a OrderID coluna, e clique na seta suspensa que aparece. Clique NamedRange na lista drop-down, e arraste a OrderID coluna clula A2. Um NamedRange controle denominado OrderIDNamedRange criado na clula A2. Ao mesmo tempo, nomeado OrdersBindingSource, um adaptador de tabela, e uma DataSet instncia so adicionados ao projeto. um BindingSource O controle acoplado que por sua vez est vinculado a DataSet instncia. o BindingSource, 5. Role para baixo aps as colunas que esto sob a Orders tabela. Na parte inferior da lista a Order Details tabela; ele aqui porque ele um filho da Orders tabela. Selecionar

Visual C# Consolidado

92

esta Order Details Tabela, no a um que seja no mesmo nvel como a Orders Tabela, e clique a seta suspensa que aparece. 6. 7. Clique ListObject na lista drop-down, e arraste a Order Details tabela clula A6. Um ListObject controle denominado Order_DetailsListObject criado na clula A6, e vinculado BindingSource. Na guia Common Controls Da adicionar um Button controle a clula A3 da planilha. o Toolbox, nome Button1 este boto. 2. Adicionar um outro Button controle a clula B3 da planilha. nome Button2 este boto. Em seguida, marcar DataSet para ser armazenado em cache no documento. Cache o DataSet Marcar DataSet para ser armazenado em cache no documento, tornar DataSet pblicos e definindo a CacheInDocument propriedade.

Para adicionar dois botes


1.

Armazenar em cache DataSet


1. 2. 3. Selecione NorthwindDataSet No bandeja de componentes. Na janela Properties, alterar a Modifiers propriedade para Public. DataSets dever ser pblica antes cache est ativado. Alterar a CacheInDocument propriedade para True. A prxima etapa para adicionar texto a botes, e no C# adicione cdigo para ligar os manipuladores de eventos. Inicializando as controles Definir o texto do boto e adicionar manipuladores de eventos durante o Startup evento.

Ao inicializar os dados e os controles


1. 2. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo para o Sheet1_Startup mtodo para definir o texto para os botes. C# this.button1.Text = "<"; this.button2.Text = ">"; 3. Para C# s, adicionar manipuladores de eventos para o boto clique eventos para o Sheet1_Startup mtodo. C# this.button1.Click += new EventHandler(button1_Click); this.button2.Click += new EventHandler(button2_Click); Adicionar cdigo para ativar rolagem atravs dos registros Adicione cdigo ao manipulador Click de eventos de cada boto para percorrer os registros.

Para percorrer os registros


1. Adicionar um manipulador de eventos para o Click evento de Button1, e adicione o cdigo a seguir para percorrer os registros para trs:

Visual C# Consolidado

93

C# private void button1_Click(object sender, EventArgs e) { this.ordersBindingSource.MovePrevious(); } 2. Adicionar um manipulador de eventos para o Click evento de Button2, e adicione o cdigo a seguir para avanar pelos registros: C# private void button2_Click(object sender, EventArgs e) { this.ordersBindingSource.MoveNext(); } Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se de que os dados aparecem como esperado, e que voc pode usar a soluo off-line.

Para testar o cache de dados


1. 2. 3. 4. 5. Pressione F5. Verifique que o intervalo nomeado e o objeto lista so preenchidos com dados da fonte de dados. Rolar pelos alguns dos registros clicando nos botes. Pasta de trabalho, salve e feche a pasta de trabalho e Visual Studio. Desativar a conexo ao banco de dados. Desconecte o cabo de rede do seu computador se o banco de dados estiver localizado em um servidor, ou parar o servio SQL Server se o banco de dados for no seu computador de desenvolvimento. Abra o Excel, e abra My Master-Detail.xls a partir do diretrio \bin (\My Detail\bin mestre-no Visual Basic) ou \My Detail\bin\debug mestre-em C#. Rolar pelos alguns dos registros para ver que a planilha opera normalmente quando desconectado. Reconectar-se ao banco de dados. Conectar-se seu computador rede novamente se o banco de dados estiver localizado em um servidor, ou inicia o servio SQL Server se o banco de dados for no seu computador de desenvolvimento. Prximas etapas Essa explicao passo a passo mostra as noes bsicas de criar uma relao mestre / detalhes de dados em uma planilha e cache um DataSet. Aqui esto algumas tarefas que podem vie em seguida:

6. 7. 8.

Implantar a soluo. Para obter mais informaes, consulte Como implantar solues do Office:. Recuperar dados de cache para outro projeto. Para obter mais informaes, consulte Como recuperar dados de uma pasta de trabalho em um servidor em cache:.

Walkthrough: atualizando um grfico em uma planilha usando botes de opo


Essa explicao passo a passo mostra os fundamentos bsicos do alterando estilos do grfico usando botes de opo em um planilha do Microsoft Office Excel 2003. Para ver o resultado como uma amostra completa, consulte Exemplo do Excel de controles. Durante este explicao passo a passo, voc aprender como:

Adicionar um controle de usurio para uma planilha.

Visual C# Consolidado

94

Alterar o estilo do grfico quando uma opo est selecionada. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Microsoft Visual Studio 2005 Tools for the Microsoft Office System Microsoft Office Excel 2003. Adicionar um grfico a uma planilha

Voc pode criar um projeto de pasta de trabalho do Excel usando uma pasta de trabalho existente. Nessa explicao passo a passo, ir adicionar um grfico pasta de trabalho e Usar pasta de trabalho no Excel uma nova soluo. A fonte de dados nessa explicao passo a passo uma planilha chamada Data for Chart.

Para adicionar os dados


1. 2. 3. 4. Abra o Excel 2003. Abre uma nova pasta de trabalho. Clique com o boto direito do mouse na Sheet3 guia e, em seguida clique Rename no menu de atalho. Renomear a planilha para Data for Chart. Adicionar dados Data for Chart Os seguir com clula A4 sendo a parte superior esquerda E8 Canto, e o canto inferior direito: Q1 Oeste Leste Norte Sul 500 600 450 800 Q2 550 625 470 750 Q3 550 675 490 775 Q4 600 700 510 790

Em seguida, adicione o grfico para a primeira planilha.

Para adicionar um grfico


1. 2. 3. 4. 5. 6. No menu Insert, clique em Chart. O Chart Wizard abre. Clique em Next, deixando os padres selecionados. Clique na caixa Data Range e desmarque qualquer seleo padro. Na planilha Data for Chart, selecionar o bloco de clulas que contm os nmeros, que inclui A4 no canto esquerdo superior para E8 no canto direito inferior. Para aceitar todos os padres para Step 3, clique Next em Next novamente. No Step 4, garantir que As object in: est selecionado.

Visual C# Consolidado

95

7. 8. 9.

Na lista As object in:, selecione Sheet1. Clique em Finish. Reposicionar o grfico para que o canto direito superior alinhe com Clula E2.

10. Salve o arquivo para a unidade C: e nome-la ExcelChart.xls. 11. Feche o Excel. Criando um novo projeto Nesta etapa, voc ir criar um projeto usando Visual Studio Tools for Office pasta de trabalho do Excel.

Para criar um novo projeto


1. Criar um projeto de pasta de trabalho do Excel com o nome My Excel Chart. Verifique que Copy an existing document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Clique no Browse boto e v para a pasta de trabalho que voc criou anteriormente nessa explicao passo a passo. Clique em OK. O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Excel Chart projeto para Solution Explorer. Definindo Propriedades do grfico Quando voc criar um novo projeto pasta de trabalho do Excel usando uma pasta de trabalho existente, controles host automaticamente so criados para intervalos nomeados, objetos lista, e grficos que existem dentro da pasta de trabalho. Voc pode alterar o nome do controle Chart usando a Properties janela

2. 3.

Para alterar o nome do controle grfico

Selecione o Chart controle no designer e alterar as seguintes propriedades na janela Properties: Value (Valor) dataChart False

Propriedade Name HasLegend

Adicionar um controle de usurio ao projeto

Para adicionar um controle de usurio


1. 2. 3. Selecione o My Excel Chart projeto no Solution Explorer. No menu Project, clique em Add New Item. Na caixa Add New Item de dilogo, clique User Control, nome do controle ChartOptions, e clique em Add Se o controle de usurio estiver no visvel no designer, clique duas vezes em ChartOptions no Solution Explorer. Na guia Common Controls Da arraste um Radio Button controle para o controle de usurio, e alterar as seguintes propriedades: o Toolbox, Value (Valor)

Para adicionar controles Windows Form ao controle de usurio


1. 2.

Propriedade

Visual C# Consolidado

96

Name Text 3.

columnChart Grfico de coluna Adicionar um boto de opo segundo para o controle de usurio, e alterar as propriedades a seguir: Value (Valor) barChart Grfico de barras Adicionar um boto de opo terceiro para o controle de usurio, e alterar as propriedades a seguir: Value (Valor) lineChart Grfico de linha Adicionar um boto de opo quarto para o controle de usurio, e alterar as propriedades a seguir: Value (Valor) areaBlockChart Grfico bloquear de rea

Propriedade Name Text 4.

Propriedade Name Text 5.

Propriedade Name Text

Em seguida, escreva o cdigo para atualizar o grfico quando um boto de opo clicado. Alterar o grfico estilo quando um boto de opo selecionada Nesta seo, voc ser criar um evento pblico sobre o controle de usurio, adicionar uma propriedade para definir o tipo de seleo, e criar um manipulador de eventos para o CheckedChanged evento de cada um dos botes de opo.

Para criar um evento e propriedade em um controle de usurio


1. 2. No Solution Explorer, clique com o boto direito do mouse no controle de usurio e selecione View Code. Adicione cdigo para criar um SelectionChanged evento e a Selection propriedade para a

ChartOptions classe:
C# public event EventHandler SelectionChanged; private Microsoft.Office.Interop.Excel.XlChartType selectedType = Microsoft.Office.Interop.Excel.XlChartType.xlColumnClustered; public Microsoft.Office.Interop.Excel.XlChartType Selection { get { return this.selectedType; } set { this.selectedType = value; } }

Para manipular o evento CheckedChanged dos botes de opo

Visual C# Consolidado

97

1.

Definir o tipo de grfico no manipulador CheckedChanged de eventos de boto areaBlockChart de opo e depois gerar o evento. C#

private void areaBlockChart_CheckedChanged(object sender, EventArgs e) { if (((RadioButton)sender).Checked) { this.selectedType = Microsoft.Office.Interop.Excel.XlChartType.xlAreaStacked; if (this.SelectionChanged != null) { this.SelectionChanged(this, EventArgs.Empty); } } } 2. Definir o tipo de grfico no manipulador CheckedChanged de eventos do boto barChart de opo. C# private void barChart_CheckedChanged(object sender, EventArgs e) { if (((RadioButton)sender).Checked) { this.selectedType = Microsoft.Office.Interop.Excel.XlChartType.xlBarClustered; if (this.SelectionChanged != null) { this.SelectionChanged(this, EventArgs.Empty); } } } 3. Definir o tipo de grfico no manipulador CheckedChanged de eventos do boto columnChart de opo. C# private void columnChart_CheckedChanged(object sender, EventArgs e) { if (((RadioButton)sender).Checked) { this.selectedType = Microsoft.Office.Interop.Excel.XlChartType.xlColumnClustered; if (this.SelectionChanged != null) { this.SelectionChanged(this, EventArgs.Empty); } } } 4. Definir o tipo de grfico no manipulador CheckedChanged de eventos do boto lineChart de opo. C# private void lineChart_CheckedChanged(object sender, EventArgs e) { if (((RadioButton)sender).Checked) { this.selectedType = Microsoft.Office.Interop.Excel.XlChartType.xlLineMarkers; if (this.SelectionChanged != null) { this.SelectionChanged(this, EventArgs.Empty); } } } 5. Em C#, voc deve adicionar manipuladores de eventos para os botes de opo. Adicione o cdigo para o ChartOptions Construtor, sob a chamada para InitializeComponent, conforme mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C# public ChartOptions() { InitializeComponent(); areaBlockChart.CheckedChanged += new EventHandler(areaBlockChart_CheckedChanged); barChart.CheckedChanged += new EventHandler(barChart_CheckedChanged); columnChart.CheckedChanged += new EventHandler(columnChart_CheckedChanged); lineChart.CheckedChanged += new EventHandler(lineChart_CheckedChanged); } Adicionar o controle de usurio a planilha Quando voc cria a soluo, o novo controle de usurio automaticamente adicionado Toolbox. Voc pode, ento, arrastar o controle da Toolbox. para seu Worksheet

Para adicionar o controle do usurio sua planilha


1. 2. No menu Build, clique em Build Solution. O ChartOptions controle de usurio adicionado Toolbox. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs. e selecione View Designer

Visual C# Consolidado

98

3.

Do Toolbox arraste o ChartOptions controle de para a planilha. Um novo controle chamado ChartOptions1 adicionado ao seu projeto. Alterar o tipo de grfico

Nesta seo, criar um manipulador de eventos para alterar o tipo de grfico acordo para a opo selecionada no controle de usurio.

Para alterar o tipo de grfico que exibido na planilha


1. Adicionar o manipulador de eventos a seguir para a Sheet1 classe. C# private void ChartOptions1_SelectionChanged(object sender, EventArgs e) { try { dataChart.ChartType = this.ChartOptions1.Selection; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } 2. Em C#, adicione um manipulador de eventos para o controle de usurio para o Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C# this.ChartOptions1.SelectionChanged += new EventHandler(ChartOptions1_SelectionChanged); Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se que o grfico tiver estilo corretamente quando voc seleciona um boto de opo.

Para testar sua pasta de trabalho


1. 2. 3. Pressione F5 para executar o projeto. Selecione vrios botes de opo. Confirme que o estilo do grfico altera para correspondem seleo. Prximas etapas Essa explicao passo a passo mostra noes bsicas sobre como usar botes de opo e estilos do grfico nas planilhas do Excel 2003. Aqui esto algumas tarefas que podem vie em seguida:

Implantando o projeto. Para obter mais informaes, consulte Como implantar solues do Office:. Usando um boto para preencher uma caixa de texto. Para obter mais informaes, consulte Exibindo texto em uma caixa de texto em uma planilha usando um boto Walkthrough:. Alterar a formatao em uma planilha usando caixas de seleo. Para obter mais informaes, consulte Alterando planilha formatao usando controles CheckBox Walkthrough:.

Vinculao de Dados para controles em um painel Aes do Excel Walkthrough:


Essa explicao passo a passo demonstra vinculao de dados a controles em um painel Aes no Microsoft Office Excel 2003. Os controles demonstram uma Relao mestre / detalhes entre tabelas em um banco de dados do SQL Server. Durante este explicao passo a passo, voc aprender como:

Visual C# Consolidado

99

Adicionar controles a uma planilha. Criar um controle painel Aes. Adicionar controles Windows Forms ligados a dados a um controle painel Aes. Mostrar painel de aes quando abre o aplicativo. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Microsoft Visual Studio 2005 Tools for the Microsoft Office System Microsoft Office Excel 2003. Permisses para ler e gravar no banco de dados do SQL Server. Criando o projeto

Acesso a um servidor com o Exemplo de SQL Server do Northwind.

A primeira etapa para criar um projeto de pasta de trabalho do Excel.

Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome My Excel Actions Pane. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Excel Actions Pane projeto para Solution Explorer. Adicionar uma nova fonte de dados ao projeto

Para adicionar uma nova fonte de dados para o projeto


1. Se a Data Sources janela no estiver visvel, clique Show Data Sources no Data menu.

Observao Se Show Data Sources clique dentro na planilha do Excel e depois verificar novamente. no estiver disponvel, 2. 3. Clique Add New Data Source Para iniciar o Data Source Configuration Wizard. Selecione Database e, em seguida clique em Next.

Selecionar uma conexo de dados ao banco de dados de Exemplo Northwind do SQL Server ou adicionar uma nova conexo com o New Connection boto. 4. 5. 6. Clique em Next. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next. Expanda o Tables n na janela Database objects.

Visual C# Consolidado

100

7. 8. 9.

Marque a caixa de seleo ao lado da Suppliers tabela. Expandir a Products tabela e selecione ProductName, SupplierID, QuantityPerUnit. e UnitPrice Clique em Finish.

O assistente adiciona a Suppliers tabela e Products Tabela janela Data Sources. Ele tambm adiciona um DataSet digitado ao seu projeto que est visvel no Solution Explorer. Adicionar controles a planilha Em seguida, adicione um NamedRange controle e um ListObject controle primeira planilha.

Para adicionar um NamedRange e um controle ListObject


1. 2. 3. 4. Verifique se a My Excel Actions Pane.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. Na janela Data Sources , expanda a Suppliers tabela. Clique na seta suspensa no n Company Name, e selecione NamedRange. Arraste Company Name a partir da Data Sources janela para na Sheet1 Clula A2. Um NamedRange controle denominado CompanyNameNamedRange criado, e o <CompanyName> de texto aparece na clula A2. Ao mesmo tempo, nomeado suppliersBindingSource, um adaptador de tabela, e um DataSet so adicionados ao projeto. um BindingSource O controle acoplado que por sua vez est vinculado a DataSet instncia. o BindingSource, 5. Na janela Data Sources, role para baixo aps as colunas que esto sob a Suppliers tabela. Na parte inferior da lista a Products tabela; ele aqui porque ele um filho da Suppliers tabela. Selecionar esta Products Tabela, no a um que seja no mesmo nvel como a Suppliers Tabela, e clique a seta suspensa que aparece. Clique ListObject na lista drop-down, e arraste a Products tabela para clulas A6 em Sheet1. Um ListObject controle denominado ProductNameListObject criado na clula A6. Ao mesmo tempo, e um adaptador de tabela so adicionados ao projeto. nomeado productsBindingSource, um BindingSource O controle acoplado que por sua vez est vinculado a DataSet instncia. o BindingSource, 7. No C# somente, selecione suppliersBindingSource No bandeja de componentes, e alterar a Modifiers propriedade para Internal na janela Properties. Adicionar controles ao painel de aes Em seguida, voc precisa um controle painel Aes que contenha uma caixa de combinao.

6.

Para adicionar um controle painel Aes


1. 2. 3. Selecione o My Excel Actions Pane projeto no Solution Explorer. No menu Project, selecione Add New Item. Na caixa Add New Item de dilogo, selecione Actions Pane Control, nome-la ActionsControl e clique em Add

Para adicionar controles Windows Forms ligados a dados a um controle painel Aes
1. Das Common Controls guias da Toolbox, arraste um ComboBox controle para o controle painel Aes.

Visual C# Consolidado

101

2. 3.

Alterar a Size propriedade para 171, 21. Redimensionar o controle de usurio para ajustar os controles. Vinculando o controle no painel Aes a dados

Neste seo, voc ser definir a fonte de dados de mesma fonte de dados como o NamedRange controle em uma planilha.. com a mesma fonte de dados que o NamedRange controle em uma planilha o ComboBox o ComboBox

Para definir propriedades de vinculao de dados do controle


1. 2. Clique com o boto direito do mouse no controle painel Aes e selecione View Code a partir do menu de atalho Adicione o seguinte cdigo ao evento Load do controle painel Aes: C# private void ActionsControl_Load(object sender, EventArgs e) { this.comboBox1.DataSource = Globals.Sheet1.suppliersBindingSource; this.comboBox1.DisplayMember = "CompanyName"; } 3. Em C#, voc deve criar um manipulador de eventos para o ActionsControl. Voc pode colocar este cdigo no construtor ActionsControl como mostrado abaixo. Para obter mais informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C# public ActionsControl() { InitializeComponent(); this.Load += new EventHandler(ActionsControl_Load); } Mostrando o Painel de Aes Voc nesta seo, vai escrever cdigo para mostrar o painel Aes. O painel Actions ficar visvel depois controles so adicionados a ele.

Para mostrar o painel Aes


1. 2. Clique com o boto direito do mouse ThisWorkbook.vb no Solution Explorer, ou ThisWorkbook.cs,. e, em seguida clique View Code no menu de atalho Criar uma nova instncia do controle do usurio na classe ThisWorkbook, da seguinte maneira: C# ActionsControl actions = new ActionsControl(); No manipulador Startup de eventos de ThisWorkbook, adicione cdigo de forma que ele tenha como no Exemplo a seguir: C# private void ThisWorkbook_Startup(object sender, System.EventArgs e) { this.ActionsPane.Controls.Add(actions); } Testar o aplicativo Agora voc pode testar seu documento para verificar o painel Aes que aberto quando o documento for aberto. Voc testar para a relao mestre / detalhes entre os controles no painel de aes e os controles da planilha.

Para testar seu documento


1. 2. Pressione F5 para executar o projeto. Confirme se o painel Actions est visvel.

Visual C# Consolidado

102

3.

Selecione uma empresa na caixa Lista. Verifique se o nome da empresa est listado no controle NamedRange e se os detalhes do produto esto listados no ListObject controle. Selecione vrias empresas para verificar o nome da empresa e Detalhes do Produto altere conforme apropriado. Prximas etapas

4.

Essa explicao passo a passo mostra as noes bsicas de vinculao de dados a controles em um painel Aes no Excel. Aqui esto algumas tarefas que podem vie em seguida:

Implantando o projeto. Para obter mais informaes, consulte Como implantar solues do Office:. Ligao de dados a controles no Word. Para obter mais informaes, consulte Vinculao de Dados para controles em um painel Aes do Word Walkthrough:. Mostrar e ocultar controles no painel de aes. Para obter mais informaes, consulte Alterando o painel de aes de acordo com contexto do usurio Walkthrough:

Implantando um Word ou Solution do Excel usando um manifesto Deployment Walkthrough:


Essa explicao passo a passo demonstra como implantar uma soluo o Microsoft Office Excel ou Microsoft Office Word em um compartilhamento de rede em um servidor. Ser posicionado no final do explicao passo a passo, o possvel para executar a soluo no servidor do seu computador de desenvolvimento. Em um ambiente de produo, uma Microsoft Visual Studio 2005 Tools for the Microsoft Office System soluo geralmente publicada primeiro a um servidor de teste, e depois ele reimplantado em um servidor de produo depois que o departamento de TI aprovar-. Voc nessa explicao passo a passo, ser emular esse processo, publicando uma soluo em um local temporrio no seu computador de desenvolvimento, e ento redeploying a soluo do local de publicao para um servidor. Para obter mais informaes sobre as opes para implantar a soluo, consulte Modelos de implantao. Durante este explicao passo a passo, voc aprender como:

Do Publish Wizard uso para publicar sua soluo em um local no seu computador de desenvolvimento. Manualmente relanamento a soluo do seu computador local para um compartilhamento de rede em um servidor. Modificar o manifesto do aplicativo que est incorporado no documento para apontar para o novo local manifesto de implantao programaticamente. Editar a manifesto de implantao para apontar para a nova localizao do manifesto do aplicativo externos. Editar o manifesto do aplicativo externo para apontar para o novo local do conjunto e a manifesto de implantao. Pr-requisitos

Para concluir esta explicao passo a passo, ser necessrio:


Visual Studio Tools for Office O Word Microsoft Office 2003 ou Microsoft Office Excel 2003. Observao

Visual C# Consolidado

103

Essa explicao passo a passo pressupe que voc estiver implantando uma soluo Word. Se voc quiser executar explicao passo a passo com uma soluo Excel, o substitua o nome do projeto do Word com o nome do seu projeto do Excel em todos os cdigos e exemplos XML.

Acesso a um servidor de rede para implantao. Essa explicao passo a passo pressupe que voc so redeploying sua soluo para o \\DeployServer\ShareFolder compartilhamento de rede. Privilgios de administrador no computador de desenvolvimento, para que voc possa definir a diretiva de segurana para um local de rede. Criando o projeto

Nesta etapa, voc ir criar um projeto Documento do Word.

Para criar um novo projeto

Criar um projeto Documento do Word com o nome WordDeployment. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

Abre o novo documento do Word no designer e adiciona o WordDeployment projeto para Solution Explorer o Visual Studio. Adicionar cdigo para trs o documento Nesta etapa, voc adicionar uma caixa de mensagem ao manipulador Startup de eventos do documento. Isso permitir que voc para verificar se a soluo est funcionando quando voc abre o documento rapidamente.

Para adicionar uma caixa de mensagem a um evento de inicializao


1. 2. Clique com o boto direito do mouse ThisDocument.vb no Solution Explorer, ou ThisDocument.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo ao manipulador Startup de eventos dentro a ThisDocument classe para mostrar uma caixa de mensagem durante a inicializao. C# private void ThisDocument_Startup(object sender, System.EventArgs e) { MessageBox.Show("The document is deployed correctly."); } 3. 4. 5. Pressione F5 para executar o projeto. Inicia o Word e a caixa de mensagem aparece. Fechar a caixa de mensagem. Sair do Word. Publicando a soluo Nesta etapa, voc publicar a soluo em um local temporrio no computador local.

Em seguida, voc publicar nesta soluo.

Para publicar a soluo


1. 2. 3. 4. Clique com o boto direito do mouse o n de projeto no Solution Explorer. Clique Publish no menu de atalho. O Publish Wizard aparece. Na caixa Specify the location to publish this application, digite C:\TestDeploy. Clique em Finish.

Visual C# Consolidado

104

O documento de Soluo e manifesto de implantao so copiados para C:\TestDeploy. O conjunto de soluo, atualizado manifesto do aplicativo, e cpias do documento de Soluo e manifesto de implantao so copiadas para C:\TestDeploy\WordDeployment_1.0.0.0. Para obter mais informaes, consulte Implantando o Word e Excel Solutions. 5. Feche o WordDeployment projeto no Visual Studio.

Observao O conjunto no tem permisso para executar ainda, para que ele se voc tentar executar a soluo ser lanar um erro. Voc ir atualizar sua diretiva de segurana para conceder permisso de confiana total ao conjunto em uma etapa posterior. Quando voc publicar uma soluo, o manifesto do aplicativo incorporado no aponta de documento de soluo para o caminho completo da manifesto de implantao. Se voc relanamento os arquivos de soluo para outro local, dever atualizar o manifesto do aplicativo incorporado para apontar para a nova localizao da manifesto de implantao. Voc tambm deve atualizar a manifesto de implantao e o manifesto do aplicativo externo para apontar para os novos locais de arquivo. Atualizando o manifesto Application incorporados Para editar o manifesto do aplicativo incorporado, use a ServerDocument classe que Visual Studio Tools for Office fornece. Quando voc usa a ServerDocument classe, voc deve executar o cdigo em um novo projeto (no a Visual Studio Tools for Office Soluo), como um projeto de console, e o Visual Studio Tools for Office documento de soluo deve ser fechado. Observao Inclui Visual Studio Tools for Office um Exemplo que demonstre como criar uma ferramenta que pode ser usada para editar o manifesto do aplicativo incorporado. Para obter mais informaes, consulte Aplicativo Manifest Exemplo Editor.

Para atualizar o manifesto do aplicativo incorporado


1. 2. 3. Criar um novo projeto Console Application. Do Microsoft.VisualStudio.Tools.Applications.Runtime Adicionar referncias para e System.Windows.Forms montagens para este projeto. Abra o arquivo Program.cs ou Module1.vb, e adicione a seguinte Imports ou using instruo para o topo do arquivo. C# using Microsoft.VisualStudio.Tools.Applications.Runtime; 4. Copie o cdigo a seguir para a Main funo. Este cdigo cria uma ServerDocument que fornece acesso ao manifesto do aplicativo incorporado de seu documento de soluo. O cdigo atribui o novo caminho manifesto de implantao para a DeployManifestPath propriedade, e salva e fecha o ServerDocument.. o ServerDocument C# ServerDocument sd = null; try { sd = new ServerDocument(@"C:\TestDeploy\WordDeployment.doc"); sd.AppManifest.DeployManifestPath = @"\\DeployServer\ShareFolder\WordDeployment.application"; sd.Save(); } finally { if (sd != null) { sd.Close(); } } 5. Pressione F5 para executar o projeto.

Visual C# Consolidado

105

Uma janela do console aparece rapidamente enquanto o manifesto do aplicativo incorporado est sendo atualizado, e fecha a janela do console. Atualizando o manifesto de implantao Agora que voc atualizou o manifesto do aplicativo incorporado no documento Visual Studio Tools for Office de soluo, voc deve atualizar a manifesto de implantao para apontar para a nova localizao do manifesto do aplicativo externos.

Para atualizar a manifesto de implantao


1. Abra a manifesto de implantao em um editor de texto, como o Bloco de notas. A manifesto de implantao denominado WordDeployment.application, e est localizado na pasta C:\TestDeploy de publicao. Defina o codebase atributo do elemento <dependentAssembly> como o caminho completo da localizao implantao final do manifesto do aplicativo externos. Para obter mais informaes, consulte &lt;dependentAssembly&gt; Element (Visual Studio Tools for Office Reference).O atributo para essa explicao passo a passo deve aspecto como este: <dependentAssembly codebase="\\DeployServer\ShareFolder\ WordDeployment_1.0.0.0\WordDeployment.dll.manifest" 3. Salve e feche o arquivo manifesto de implantao. Atualizando o manifesto de aplicativos externos Alm disso, para atualizar a manifesto de implantao, voc tambm deve editar o manifesto do aplicativo externo para apontar para os locais implantao final do conjunto de soluo e a manifesto de implantao. Sempre que voc publicar uma Visual Studio Tools for Office soluo, um novo manifesto do aplicativo externo gerado que aponta para a verso atual do conjunto de soluo.

2.

Para atualizar o manifesto do aplicativo externo


1. Abra o manifesto do aplicativo em um editor de texto, como o Bloco de notas. O manifesto do aplicativo denominado WordDeployment.dll.manifest, e est localizado na pasta C:\TestDeploy\WordDeployment_1.0.0.0 de publicao. Localize o <installFrom> elemento que est o filho do elemento <dependency>, e defina o codebase atributo como o caminho completo da montagem de soluo atual. Para obter mais informaes, consulte <installFrom> Element (Visual Studio Tools for Office Reference).O atributo para essa explicao passo a passo deve aspecto como este: <dependentAssembly codebase="\\DeployServer\ShareFolder\ WordDeployment_1.0.0.0\WordDeployment.dll" 3. Localize o <installFrom> elemento que est o filho do elemento <assembly>, e defina o codebase atributo para o caminho completo do manifesto de implantao. Para obter mais informaes, consulte <installFrom> Element (Visual Studio Tools for Office Reference).O atributo para essa explicao passo a passo deve aspecto como este: <dependentAssembly codebase="\\DeployServer\ShareFolder\WordDeployment.application" 4. Salve e feche o arquivo manifesto do aplicativo. Copiando os arquivos da soluo para o servidor Agora que voc tiver editado os manifestos, voc est pronto para copiar os arquivos de soluo para o servidor.

2.

Para copiar os arquivos de soluo para o servidor


1. Crie uma WordDeployment_1.0.0.0 pasta sob a \\DeployServer\ShareFolder compartilhamento de arquivos de rede.

Visual C# Consolidado

106

2. 3.

Copiar o documento de Soluo e a manifesto de implantao para \\DeployServer\ShareFolder. Copiar o conjunto de soluo e o manifesto do aplicativo para \\DeployServer\ShareFolder\WordDeployment_1.0.0.0. Conceder confiana total para a pasta de rede

Para execute sua Visual Studio Tools for Office soluo a partir da pasta de rede, voc deve conceder confiana total para a pasta de rede na sua diretiva de segurana no computador de desenvolvimento. Voc pode modificar a diretiva de segurana de um prompt de comando usando a ferramenta Diretiva de Segurana para Acesso ao Cdigo (Caspol.exe). Para conceder confiana para um local de rede, voc deve ter privilgios de administrador e voc dever alterar a diretiva de segurana no nvel do computador. Observao Este procedimento destinado a fim de executar essa explicao passo a passo. No use este procedimento para conceder confiana a conjuntos ou diretrios se no tiver certeza que sejam segura e protegida. Para obter mais informaes sobre concesso e remover permisses, consulte HOW TO: conceder permisses para pastas e montagens e Como remover permisses de pastas e montagens:.

Para conceder confiana total para a pasta de rede

Digite o seguinte comando no prompt de comando Studio visual: caspol -m -ag LocalIntranet_Zone -url \\DeployServer\ShareFolder\* FullTrust -n "Remote Deployment" -d "Deployment Walkthrough" Testando a soluo

Agora voc pode testar sua soluo para certificar-se que seu cdigo seja executado quando voc abre o documento a partir do computador de desenvolvimento.

Para testar a implantao


1. 2. No computador de desenvolvimento, abra o WordDeployment.doc arquivo no \\DeployServer\ShareFolder\. Confirme se a caixa de mensagem aparece. Prximas etapas Voc tambm pode implantar a soluo usando um arquivo do Microsoft Windows Installer (.msi). Para obter mais informaes, consulte Implantando um Word ou Solution do Excel usando um arquivo do Windows Installer Walkthrough:.

Implantando um Word ou Solution do Excel usando um arquivo do Windows Installer Walkthrough:


Essa explicao passo a passo demonstra como criar um arquivo do Microsoft Windows Installer (.msi) que pode ser usado para implantar uma soluo Microsoft Office Excel 2003 ou Microsoft Office Word 2003. Durante este explicao passo a passo, voc aprender como:

Criar um projeto de instalao que voc pode usar para criar um arquivo do Windows Installer. Modifique o projeto de instalao para que o arquivo Windows Installer instala sua Microsoft Visual Studio 2005 Tools for the Microsoft Office System soluo.

Visual C# Consolidado

107

Adicionar uma etapa para o projeto de instalao para que Arquivo do Windows Installer edita o manifesto do aplicativo incorporados no Visual Studio Tools for Office documento de soluo.

Essa explicao passo a passo pressupe que o computador de destino j tiver os pr-requisitos instalados para executar Visual Studio Tools for Office solues. Voc cria o arquivo Windows Installer no o verificar ou instalar esses pr-requisitos. Para obter mais informaes sobre os prrequisitos para executar Visual Studio Tools for Office solues, consulte Como se preparar computadores de usurio final para executar solues do Office:. Observao Conjuntos em Visual Studio Tools for Office Solues devem ser concede confiana total na diretiva de segurana do usurio final antes da soluo seja executado. O arquivo Windows Installer voc criar nessa explicao passo a passo no No implantar a diretiva de segurana necessrio para executar a soluo. Para obter mais informaes sobre segurana em Visual Studio Tools for Office solues, consulte Requisitos de segurana para executar solues do Office e Prticas recomendadas para segurana no Office Solutions. Para obter informaes sobre como configurar a diretiva de segurana por usurio final computadores, consulte Implantao de diretiva de segurana. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Visual Studio Tools for Office O Word Microsoft Office 2003 ou Microsoft Office Excel 2003. Observao Essa explicao passo a passo inclui etapas para criar uma soluo simples que voc pode usar em explicao passo a passo o Excel. Se voc deseja executar o explicao passo a passo com uma soluo Word ou Excel existente, comearo o explicao passo a passo no ttulo criando o Project a instalao, " " e certifique-se substituir o nome ExcelDeployment do projeto com o nome do seu projeto em todos os exemplos de cdigo e instrues. Criando o projeto

Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel.

Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome ExcelDeployment. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o ExcelDeployment projeto para Solution Explorer. Adicionar cdigo para trs a pasta de trabalho Nesta etapa, voc adicionar uma caixa de mensagem ao manipulador Startup de eventos da pasta de trabalho. Isso permite que voc para verificar se a soluo est funcionando quando voc abre o documento rapidamente.

Para adicionar uma caixa de mensagem a um evento de inicializao


1. 2. Clique com o boto direito do mouse ThisWorkbook.vb no Solution Explorer, ou ThisWorkbook.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo ao manipulador Startup de eventos dentro a ThisWorkbook classe para mostrar uma caixa de mensagem durante a inicializao. C#

Visual C# Consolidado

108

private void ThisWorkbook_Startup(object sender, System.EventArgs e) { MessageBox.Show("The workbook is deployed successfully."); } 3. 4. 5. Pressione F5 para executar o projeto. O Excel iniciado e aparecer a caixa de mensagem. Fechar a caixa de mensagem. Saia do Excel. Criar um projeto de instalao Nesta etapa, voc ir criar um projeto de instalao que voc pode compilar para criar um arquivo do Windows Installer para sua soluo. Para obter mais informaes, consulte Configurar projetos.

Em seguida, voc adicionar um projeto de instalao para sua soluo.

Para criar um projeto de instalao para a soluo


1. 2. 3. 4. 5. 6. Clique com o boto direito do mouse no n na Solution Explorer soluo. Aponte para Add no menu de atalho, e clique em New Project. A Add New Project caixa de dilogo ser exibida. No painel Project types, expanda Other Project types e selecione Setup and Deployment. No painel Templates, selecione Setup project. Nome do projeto ExcelSetup. Clique em OK. O projeto instalao aparece no Solution Explorer. Por padro, o arquivo que voc ir criar usando este projeto instalao Windows Installer inclui uma caixa de dilogo que permite ao usurio final que especifique o local de instalao da soluo. Para obter mais informaes, consulte Caixa de dilogo interface do usurio da pasta de instalao. Adicionar o pasta de trabalho e assembly da soluo para o Project da instalao Nesta etapa, voc adicionar a sada do projeto ExcelDeployment principal para o projeto de instalao. A sada do projeto ExcelDeployment principal consiste de pasta de trabalho e o conjunto de soluo.

Para adicionar o documento e conjunto ao projeto de instalao


1. 2. 3. 4. 5. 6. 7. 8. 9. Clique com o boto direito do mouse no ExcelSetup project n em Solution Explorer. Selecione View no menu de atalho, e depois clique em File System. Clique com o boto direito do mouse Application Folder no painel esquerdo. Aponte para Add no menu de atalho, e clique em Project Output. Selecione ExcelDeployment na caixa Project. Selecione Primary output na lista de tipos de sada. Clique em OK. A sada do projeto e dependncias aparecem no painel direito. No Solution Explorer, expanda Detected Dependencies sob o ExcelSetup n de projeto. Clique com boto direito mouse cada dependncia, exceto para Microsoft .NET Framework, e clique Exclude no menu de atalho.

Visual C# Consolidado

109

Criar um projeto de ao personalizada Nesta etapa, voc ir criar um projeto que contm aes personalizadas para o projeto de instalao. Aes personalizadas so um recurso do Windows Installer que permitem a voc para executar cdigo no final de uma instalao para executar aes que no podem ser executadas durante a instalao. Para obter mais informaes, consulte Aes Personalizadas.

Para criar um projeto ao personalizada


1. 2. 3. 4. 5. 6. 7. Clique com o boto direito do mouse no n na Solution Explorer soluo. Aponte para Add no menu de atalho, e clique em New Project. A Add New Project caixa de dilogo ser exibida. No painel Project types, expanda o n para a linguagem de programao, e selecione Windows. No painel Templates, selecione Class Library. Nome do projeto ExcelCustomAction. Clique em OK. O novo projeto aparece na Solution Explorer. No Solution Explorer, clique com o boto direito do mouse Class1.vb ou Class1.cs sob o ExcelCustomAction projeto e, em seguida, clique em Delete. Este arquivo desnecessrio para essa explicao passo a passo. Criar uma ao personalizada que salvas o manifesto de aplicativo Quando voc executava seu projeto anteriormente nessa explicao passo a passo pelo pressionamento F5, a processo de criao editado o manifesto do aplicativo incorporado na pasta de trabalho para aponte para o caminho relativo do conjunto. Se a pasta de trabalho e o conjunto permanecer na mesma pasta aps a instalao, ento voc no precisam modificar o manifesto do aplicativo incorporado, e voc pode ignorar esta seo. No entanto, se voc quiser que o usurio possa mover a pasta de trabalho para uma pasta diferente aps a instalao, voc deve editar o manifesto do aplicativo para apontar para o caminho completo da montagem. Voc deve atualizar o manifesto do aplicativo que est incorporado no Visual Studio Tools for Office documento de Soluo ao executar uma ao personalizada aps a instalao, porque o local do conjunto de soluo desconhecido at que o usurio especifica o local durante a instalao. Editar o manifesto do aplicativo incorporado, usando a ServerDocument classe. Para usar a ServerDocument classe no projeto de instalao, adicione cdigo para uma Installer classe dentro do projeto ao personalizada.

Para criar uma ao personalizada que edita o manifesto do aplicativo


1. 2. 3. 4. 5. 6. Clique com o ExcelCustomAction projeto no Solution Explorer. Aponte para Add no menu de atalho, e clique em New Item. A Add New Item caixa de dilogo ser exibida. Selecionar Installer Class, e nome da classe ManifestEditor. Adicione uma referncia ao conjunto Microsoft.VisualStudio.Tools.Applications.Runtime para o ExcelCustomAction projeto. Do ManifestEditor.cs clique com o boto direito do mouse no Solution Explorer, ou ManifestEditor.vb arquivo e clique em View Code. Adicione a instruo seguinte Imports ou using para o topo do arquivo de cdigo. C# using Microsoft.VisualStudio.Tools.Applications.Runtime;

Visual C# Consolidado

110

7.

Copie o cdigo a seguir para a ManifestEditor classe. Esse cdigo substitui o Install mtodo, que usado para executar aes Instalao personalizada. O cdigo define o local de instalao especificado pelo usurio para a AssemblyPath propriedade. O caminho de instalao especificado pelo usurio e os nomes do documento e conjunto so obtidas a partir da Parameters propriedade. C#

// Override the Install method to update the customization location // in the application manifest. public override void Install(System.Collections.IDictionary stateSaver) { UpdateApplicationManifest(); base.Install(stateSaver); } // Update the application manifest according to the the install location. private void UpdateApplicationManifest() { // Get the parameters passed to the task. string targetDir = this.Context.Parameters["targetdir"]; string documentName = this.Context.Parameters["documentname"]; string assemblyName = this.Context.Parameters["assemblyname"]; // Get the application manifest from the document. string documentPath = System.IO.Path.Combine(targetDir, documentName); ServerDocument serverDocument1 = new ServerDocument(documentPath, System.IO.FileAccess.ReadWrite); try { AppManifest appManifest1 = serverDocument1.AppManifest; string assemblyPath = System.IO.Path.Combine(targetDir, assemblyName); appManifest1.Dependency.AssemblyPath = assemblyPath; serverDocument1.Save(); } finally { if (serverDocument1 != null) { serverDocument1.Close(); } } } 8. Clique com o ExcelCustomAction projeto no Solution Explorer, e, em seguida clique em Build. Adicionando a ao personalizada ao projeto de instalao Nesta etapa, voc adicionar a sada do projeto ExcelCustomAction principal para o projeto de instalao. Isso permite que o arquivo Windows Installer para executar a ao personalizada que edita o manifesto do aplicativo.

Para adicionar a sada primria do projeto ao personalizada ao projeto de instalao


1. 2. 3. 4. 5. 6. 7. Clique com o boto direito do mouse no ExcelSetup project n em Solution Explorer. Aponte para View no menu de atalho, e clique em Custom Actions. O Custom Actions Editor, clique com boto direito no n e Install Clique em Add Custom Action. Na caixa Look In Selecionar Application Folder, e clique em Add Output Selecione ExcelCustomAction na caixa Project. Selecione Primary output na lista de tipos de sada, e depois clique em OK. Verifique que Primary output from ExcelCustomAction (Active) foi adicionado lista de sadas primria para o projeto de instalao e clique em OK

Visual C# Consolidado

111

8. 9.

Em expandir Install. o Custom Actions Editor, Clique com o boto direito do mouse Primary output from ExcelCustomAction (Active) e, em seguida clique em Properties Window.

10. Na janela Properties, defina a CustomActionData propriedade para a seguinte seqncia: /targetdir="[TARGETDIR]/" /documentname="ExcelDeployment.xls" /assemblyname="ExcelDeployment.dll" Para obter informaes sobre a CustomActionData propriedade, consulte Propriedade CustomActionData. 11. Clique com o boto direito do mouse e, em seguida clique em Build. Em Solution Explorer, o ExcelSetup project Teste a instalao Agora voc pode testar a soluo para garantir que sua soluo instalada quando voc executar o arquivo do Windows Installer no seu computador de desenvolvimento.

Para testar a instalao


1. 2. 3. 4. Clique com o boto direito do mouse e, em seguida clique em Run. Em Solution Explorer, o ExcelSetup project Siga as instrues no Assistente de Instalao, e especificar uma pasta de instalao no seu computador de desenvolvimento. Abrir a pasta de trabalho do Excel a partir da pasta de instalao. Confirme se a caixa de mensagem aparece.

Passo-a-passo: Concedendo e removendo permisses para uma soluo do Office


Essa explicao passo a passo demonstra as noes bsicas de segurana no Microsoft Visual Studio 2005 Tools for the Microsoft Office System. Durante este explicao passo a passo, voc aprender como:

Remova a configurao de segurana padro. Adicionar um novo conjunto de permisses. Testar seu projeto. Pr-requisitos

Para concluir esta explicao passo a passo, ser necessrio:


Visual Studio Tools for Office Microsoft Office Excel 2003. Criando o projeto

Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel.

Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome My Security Test. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

Visual C# Consolidado

112

O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Security Test projeto para Solution Explorer. Adicionar cdigo para trs a planilha Nesta etapa, voc adicionar uma caixa de mensagem a um evento de inicializao da planilha.

Para adicionar uma caixa de mensagem a um evento de inicializao


1. 2. 3. Verifique se a My Security Test.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo para o Startup mtodo dentro classe Sheet1 para mostrar uma caixa de mensagem durante a inicializao. C# private void Sheet1_Startup(object sender, System.EventArgs e) { MessageBox.Show("Security settings are correct."); } 4. 5. 6. 7. 8. 9. No menu File, clique em Save All. Na caixa Save Project de dilogo, digite C:\Walkthroughs na caixa Location. Clique em Save. Pressione F5 para executar o projeto. O Excel iniciado e aparecer a caixa de mensagem. Fechar a caixa de mensagem. Feche o Excel.

10. No designer do Visual Studio, localize e selecione na guia para My Security Test.xls. 11. Feche My Security Test.xls (a superfcie do design de planilha Excel) no designer do Visual Studio. Feche todos os instncias do Excel antes de alterar a diretiva de segurana. Quando voc criado o projeto de pasta de trabalho do Excel, o assistente adicionado um novo grupo de cdigo de segurana e um grupo de cdigos filho diretiva de segurana Runtime no nvel do usurio. Em seguida, voc remover o grupo de cdigos que criou o assistente. Remover o grupo de cdigos padro Localize e remova o grupo de cdigo padro que foi criado.

Para remover um grupo de cdigos


1. 2. 3. No Painel de Controle, abra Administrative Tools. Executar Microsoft .NET Framework 2.0 Configuration. No modo de exibio de rvore no lado esquerdo, expanda .NET Framework 2.0 Configuration,, expandir Runtime Security Policy, expandir User, expandir Code Groups, Expandido All_Code e My Computer expanda VSTOProjects. No um GUID para cada projeto tenha criado. Expanda cada GUID para ver o caminho para o documento associado. 4. Clique com o boto direito do mouse o GUID de C:\Walkthroughs\My Security Test\My Security Test\bin\My Security Test.xls grupo de cdigos, e, em seguida clique Delete no menu de atalho.

Visual C# Consolidado

113

Ser exibida uma caixa de dilogo perguntando se voc tiver certeza que deseja excluir este grupo de cdigos. 5. 6. Clique em Yes. Voltar para Visual Studio, e pressione F5 para executar o projeto meu teste de segurana. Ser exibida informando a atual poltica de segurana .NET permite que no no que a personalizao para executar uma mensagem de erro. 7. 8. Clique em OK. Feche o Excel.

O conjunto no pode ser executado se ele no tiver permisso explcita na Diretiva de Segurana Microsoft .NET. Em seguida, conceda permisso para o conjunto usando um nome forte em vez de uma URL para prova. Dando um nome de alta segurana para o conjunto Um nome forte geralmente mais seguro que uma URL como prova. Ser criar e atribuir um nome forte o conjunto nas prximas etapas.

Para criar um nome forte


1. 2. 3. 4. 5. 6. 7. 8. No menu Project no Visual Studio, clique em My Security Test Properties. Clique na Signing guia. Selecione Sign the assembly. No, o Choose a strong name key file list clique New. Na caixa Create Strong Name Key de dilogo, digite SecurityTestKey na caixa Key file name. Desmarque a Protect my key file with a password caixa de seleo. Clique em OK. O arquivo SecurityTestKey.snk de chave aparece no Solution Explorer. No menu Build, clique em Build Solution Para criar o conjunto contra o par de chaves nome forte. Conceder confiana com base no nome de alta segurana Agora adicionar um novo grupo de cdigo para conceder confiana total para o conjunto com base no nome forte.

Para conceder confiana com base em nome forte


1. 2. 3. 4. 5. 6. Abra Microsoft .NET Framework 2.0 Configuration novamente. Clique com o boto direito do mouse no VSTOProjects n e clique New no menu de atalho Digite o nome Security Test Strong Name para o novo grupo de cdigos, e clique em Next. Na lista Choose the condition type for this code group, clique Strong Name. Clique em Import. Procure C:\Walkthroughs\My segurana Test\My segurana Test.dll segurana Test\bin\My para Visual Basic ou C:\Walkthroughs\My segurana Test\My segurana Test.dll segurana Test\bin\debug\My no C#, e clique em Open.

Visual C# Consolidado

114

7. 8. 9.

Clique em Next. Clique Next para aceitar o FullTrust conjunto de permisses e clique em Finish. Fechar Microsoft .NET Framework 2.0 Configuration. Testar o aplicativo

Agora voc pode testar sua pasta de trabalho para certificar-se que seu cdigo seja executado quando a pasta de trabalho aberta.

Para testar sua pasta de trabalho


1. 2. Pressione F5 para executar o projeto. Confirme se a caixa de mensagem aparece.

Visual C# Consolidado

115

O WORD USANDO EXPLICAES PASSO-A-PASSO


Walkthroughs fornecem instrues passo a passo para cenrios comuns e so um bom lugar para comear aprendendo sobre Microsoft Visual Studio 2005 Tools for the Microsoft Office System. As orientaes a seguir demonstram formas voc pode usar as ferramentas do Microsoft Office 2003 para automatizar projetos Microsoft Office Word 2003, para implantar suas solues, e para definir a segurana.

Walkthrough: Changing Document formatao usando controles CheckBox


Essa explicao passo a passo demonstra os fundamentos bsicos do uso controles em um documento do Microsoft Office Word 2003 para alterar a formatao de texto. Voc usar Microsoft Visual Studio 2005 Tools for the Microsoft Office System para criar e adicionar cdigo ao seu projeto. Para ver o resultado como uma amostra completa, consulte Exemplo de controles do Word. Durante este explicao passo a passo, voc aprender como:

Adicione texto e um controle a um documento. Formate o texto quando uma opo selecionada. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Visual Studio Tools for Office O Microsoft Office Word 2003. Criando o projeto

Neste procedimento, voc ir criar projeto usando Visual Studio Tools for Office um documento do Word.

Para criar um novo projeto

Criar um projeto Documento do Word com o nome My Word Formatting. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Abre o novo documento do Word no designer e adiciona o My Word Formatting projeto para Solution Explorer o Visual Studio. Adicionar texto e controles ao documento do Word

Para essa explicao passo a passo, voc precisar trs caixas de seleo e algum texto em um Bookmark controle no documento do Word.

Visual C# Consolidado

116

Para adicionar trs caixas de seleo


1. 2. 3. 4. Verifique se o documento est aberto no designer visual studio. Na Common Controls guia e arraste-o para o documento. da Toolbox, arraste um CheckBox No menu View, selecione Properties Window. Certifique-se de que que Checkbox1 esteja visvel na caixa de listagem Nome de objeto da janela Properties, e altere as propriedades a seguir: Value (Valor) applyBoldFont Negrito Pressione Enter para mover o ponto de insero abaixo da primeira caixa de seleo. Adicionar uma segunda caixa de seleo para o documento abaixo da ApplyBoldFont caixa de seleo e alterar as propriedades a seguir: Value (Valor) applyItalicFont Itlico Pressione Enter para mover o ponto de insero abaixo da segunda caixa de seleo. Adicionar uma caixa de seleo terceira para o documento abaixo da ApplyItalicFont caixa de seleo e alterar as propriedades a seguir: Value (Valor) applyUnderlineFont Sublinhado Voc em seguida, ser arrastar o Bookmark controle para o documento.

Propriedade Name Text 5. 6.

Propriedade Name Text 7. 8.

Propriedade Name Text 9.

Observao Voc tambm pode adicionar o Bookmark controle usando a Bookmark caixa de dilogo, encontrada no menu Insert.

Para adicionar texto e um controle indicador


1. Mover o ponto de insero abaixo os controles caixa de seleo e digite o seguinte texto no documento: Clique em uma caixa de seleo para alterar a formatao de texto. 2. Na guia Word Controls na Toolbox, arraste um Bookmark controle para o documento. A Add Bookmark Control caixa de dilogo ser exibida. 3. Selecione o texto adicionado ao documento e clique em OK. Um Bookmark controle denominado Bookmark1 adicionado ao texto selecionado no documento. 4. Certifique-se de que que Bookmark1 esteja visvel na caixa de listagem Nome de objeto da janela Properties, e alterar a propriedade Nome para fontText.

Visual C# Consolidado

117

Em seguida, escreva o cdigo para formatar o texto quando uma caixa de seleo marcada ou desmarcada. Formatao a caixa de texto quando a verificao checked ou Cleared Quando o usurio seleciona uma opo de formatao, alterar o formato do texto no documento.

Para alterar a formatao quando uma caixa de seleo marcada


1. 2. Clique com o boto direito do mouse ThisDocument no Solution Explorer, e, em seguida clique View Code no menu de atalho. No C# somente, adicionar as constantes a seguir para a ThisDocument classe: C# Copiar Cdigo const int WordTrue = -1; const int WordFalse = 0; 3. Adicione o seguinte cdigo ao manipulador Click de eventos da caixa applyBoldFont de seleo: C# private void applyBoldFont_Click(object sender, System.EventArgs e) { if (this.applyBoldFont.Checked == true) { this.fontText.Bold = WordTrue; } else { this.fontText.Bold = WordFalse; } } 4. Adicione o seguinte cdigo ao manipulador Click de eventos da caixa applyItalicFont de seleo: C# private void applyItalicFont_Click(object sender, System.EventArgs e) { if (this.applyItalicFont.Checked == true) { this.fontText.Italic = WordTrue; } else { this.fontText.Italic = WordFalse; } } 5. Adicione o seguinte cdigo ao manipulador Click de eventos da caixa applyUnderlineFont de seleo: C# private void applyUnderlineFont_Click(object sender, System.EventArgs e) { if (this.applyUnderlineFont.Checked == true) { this.fontText.Underline = Word.WdUnderline.wdUnderlineSingle; } else { this.fontText.Underline = Word.WdUnderline.wdUnderlineNone; } } 6. Em C#, adicione manipuladores de eventos para as caixas de texto para o Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C# this.applyBoldFont.Click += new EventHandler(applyBoldFont_Click); this.applyItalicFont.Click += new EventHandler(applyItalicFont_Click); this.applyUnderlineFont.Click += new EventHandler(applyUnderlineFont_Click); Testar o aplicativo Agora voc pode testar seu documento para certificar-se que o texto est formatado corretamente quando voc marca ou desmarca uma caixa de seleo.

Para testar seu documento


1. 2. Pressione F5 para executar o projeto. Marque ou desmarque uma caixa de seleo.

Visual C# Consolidado

118

3.

Confirme que o texto est formatado corretamente. Prximas etapas

Essa explicao passo a passo mostra as noes bsicas de usando caixas de seleo e programaticamente alterar texto formatao em documentos do Word. Aqui esto algumas tarefas que podem vie em seguida:

Implantao do projeto. Para obter mais informaes, consulte Como: Implantar arquivos de soluo usando o Publish Wizard. Usando um boto para preencher uma caixa de texto. Para obter mais informaes, consulte Exibindo texto em uma caixa de texto em um documento usando um boto Walkthrough:.

Exibindo texto em uma caixa de texto em um documento usando um boto Walkthrough:


Essa explicao passo a passo demonstra noes bsicas de usando botes e caixas de texto em documentos do Microsoft Office Word 2003,, bem como usar Microsoft Visual Studio 2005 Tools for the Microsoft Office System para criar um projeto. Durante este explicao passo a passo, voc aprender como:

Adicionar controles ao documento do Word. Preencher uma caixa de texto quando um boto clicado. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Visual Studio Tools for Office O Microsoft Office Word 2003. Criando o projeto

Nesta etapa, voc ir criar projeto usando Visual Studio Tools for Office um documento do Word.

Para criar um novo projeto

Criar um projeto Documento do Word com o nome My Word Button. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Abre o novo documento do Word no designer e adiciona o My Word Button projeto para Solution Explorer o Visual Studio. Adicionar controles ao documento do Word

Nesta seo, voc adicionar um boto e uma caixa de texto para o documento Word.

Para adicionar um boto e uma caixa de texto


1. 2. Verifique se o documento est aberto no designer visual studio. Na guia Common Controls da Toolbox, arraste um TextBox controle para o documento.

Visual C# Consolidado

119

Observao No Word, controles so ignorados na linha com texto por padro. Voc pode modificar, controles forma, bem como objetos forma, so inseridos na guia Edit da caixa Options de dilogo. 3. 4. 5. No menu View, selecione Properties Window. Certifique-que TextBox1 est visvel na caixa Properties drop-down janela e alterar a Name propriedade da caixa de texto para displayText. Arraste um Button controle para o documento e alterar as seguintes propriedades: Value (Valor) insertText Inserir texto

Propriedade Name Text

Agora Escreva o cdigo a ser executado quando o boto clicado. Preencher a caixa de texto quando o boto Clicked Sempre que o usurio clica no boto, Hello World! acrescentada caixa de texto.

Para escrever para a caixa de texto quando o boto clicado


1. 2. Na Solution Explorer, clique com o boto direito do mouse ThisDocument e, em seguida clique View Code no menu de atalho. Adicione o seguinte cdigo ao manipulador Click de eventos do boto: C# private void insertText_Click(object sender, EventArgs e) { this.displayText.Text += "Hello World!"; } 3. Em C#, adicione um manipulador de eventos para o boto para o Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C# this.insertText.Click += new EventHandler(insertText_Click); Testar o aplicativo Agora voc pode testar seu documento para certificar-se que a mensagem Hello World! aparece na caixa de texto quando voc clica no boto.

Para testar seu documento


1. 2. 3. Pressione F5 para executar o projeto. Clique no boto. Confirme que Hello World! aparece na caixa de texto. Prximas etapas Essa explicao passo a passo mostra os fundamentos bsicos do uso botes e caixas de texto em documentos do Word. Aqui esto algumas tarefas que podem vie em seguida:

Implantando o projeto. Para obter mais informaes, consulte Como: Implantar arquivos de soluo usando o Publish Wizard. Usando uma caixa de combinao para alterar a formatao. Para obter mais informaes, consulte Walkthrough: Changing Document formatao usando controles CheckBox.

Visual C# Consolidado

120

Walkthrough: Criando menus de atalho para indicadores


Essa explicao passo a passo demonstra a criao de menus de atalho para Bookmark controles. Voc ir escrever cdigo no evento BeforeRightClick do indicador para que quando o usurio clica com o boto direito do mouse o texto dentro do indicador, um menu de atalho contendo itens de menu para formatar o texto aparea. Durante este explicao passo a passo, voc aprender como:

Criar um menu de atalho. Escrever cdigo para responder a com o boto direito do mouse texto em um indicador. Verifique se h sobreposio indicadores. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Microsoft Visual Studio 2005 Tools for the Microsoft Office System O Microsoft Office Word 2003. Criando o projeto

Nesta etapa, voc ir criar um projeto Documento do Word no Visual Studio.

Para criar um novo projeto

Criar um projeto Documento do Word com o nome My Bookmark Shortcut Menu. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Abre o novo documento do Word no designer e adiciona o My Bookmark Shortcut Menu projeto para Solution Explorer o Visual Studio. Adicionar texto e indicadores ao documento

Nesta etapa, voc ser adicionar texto ao seu documento do Word e depois adicionar dois indicadores.

Para adicionar texto ao seu documento

Digite o seguinte texto em um documento do Word:

Este um Exemplo de criar um menu de atalho quando voc clica com o boto direito do mouse texto em um indicador.

Para adicionar um controle indicador ao seu documento


1. Na guia Word Controls da Toolbox, arraste um Bookmark controle para o documento. A Add Bookmark Control caixa de dilogo ser exibida. 2. Selecione as palavras creating a shortcut menu when you right-click the text no seu documento e clique em OK. bookmark1 adicionado ao documento.

Visual C# Consolidado

121

3.

Adicionar outro Bookmark controle com as palavras right-click the text in a bookmark. bookmark2 adicionado ao documento.

Observao As palavras right-click the text aparecero no bookmark1 e bookmark2. Quando voc adicionar indicadores aos seus documentos Office Word 2003 no tempo de criao, um Bookmark controle criado que permite a voc para programa contra vrios eventos do indicador. Voc pode escrever cdigo no evento BeforeRightClick do indicador para que quando o usurio clica com o boto direito do mouse o texto dentro do indicador, um menu de atalho contendo itens de menu aparea. Criando o menu curto

Para criar o menu de atalho


1. 2. No Solution Explorer, clique com o boto direito do mouse ThisDocument e selecione View Code. Declarar as CommandBar variveis e uma varivel do indicador no nvel de classe: C# private Office.CommandBar commandBar; private Office.CommandBarButton boldText; private Office.CommandBarButton italicText; private Microsoft.Office.Tools.Word.Bookmark selectedBookmark; const int WordTrue = -1; const int WordFalse = 0; 3. Adicionar um mtodo para criar o menu: C# private void AddPopUp() { commandBar = Application.CommandBars.Add("FormatText", Office.MsoBarPosition.msoBarPopup, missing, true); // Add a button and set the style, caption, icon and tag. boldText = (Office.CommandBarButton)commandBar.Controls.Add(1, missing, missing, missing, missing); boldText.Style = Office.MsoButtonStyle.msoButtonCaption; boldText.Caption = "Bold"; boldText.FaceId = 113; boldText.Tag = "0"; // Add a button and set the style, caption, icon and tag. italicText = (Office.CommandBarButton)commandBar.Controls.Add(1, missing, missing, missing, missing); italicText.Style = Office.MsoButtonStyle.msoButtonCaption; italicText.Caption = "Italic"; italicText.FaceId = 114; italicText.Tag = "1"; // Handle the click events with the ButtonClick procedure. boldText.Click += new Microsoft.Office.Core ._CommandBarButtonEvents_ClickEventHandler(ButtonClick); italicText.Click += new Microsoft.Office.Core ._CommandBarButtonEvents_ClickEventHandler(ButtonClick); } 4. Chamada AddPopup a partir do Startup evento de ThisDocument: C# private void ThisDocument_Startup(object sender, System.EventArgs e) { AddPopUp(); }

Para formatar o texto contido no indicador


1. Adicionar um ButtonClick manipulador de eventos para aplicar formatao para o indicador. C# private void ButtonClick(Microsoft.Office.Core.CommandBarButton Ctrl, ref bool CancelDefault) { if (Ctrl.Caption == "Bold") { if (selectedBookmark.Bold == WordTrue) { selectedBookmark.Bold = WordFalse; } else { selectedBookmark.Bold = WordTrue; } } else if (Ctrl.Caption == "Italic") { if (selectedBookmark.Italic == WordTrue) { selectedBookmark.Italic = WordFalse; } else { selectedBookmark.Italic = WordTrue; } } }

Visual C# Consolidado

122

2.

Adicionar um showPopupMenu manipulador de eventos para manipular o BeforeRightClick evento de dois indicadores:

Observao Voc deve escrever cdigo para manipular o caso em que se sobrepem indicadores. Se voc no fizer isso, por padro, o cdigo se chamar para cada indicador dentro da seleo. C# private void showPopupMenu(object sender, Microsoft.Office.Tools.Word.ClickEventArgs e) { int startPosition = 0; // If bookmarks overlap, get bookmark closest to cursor. for (int i = 1; i <= e.Selection.Bookmarks.Count; i++) { object o = i; if (e.Selection.Bookmarks.get_Item(ref o).Start > startPosition) { startPosition = e.Selection.Bookmarks.get_Item(ref o).Start; } } // If closest bookmark is the sender, show the popup. if (((Word.Bookmark)sender).Start == startPosition) { selectedBookmark = (Microsoft.Office.Tools.Word.Bookmark)sender; commandBar.ShowPopup(missing, missing); e.Cancel = true; } } 3. Em C#, voc deve adicionar manipuladores de eventos para os controles do indicador ao Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C# this.bookmark1.BeforeRightClick += new Microsoft.Office.Tools.Word. ClickEventHandler(showPopupMenu); this.bookmark2.BeforeRightClick += new Microsoft.Office.Tools.Word. ClickEventHandler(showPopupMenu); Testar o aplicativo Nesta seo, voc ir testar seu documento para certificar-se de que os itens de menu negrito e itlico apaream no menu de atalho quando clicar com o boto direito do mouse texto em um indicador e o texto que est formatado corretamente.

Para testar seu documento


1. 2. 3. 4. 5. Pressione F5 para executar o projeto. Clique com o boto direito do mouse dentro do indicador e selecione Bold primeiro. Verificar se todos os o texto no bookmark1 formatados como negrito. Clique com o boto direito do mouse dentro do texto dos indicadores sobrepostos e selecione Italic. Verificar se todos os o texto no bookmark2, mas somente essa parte do texto em bookmark1 que se sobreponha bookmark2 formatados como itlico. Prximas etapas Essa explicao passo a passo mostra como criar menus de atalho em indicadores. Aqui esto algumas tarefas que podem vie em seguida:

Escrever cdigo para responder a eventos de controles host no Excel. Para obter mais informaes, consulte Programao contra eventos de um controle NamedRange Walkthrough:. Use uma caixa de seleo para alterar formatao em um indicador. Para obter mais informaes, consulte Walkthrough: Changing Document formatao usando controles CheckBox.

Visual C# Consolidado

123

Walkthrough: atualizando um grfico em um documento usando botes de opo


Essa explicao passo a passo demonstra os fundamentos bsicos do alterando estilos do grfico usando botes de opo em um documento do Microsoft Office Word 2003. Voc usar Microsoft Visual Studio 2005 Tools for the Microsoft Office System para criar e adicionar cdigo ao seu projeto. Para ver o resultado como uma amostra completa, consulte Exemplo de controles do Word. Durante este explicao passo a passo, voc aprender como:

Adicionar um grfico a um documento. Adicionar um controle de usurio a um documento. Alterar o estilo do grfico quando uma opo est selecionada. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Visual Studio Tools for Office O Microsoft Office Word 2003. Criando o projeto

Nesta etapa, voc ir criar projeto usando Visual Studio Tools for Office um documento do Word.

Para criar um novo projeto

Criar um projeto Documento do Word com o nome My Chart Options. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Abre o novo documento do Word no designer e adiciona o My Chart Options projeto para Solution Explorer o Visual Studio. Adicionar um grfico ao documento

Em seguida, adicione um grfico para o documento.

Para adicionar um grfico


1. No menu Insert, clique em Object. A Object caixa de dilogo ser aberta. Observao Se o Insert menu no estiver visvel, voc dever primeiro clicar em dentro do documento para que ele foco. Para obter mais informaes consulte, Menus do Office no ambiente do Visual Studio. 2. Na lista Object type da guia Create New, selecione Microsoft Graph Chart e clique em OK

Visual C# Consolidado

124

Um grfico adicionado ao documento no ponto de insero, e a Datasheet janela exibida com alguns dados padro. 3. 4. 5. Feche a Datasheet janela para aceite os valores padro no grfico e clique dentro do documento para mover foco fora do grfico. Clique com o boto direito do mouse no grfico e selecione Format Object. Na guia Layout da caixa de dilogo, selecione Square e Format Object Clique em OK. Adicionar um controle de usurio ao projeto

Para adicionar um controle de usurio


1. 2. 3. Selecione o My Chart Options projeto no Solution Explorer. No menu Project, clique em Add New Item. Na caixa Add New Item de dilogo, clique User Control, nome do controle ChartOptions, e clique em Add Se o controle de usurio estiver no visvel no designer, clique duas vezes em ChartOptions no Solution Explorer. Na guia Common Controls Da arraste um Radio Button controle para o controle de usurio, e alterar as seguintes propriedades: o Toolbox, Value (Valor) columnChart Grfico de coluna Adicionar um segundo Radio Button ao controle de usurio, e alterar as seguintes propriedades: Value (Valor) barChart Grfico de barras Adicionar um terceiro Radio Button ao controle de usurio, e alterar as seguintes propriedades: Value (Valor) lineChart Grfico de linha Adicionar um quarto Radio Button ao controle de usurio, e alterar as seguintes propriedades: Value (Valor) areaBlockChart Grfico bloquear de rea Adicionar Referncias

Para adicionar controles Windows Form ao controle de usurio


1. 2.

Propriedade Name Text 3.

Propriedade Name Text 4.

Propriedade Name Text 5.

Propriedade Name Text

Visual C# Consolidado

125

Para acessar o grfico do controle de usurio em um documento, voc deve ter uma referncia 11.0 biblioteca objeto do Graph Microsoft no seu projeto.

Para adicionar uma referncia 11.0 biblioteca objeto do Graph Microsoft


1. 2. 3. No menu Project, clique em Add Reference. A Add Reference caixa de dilogo ser exibida. Clique na COM guia. Selecione Microsoft Graph 11.0 Object Library na lista Component Name e clique em OK Alterar o estilo grfico quando o boto de opo selecionada Nesta seo, voc ser criar um evento pblico sobre o controle de usurio, adicionar uma propriedade para definir o tipo de seleo, e criar um procedimento para o CheckedChanged evento de cada um dos botes de opo.

Para criar um evento e propriedade em um controle de usurio


1. 2. No Solution Explorer, clique com o boto direito do mouse no controle de usurio e selecione View Code. Adicione cdigo para criar um SelectionChanged evento e a Selection propriedade para a ChartOptions classe: C# public event EventHandler SelectionChanged; private Microsoft.Office.Interop.Graph.XlChartType selectedType = Microsoft.Office.Interop.Graph.XlChartType.xlColumnClustered; public Microsoft.Office.Interop.Graph.XlChartType Selection { get { return this.selectedType; } set { this.selectedType = value; } }

Para manipular o evento CheckedChange dos botes de opo


1. Definir o tipo de grfico no manipulador CheckedChanged de eventos de boto areaBlockChart de opo e depois gerar o evento. C# private void areaBlockChart_CheckedChanged(object sender, EventArgs e) { if (((RadioButton)sender).Checked) { this.selectedType = Microsoft.Office.Interop.Graph.XlChartType.xlAreaStacked; if (this.SelectionChanged != null) { this.SelectionChanged(this, EventArgs.Empty); } } } 2. Definir o tipo de grfico no manipulador CheckedChanged de eventos do boto barChart de opo. C# private void barChart_CheckedChanged(object sender, EventArgs e) { if (((RadioButton)sender).Checked) { this.selectedType = Microsoft.Office.Interop.Graph.XlChartType.xlBarClustered; if (this.SelectionChanged != null) { this.SelectionChanged(this, EventArgs.Empty); } } } 3. Definir o tipo de grfico no manipulador CheckedChanged de eventos do boto columnChart de opo. C# private void columnChart_CheckedChanged(object sender, EventArgs e) { if (((RadioButton)sender).Checked) { this.selectedType =

Visual C# Consolidado

126

Microsoft.Office.Interop.Graph.XlChartType.xlColumnClustered; if (this.SelectionChanged != null) { this.SelectionChanged(this, EventArgs.Empty); } } } 4. Definir o tipo de grfico no manipulador CheckedChanged de eventos do boto lineChart de opo. C# private void lineChart_CheckedChanged(object sender, EventArgs e) { if (((RadioButton)sender).Checked) { this.selectedType = Microsoft.Office.Interop.Graph.XlChartType.xlLineMarkers; if (this.SelectionChanged != null) { this.SelectionChanged(this, EventArgs.Empty); } } } 5. Em C#, voc deve adicionar manipuladores de eventos para os botes de opo. Adicione o cdigo para o ChartOptions Construtor, sob a chamada para InitializeComponent, conforme mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C# public ChartOptions() { InitializeComponent(); areaBlockChart.CheckedChanged += new EventHandler(areaBlockChart_CheckedChanged); barChart.CheckedChanged += new EventHandler(barChart_CheckedChanged); columnChart.CheckedChanged += new EventHandler(columnChart_CheckedChanged); lineChart.CheckedChanged += new EventHandler(lineChart_CheckedChanged); } Adicionando o controle de usurio ao documento Quando voc cria a soluo, o novo controle de usurio automaticamente adicionado Toolbox. Do Toolbox Voc pode, ento, arrastar o controle de ao seu documento.

Para adicionar o controle de usurio do documento


1. 2. 3. No menu Build, clique em Build Solution. O ChartOptions controle de usurio adicionado Toolbox. Clique com o boto direito do mouse ThisDocument.vb no Solution Explorer, ou ThisDocument.cs. e selecione View Designer Do Toolbox arraste o ChartOptions controle de para o documento. Um novo controle chamado ChartOptions1 adicionado ao seu projeto. Alterar o tipo de grfico Nesta seo, criar um manipulador de eventos para alterar o tipo de grfico acordo para a opo selecionada no controle de usurio.

Para alterar o tipo de grfico que exibido no documento


1. Adicionar o manipulador de eventos a seguir para a ThisDocument classe. C# private void ChartOptions1_SelectionChanged(object sender, EventArgs e) { try { //first object is the runtime storage control object index = 2; Word.Shape shape = this.Shapes.get_Item(ref index); //Activate the shape shape.Activate(); Microsoft.Office.Interop.Graph.Chart dataChart = (Microsoft.Office.Interop.Graph.Chart)shape.OLEFormat.Object; dataChart.ChartType = this.ChartOptions1.Selection; //Deactivate the shape this.ChartOptions1.Select(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } 2. Em C#, adicione um manipulador de eventos para o controle de usurio para o Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:.

Visual C# Consolidado

127

C# this.ChartOptions1.SelectionChanged += new EventHandler(ChartOptions1_SelectionChanged); Testar o aplicativo Agora voc pode testar seu documento para certificar-se que o estilo do grfico atualizado corretamente quando voc seleciona um boto de opo.

Para testar seu documento


1. 2. 3. Pressione F5 para executar o projeto. Selecione vrios botes de opo. Confirme que o estilo do grfico altera para correspondem seleo. Prximas etapas Essa explicao passo a passo mostra noes bsicas de usando botes de opo e programaticamente alterando estilos do grfico em documentos do Word 2003. Aqui esto algumas tarefas que podem vie em seguida:

Implantando o projeto. Para obter mais informaes, consulte Como implantar solues do Office: Usando um boto para preencher uma caixa de texto. Para obter mais informaes, consulte Exibindo texto em uma caixa de texto em um documento usando um boto Walkthrough:. Alterar formatao, selecionando um estilo da caixa de combinao. Para obter mais informaes, consulte Walkthrough: Changing Document formatao usando controles CheckBox.

Vinculao de Dados para controles em um painel Aes do Word Walkthrough:


Essa explicao passo a passo demonstra vinculao de dados a controles em um painel Aes no Microsoft Office Word 2003. Os controles sero demonstram uma Relao mestre / detalhes entre tabelas em um banco de dados do SQL Server. Durante este explicao passo a passo, voc aprender como:

Criar um controle painel Aes para o painel Aes. Adicionar controles que so acoplados a dados a um controle painel Aes Windows Forms. Use uma Relao mestre / detalhes quando exibir dados nos controles. Mostrar painel de aes quando abre o aplicativo. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Microsoft Visual Studio 2005 Tools for the Microsoft Office System

Visual C# Consolidado

128

O Microsoft Office Word 2003. Permisses para ler e gravar no banco de dados do SQL Server. Criando o projeto

Acesso a um servidor com o Exemplo de SQL Server do Northwind.

Nesta etapa, voc ir criar um projeto Documento do Word.

Para criar um novo projeto

Criar um projeto Documento do Word com o nome My Word Actions Pane. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Abre o novo documento do Word no designer e adiciona o My Word Actions Pane projeto para Solution Explorer o Visual Studio. Adicionar controles ao painel de aes

Para essa explicao passo a passo, necessrio um controle painel Aes que contm controles ligados a dados Windows Forms. Adicionar uma fonte de dados para o projeto, e arraste os controles a partir da Data Sources janela para o controle painel Aes.

Para adicionar um controle painel Aes


1. 2. 3. Selecione o My Word Actions Pane projeto no Solution Explorer. No menu Project, selecione Add New Item. Na caixa Add New Item de dilogo, selecione Actions Pane Control, nome-la ActionsControl, e clique em Add Se a Data Sources janela no estiver visvel, clique Show Data Sources no Data menu.

Para adicionar uma nova fonte de dados para o projeto


1.

Observao Se Show Data Sources Clique dentro do documento do Word e marque novamente. no estiver disponvel, 2. 3. Clique Add New Data Source Para iniciar o Data Source Configuration Wizard. Selecione Database e, em seguida clique em Next.

Selecionar uma conexo de dados ao banco de dados de Exemplo Northwind do SQL Server ou adicionar uma nova conexo com o New Connection boto. 4. 5. 6. 7. 8. Clique em Next. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next. Expanda o Tables n na janela Database objects. Marque a caixa de seleo ao lado e Products tabelas. o Suppliers Clique em Finish.

O assistente adiciona a Suppliers tabela e Products Tabela janela Data Sources. Ele tambm adiciona um DataSet digitado ao seu projeto que est visvel no Solution Explorer.

Para adicionar controles Windows Forms ligados a dados a um controle painel Aes Visual C# Consolidado 129

1. 2. 3.

Na janela Data Sources, expanda a Suppliers tabela. Clique na seta suspensa no n Company Name, e selecione ComboBox. Arraste CompanyName da janela Data Sources para o controle painel Aes. Um ComboBox controle criado no controle painel Aes. Ao mesmo tempo, nomeado SuppliersBindingSource, um adaptador de tabela, e um DataSet so adicionados ao projeto no bandeja de componentes. um BindingSource

Observao Um navegador de ligao tambm adicionado para o bandeja de componentes e para o topo do controle painel Aes. Voc remover esse controle posteriormente no explicao passo a passo o. 4. 5. 6. 7. Mover a caixa de combinao para que ele seja sob o rtulo e alterar a Size propriedade 171, 21. Expandir a Products tabela na janela Data Sources. Clique na seta suspensa no n ProductName, e selecione ListBox. Arraste ProductName para o controle painel Aes. Um ListBox controle criado no controle painel Aes. Ao mesmo tempo, chamado ProductBindingSource e um adaptador de tabela so adicionados para o projeto no bandeja de componentes. um BindingSource 8. Do SuppliersBindingNavigator Selecione na bandeja e Component pressione DELETE.

Observao Excluindo o SuppliersBindingNavigator faz no remover todos os o cdigo que foi gerado para ele. Voc pode remover este cdigo. 9. Mover a caixa de listagem para que ele seja sob o rtulo e alterar a Size propriedade 171,95.

10. Arraste controlar e coloc-lo a caixa de listagem abaixo. de para o painel Aes um Button o Toolbox 11. Clique com o boto direito do mouse clique Properties no menu de atalho, e altere as seguintes propriedades: o Button, Propriedade Name Text Value (Valor) Inserir Inserir

12. Redimensionar o controle de usurio para ajustar os controles. Configurando a fonte de dados Nesta seo, voc adicionar cdigo ao Load Evento do controle painel Aes para preencher o controle com dados da DataTable. Do DataSource voc ir ento definir e DataMember propriedades para cada controle.

Para carregar o controle com dados

No manipulador Load de eventos da classe ActionsControl, adicione o seguinte cdigo: C#

Visual C# Consolidado

130

private void ActionsControl_Load(object sender, EventArgs e) { this.suppliersTableAdapter.Fill(this.northwindDataSet.Suppliers); this.productsTableAdapter.Fill(this.northwindDataSet.Products); }

Para definir propriedades de vinculao de dados do controle


1. 2. 3. 4. 5. 6. Selecione o CompanyNameComboBox controle. Na janela Properties, clique no boto para a direita da propriedade DataSource, e selecione SuppliersBindingSource. Na janela Properties, clique no boto para a direita da propriedade DisplayMember, e selecione CompanyName. Selecione o ProductNameListBox controle. Na janela Properties, clique no boto para a direita da propriedade DataSource, expanda SuppliersBindingSource, e selecione FK_Products_Suppliers. Na janela Properties, clique no boto para a direita da propriedade DisplayMember, e selecione ProductName. Adicionando um mtodo para inserir dados em uma tabela Nesta etapa, ser ler os dados dos controles acoplados e preencher uma tabela em seu documento do Word. Primeiro, voc ir criar um procedimento para formatar os ttulos na tabela, e seguida, voc adicionar o AddData mtodo para criar e formatar uma tabela do Word.

Para formatar os ttulos de tabela


Na classe ActionsControl, crie um mtodo para formatar os ttulos da tabela. Adicione cdigo conforme mostrado no Exemplo a seguir: C# static void SetHeadings(Microsoft.Office.Interop.Word.Cell tblCell, string text) { tblCell.Range.Text = text; tblCell.Range.Font.Bold = 1; tblCell.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter; }

Para criar a tabela


Na classe ActionsControl, escreva no um mtodo que criar uma tabela se um no existir, e adicionar dados a partir do painel Aes tabela. Adicione cdigo conforme mostrado no Exemplo a seguir. C# private void AddData(DataRow row, string companyName) { object missing = System.Type.Missing; // Create a table if it doesn't already exist. if (Globals.ThisDocument.Tables.Count == 0) { try { // Create a table. Microsoft.Office.Interop.Word.Table tbl = Globals.ThisDocument.Tables.Add (Globals.ThisDocument.Application.Selection.Range, 1, 4, ref missing, ref missing); // Insert headings. SetHeadings(tbl.Cell(1, 1), "Company Name"); SetHeadings(tbl.Cell(1, 2), "Product Name"); SetHeadings(tbl.Cell(1, 3), "Quantity"); SetHeadings(tbl.Cell(1, 4), "Unit Price"); } catch (Exception ex) { MessageBox.Show("Problem creating Products table: " + ex.Message, "Actions Pane", MessageBoxButtons.OK, MessageBoxIcon.Error); } } // Add data from data row to the table. Microsoft.Office.Interop.Word.Selection selection = Globals.ThisDocument.Application.Selection; if (selection.Tables.Count > 0) { Microsoft.Office.Interop.Word.Row newRow = Globals.ThisDocument.Tables[1].Rows.Add(ref missing); newRow.Range.Font.Bold = 0; newRow.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft; newRow.Cells[4].Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphRight; newRow.Cells[1].Range.Text = companyName; newRow.Cells[2].Range.Text =

Visual C# Consolidado

131

row["ProductName"].ToString(); newRow.Cells[3].Range.Text = row["QuantityPerUnit"].ToString(); newRow.Cells[4].Range.Text = Math.Round(Convert.ToDouble(row["UnitPrice"])).ToString("#,##0.00"); } else { MessageBox.Show("Cursor must be within a table.", "Actions Pane", MessageBoxButtons.OK, MessageBoxIcon.Error); } }

Para inserir texto em uma tabela do Word


No manipulador Click de eventos do boto Insert, adicione cdigo conforme mostrado no Exemplo o seguir: Observao Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C# private void Insert_Click(object sender, System.EventArgs e) { DataTable tbl = northwindDataSet.Products; DataRow[] rows; // Check if a product is selected. if (this.productNameListBox.SelectedIndex >= 0) { DataRowView productRow =(System.Data.DataRowView)this.productNameListBox.SelectedItem; string product = productRow.Row["ProductName"].ToString(); string company = this.companyNameComboBox.Text; // Return the data row from the selected product. rows = tbl.Select("ProductName = '" + product.Replace("'", "''") + "'"); this.AddData(rows[0], company); } else { MessageBox.Show("Please select a product.", "Actions Pane", MessageBoxButtons.OK); } } 1. Em C#, voc deve criar um manipulador de eventos para o Click Evento do boto. Voc pode colocar este cdigo no manipulador Load de eventos da classe ActionsControl. Para obter mais informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C# this.Insert.Click += new EventHandler(Insert_Click); Mostrando o Painel de Aes Voc nesta seo, vai escrever cdigo para mostrar o painel Aes. O painel Actions ficar visvel depois controles so adicionados a ele.

Para mostrar o painel Aes


1. Clique com o boto direito do mouse ThisDocument.vb no Solution Explorer, ou ThisDocument.cs,. e, em seguida clique View Code no menu de atalho

Criar uma nova instncia do controle na parte superior da classe ThisDocument de forma que ele tenha como no Exemplo a seguir: C# private ActionsControl actions = new ActionsControl(); Adicione cdigo ao manipulador Startup de eventos de ThisDocument forma que ele tenha como no Exemplo a seguir: Observao Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C# this.ActionsPane.Controls.Add(actions); Testar o aplicativo

Visual C# Consolidado

132

Agora voc pode testar seu documento para certificar-se que o painel Aes aberto quando o documento for aberto. Teste para a relao mestre / detalhes nos controles no painel Aes, e certifique-se que dados so preenchidos em uma tabela do Word quando o Insert boto clicado.

Para testar seu documento


1. 2. 3. 4. 5. Pressione F5 para executar o projeto. Confirme se o painel Actions est visvel. Selecione uma empresa na caixa de combinao e verifique que os itens na caixa Products Lista alterar. Selecione um produto, clique Insert no painel de aes, e verifique se os detalhes do produto foram adicionados tabela no Word. Inserir outros produtos de vrias empresas. Prximas etapas Essa explicao passo a passo mostra as noes bsicas de vinculao de dados a controles em um painel Aes no Word. Aqui esto algumas tarefas que podem vie em seguida:

Implantando o projeto. Para obter mais informaes, consulte Como implantar solues do Office:. Ligao de dados a controles no Excel. Para obter mais informaes, Vinculao de Dados para controles em um painel Aes do Excel Walkthrough:. Mostrar e ocultar controles no painel de aes. Para obter mais informaes, consulte Alterando o painel de aes de acordo com contexto do usurio Walkthrough:

Walkthrough: criar uma marca inteligente que converte Temperatures de Fahrenheit para Celsius
Essa explicao passo a passo demonstra criar uma marca inteligente que reconhece Fahrenheit seqncias de temperatura. A marca inteligente inclui uma ao que converte o valor de temperatura em Celsius, e substitui o texto reconhecido por um Celsius formatado Seqncia de temperatura. Durante este explicao passo a passo, voc aprender como:

Criar uma marca inteligente que reconhece uma expresso regular. Criar uma ao que recupera dados da marca inteligente e modifica o texto de reconhecido marca inteligente. Pr-requisitos

Para concluir esta explicao passo a passo, ser necessrio:


Microsoft Visual Studio 2005 Tools for the Microsoft Office System O Microsoft Office Word 2003. Criando um novo projeto

Nesta etapa, voc ir criar um projeto Documento do Word.

Para criar um novo projeto

Criar um projeto Documento do Word com o nome My Smart Tag, usando o Visual Basic ou C#. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

Abre o novo documento do Word no designer e adiciona o My Smart Tag projeto para Solution Explorer o Visual Studio.

Visual C# Consolidado

133

Configurando o projeto Para esta etapa, voc ir configurar o projeto para executar o cdigo fornecido nessa explicao passo a passo.

Para configurar seu projeto


1. 2. 3. 4. No menu Project, clique em Add Reference. Na guia COM, selecione biblioteca tipo 2.0 marcas inteligentes Microsoft e clique em OK. No Solution Explorer, clique com o boto direito do mouse ThisDocument.vb (em Visual Basic) ou ThisDocument.cs (em C#) e clique em View Code. Adicione a seguinte linha de cdigo para o topo do arquivo: C# using System.Text.RegularExpressions; Criando a marca inteligente Nesta etapa, voc ser criar uma Visual Studio Tools for Office marca inteligente e adicion-lo para o documento. Tambm ir adicionar uma expresso regular para a lista de termos que reconhece a marca inteligente, e criar uma ao que estar disponvel quando o usurio clica a marca inteligente.

Para criar a marca inteligente


1. Substituir manipulador ThisDocument_Startup de eventos na classe ThisDocument pelo cdigo a seguir. Este cdigo cria uma SmartTag que representa a Visual Studio Tools for Office marca inteligente, e adiciona uma expresso regular para a lista de termos que reconhece a marca inteligente. C# private Microsoft.Office.Tools.Word.Action action1; private void ThisDocument_Startup(object sender, System.EventArgs e) { Microsoft.Office.Tools.Word.SmartTag smartTag1 = new Microsoft.Office.Tools.Word.SmartTag( "www.microsoft.com/Demo#DemoSmartTag", "Demonstration Smart Tag"); smartTag1.Expressions.Add(new Regex( @"(?'number'[+-]?\b[09]+)?\s?(F|f)\b")); 2. Criar uma nova Action e adicion-lo para a Actions propriedade da marca inteligente. A Action representa um item que o usurio pode clicar no menu de marcas inteligentes. C# action1 = new Microsoft.Office.Tools.Word.Action( "Convert to Celsius"); smartTag1.Actions = new Microsoft.Office.Tools.Word.Action[] {action1}; 3. Do SmartTag anexar a marca inteligente para o documento, adicionando propriedade VSTOSmartTags. Na C#, anexar um manipulador de eventos para o Click evento da ao. C# this.VstoSmartTags.Add(smartTag1); action1.Click += new Microsoft.Office.Tools.Word.ActionClickEventHandler( action1_Click); } Criar um manipulador de eventos para a ao Nesta etapa, voc ir adicionar um manipulador de eventos para o Click evento da ao. O manipulador de eventos recupera o Fahrenheit valor de temperatura da chave number, que est no conjunto de propriedades da marca inteligente. O manipulador de eventos converte o Fahrenheit valor de temperatura para Celsius,. e substitui a seqncia reconhecido Neste exemplo, a chave number identifica um grupo capturado da expresso regular atribudo a marca inteligente. Para obter mais informaes sobre propriedade Sacos e expresses regulares em Visual Studio Tools for Office marcas inteligentes, consulte Arquitetura marcas inteligentes.

Visual C# Consolidado

134

Para criar o manipulador de eventos

Copie o cdigo a seguir para a ThisDocument classe: C# void action1_Click(object sender, Microsoft.Office.Tools.Word.ActionEventArgs e) { string value = e.Properties.get_Read("number"); double fahrenheit = Convert.ToDouble(value); int celsius = (int)(fahrenheit - 32) * 5 / 9; e.Range.Text = celsius.ToString() + "C"; } Testar o aplicativo

Agora voc pode testar seu documento para certificar-se que a marca inteligente converte Fahrenheit temperaturas para Celsius.

Para testar sua pasta de trabalho


1. 2. Pressione F5 para executar o projeto. Digitar uma seqncia que esteja de acordo com a expresso regular adicionado marca inteligente, como 60F, 60 F,. ou 60 F

Observao Para digitar um smbolo de grau (), pressione ALT e digite 248. 3. 4. Clique no cone de marca inteligente que aparece sobre a seqncia reconhecida e clique em Convert to Celsius. Confirme que a seqncia original substituda por uma nova seqncia contendo a temperatura em Celsius.

Implantando um Word ou Solution do Excel usando um manifesto Deployment Walkthrough:


Essa explicao passo a passo demonstra como implantar uma soluo o Microsoft Office Excel ou Microsoft Office Word em um compartilhamento de rede em um servidor. Ser posicionado no final do explicao passo a passo, o possvel para executar a soluo no servidor do seu computador de desenvolvimento. Em um ambiente de produo, uma Microsoft Visual Studio 2005 Tools for the Microsoft Office System soluo geralmente publicada primeiro a um servidor de teste, e depois ele reimplantado em um servidor de produo depois que o departamento de TI aprovar-. Voc nessa explicao passo a passo, ser emular esse processo, publicando uma soluo em um local temporrio no seu computador de desenvolvimento, e ento redeploying a soluo do local de publicao para um servidor. Para obter mais informaes sobre as opes para implantar a soluo, consulte Modelos de implantao. Durante este explicao passo a passo, voc aprender como:

Do Publish Wizard uso para publicar sua soluo em um local no seu computador de desenvolvimento. Manualmente relanamento a soluo do seu computador local para um compartilhamento de rede em um servidor. Modificar o manifesto do aplicativo que est incorporado no documento para apontar para o novo local manifesto de implantao programaticamente. Editar a manifesto de implantao para apontar para a nova localizao do manifesto do aplicativo externos. Editar o manifesto do aplicativo externo para apontar para o novo local do conjunto e a manifesto de implantao. Pr-requisitos

Visual C# Consolidado

135

Para concluir esta explicao passo a passo, ser necessrio:


Visual Studio Tools for Office O Word Microsoft Office 2003 ou Microsoft Office Excel 2003. Observao

Essa explicao passo a passo pressupe que voc estiver implantando uma soluo Word. Se voc quiser executar explicao passo a passo com uma soluo Excel, o substitua o nome do projeto do Word com o nome do seu projeto do Excel em todos os cdigos e exemplos XML.

Acesso a um servidor de rede para implantao. Essa explicao passo a passo pressupe que voc so redeploying sua soluo para o \\DeployServer\ShareFolder compartilhamento de rede. Privilgios de administrador no computador de desenvolvimento, para que voc possa definir a diretiva de segurana para um local de rede. Criando o projeto

Nesta etapa, voc ir criar um projeto Documento do Word.

Para criar um novo projeto

Criar um projeto Documento do Word com o nome WordDeployment. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

Abre o novo documento do Word no designer e adiciona o WordDeployment projeto para Solution Explorer o Visual Studio. Adicionar cdigo para trs o documento Nesta etapa, voc adicionar uma caixa de mensagem ao manipulador Startup de eventos do documento. Isso permitir que voc para verificar se a soluo est funcionando quando voc abre o documento rapidamente.

Para adicionar uma caixa de mensagem a um evento de inicializao


1. 2. Clique com o boto direito do mouse ThisDocument.vb no Solution Explorer, ou ThisDocument.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo ao manipulador Startup de eventos dentro a ThisDocument classe para mostrar uma caixa de mensagem durante a inicializao. C# private void ThisDocument_Startup(object sender, System.EventArgs e) { MessageBox.Show("The document is deployed correctly."); } 3. 4. 5. Pressione F5 para executar o projeto. Inicia o Word e a caixa de mensagem aparece. Fechar a caixa de mensagem. Sair do Word. Publicando a soluo Nesta etapa, voc publicar a soluo em um local temporrio no computador local.

Em seguida, voc publicar nesta soluo.

Para publicar a soluo


1. 2. Clique com o boto direito do mouse o n de projeto no Solution Explorer. Clique Publish no menu de atalho.

Visual C# Consolidado

136

O Publish Wizard aparece. 3. 4. Na caixa Specify the location to publish this application, digite C:\TestDeploy. Clique em Finish. O documento de Soluo e manifesto de implantao so copiados para C:\TestDeploy. O conjunto de soluo, atualizado manifesto do aplicativo, e cpias do documento de Soluo e manifesto de implantao so copiadas para C:\TestDeploy\WordDeployment_1.0.0.0. Para obter mais informaes, consulte Implantando o Word e Excel Solutions. 5. Feche o WordDeployment projeto no Visual Studio.

Observao O conjunto no tem permisso para executar ainda, para que ele se voc tentar executar a soluo ser lanar um erro. Voc ir atualizar sua diretiva de segurana para conceder permisso de confiana total ao conjunto em uma etapa posterior. Quando voc publicar uma soluo, o manifesto do aplicativo incorporado no aponta de documento de soluo para o caminho completo da manifesto de implantao. Se voc relanamento os arquivos de soluo para outro local, dever atualizar o manifesto do aplicativo incorporado para apontar para a nova localizao da manifesto de implantao. Voc tambm deve atualizar a manifesto de implantao e o manifesto do aplicativo externo para apontar para os novos locais de arquivo. Atualizando o manifesto Application incorporados Para editar o manifesto do aplicativo incorporado, use a ServerDocument classe que Visual Studio Tools for Office fornece. Quando voc usa a ServerDocument classe, voc deve executar o cdigo em um novo projeto (no a Visual Studio Tools for Office Soluo), como um projeto de console, e o Visual Studio Tools for Office documento de soluo deve ser fechado. Observao Inclui Visual Studio Tools for Office um Exemplo que demonstre como criar uma ferramenta que pode ser usada para editar o manifesto do aplicativo incorporado. Para obter mais informaes, consulte Aplicativo Manifest Exemplo Editor.

Para atualizar o manifesto do aplicativo incorporado


1. 2. 3. Criar um novo projeto Console Application. Do Microsoft.VisualStudio.Tools.Applications.Runtime Adicionar referncias para e System.Windows.Forms montagens para este projeto. Abra o arquivo Program.cs ou Module1.vb, e adicione a seguinte Imports ou using instruo para o topo do arquivo. C# using Microsoft.VisualStudio.Tools.Applications.Runtime; 4. Copie o cdigo a seguir para a Main funo. Este cdigo cria uma ServerDocument que fornece acesso ao manifesto do aplicativo incorporado de seu documento de soluo. O cdigo atribui o novo caminho manifesto de implantao para a DeployManifestPath propriedade, e salva e fecha o ServerDocument.. o ServerDocument C# ServerDocument sd = null; try { sd = new ServerDocument(@"C:\TestDeploy\WordDeployment.doc"); sd.AppManifest.DeployManifestPath =

Visual C# Consolidado

137

@"\\DeployServer\ShareFolder\WordDeployment.application"; sd.Save(); } finally { if (sd != null) { sd.Close(); } } 5. Pressione F5 para executar o projeto. Uma janela do console aparece rapidamente enquanto o manifesto do aplicativo incorporado est sendo atualizado, e fecha a janela do console. Atualizando o manifesto de implantao Agora que voc atualizou o manifesto do aplicativo incorporado no documento Visual Studio Tools for Office de soluo, voc deve atualizar a manifesto de implantao para apontar para a nova localizao do manifesto do aplicativo externos.

Para atualizar a manifesto de implantao


1. Abra a manifesto de implantao em um editor de texto, como o Bloco de notas. A manifesto de implantao denominado WordDeployment.application, e est localizado na pasta C:\TestDeploy de publicao. Defina o codebase atributo do elemento <dependentAssembly> como o caminho completo da localizao implantao final do manifesto do aplicativo externos. Para obter mais informaes, consulte &lt;dependentAssembly&gt; Element (Visual Studio Tools for Office Reference).O atributo para essa explicao passo a passo deve aspecto como este: <dependentAssembly codebase="\\DeployServer\ShareFolder\ WordDeployment_1.0.0.0\WordDeployment.dll.manifest" 3. Salve e feche o arquivo manifesto de implantao. Atualizando o manifesto de aplicativos externos Alm disso, para atualizar a manifesto de implantao, voc tambm deve editar o manifesto do aplicativo externo para apontar para os locais implantao final do conjunto de soluo e a manifesto de implantao. Sempre que voc publicar uma Visual Studio Tools for Office soluo, um novo manifesto do aplicativo externo gerado que aponta para a verso atual do conjunto de soluo.

2.

Para atualizar o manifesto do aplicativo externo


1. Abra o manifesto do aplicativo em um editor de texto, como o Bloco de notas. O manifesto do aplicativo denominado WordDeployment.dll.manifest, e est localizado na pasta C:\TestDeploy\WordDeployment_1.0.0.0 de publicao. Localize o <installFrom> elemento que est o filho do elemento <dependency>, e defina o codebase atributo como o caminho completo da montagem de soluo atual. Para obter mais informaes, consulte <installFrom> Element (Visual Studio Tools for Office Reference).O atributo para essa explicao passo a passo deve aspecto como este: <dependentAssembly codebase="\\DeployServer\ShareFolder\ WordDeployment_1.0.0.0\WordDeployment.dll" 3. Localize o <installFrom> elemento que est o filho do elemento <assembly>, e defina o codebase atributo para o caminho completo do manifesto de implantao. Para obter mais informaes, consulte <installFrom> Element (Visual Studio Tools for Office Reference).O atributo para essa explicao passo a passo deve aspecto como este: <dependentAssembly codebase="\\DeployServer\ShareFolder\WordDeployment.application" 4. Salve e feche o arquivo manifesto do aplicativo. Copiando os arquivos da soluo para o servidor Agora que voc tiver editado os manifestos, voc est pronto para copiar os arquivos de soluo para o servidor.

2.

Visual C# Consolidado

138

Para copiar os arquivos de soluo para o servidor


1. 2. 3. Crie uma WordDeployment_1.0.0.0 pasta sob a \\DeployServer\ShareFolder compartilhamento de arquivos de rede. Copiar o documento de Soluo e a manifesto de implantao para \\DeployServer\ShareFolder. Copiar o conjunto de soluo e o manifesto do aplicativo para \\DeployServer\ShareFolder\WordDeployment_1.0.0.0. Conceder confiana total para a pasta de rede Para execute sua Visual Studio Tools for Office soluo a partir da pasta de rede, voc deve conceder confiana total para a pasta de rede na sua diretiva de segurana no computador de desenvolvimento. Voc pode modificar a diretiva de segurana de um prompt de comando usando a ferramenta Diretiva de Segurana para Acesso ao Cdigo (Caspol.exe). Para conceder confiana para um local de rede, voc deve ter privilgios de administrador e voc dever alterar a diretiva de segurana no nvel do computador. Observao Este procedimento destinado a fim de executar essa explicao passo a passo. No use este procedimento para conceder confiana a conjuntos ou diretrios se no tiver certeza que sejam segura e protegida. Para obter mais informaes sobre concesso e remover permisses, consulte HOW TO: conceder permisses para pastas e montagens e Como remover permisses de pastas e montagens:.

Para conceder confiana total para a pasta de rede

Digite o seguinte comando no prompt de comando Studio visual: caspol -m -ag LocalIntranet_Zone -url \\DeployServer\ShareFolder\* FullTrust -n "Remote Deployment" -d "Deployment Walkthrough" Testando a soluo

Agora voc pode testar sua soluo para certificar-se que seu cdigo seja executado quando voc abre o documento a partir do computador de desenvolvimento.

Para testar a implantao


1. 2. No computador de desenvolvimento, abra o WordDeployment.doc arquivo no \\DeployServer\ShareFolder\. Confirme se a caixa de mensagem aparece. Prximas etapas Voc tambm pode implantar a soluo usando um arquivo do Microsoft Windows Installer (.msi). Para obter mais informaes, consulte Implantando um Word ou Solution do Excel usando um arquivo do Windows Installer Walkthrough:.

Implantando um Word ou Solution do Excel usando um arquivo do Windows Installer Walkthrough:


Essa explicao passo a passo demonstra como criar um arquivo do Microsoft Windows Installer (.msi) que pode ser usado para implantar uma soluo Microsoft Office Excel 2003 ou Microsoft Office Word 2003. Durante este explicao passo a passo, voc aprender como:

Visual C# Consolidado

139

Criar um projeto de instalao que voc pode usar para criar um arquivo do Windows Installer. Modifique o projeto de instalao para que o arquivo Windows Installer instala sua Microsoft Visual Studio 2005 Tools for the Microsoft Office System soluo. Adicionar uma etapa para o projeto de instalao para que Arquivo do Windows Installer edita o manifesto do aplicativo incorporados no Visual Studio Tools for Office documento de soluo.

Essa explicao passo a passo pressupe que o computador de destino j tiver os pr-requisitos instalados para executar Visual Studio Tools for Office solues. Voc cria o arquivo Windows Installer no o verificar ou instalar esses pr-requisitos. Para obter mais informaes sobre os prrequisitos para executar Visual Studio Tools for Office solues, consulte Como se preparar computadores de usurio final para executar solues do Office:. Observao Conjuntos em Visual Studio Tools for Office Solues devem ser concede confiana total na diretiva de segurana do usurio final antes da soluo seja executado. O arquivo Windows Installer voc criar nessa explicao passo a passo no No implantar a diretiva de segurana necessrio para executar a soluo. Para obter mais informaes sobre segurana em Visual Studio Tools for Office solues, consulte Requisitos de segurana para executar solues do Office e Prticas recomendadas para segurana no Office Solutions. Para obter informaes sobre como configurar a diretiva de segurana por usurio final computadores, consulte Implantao de diretiva de segurana. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Visual Studio Tools for Office O Word Microsoft Office 2003 ou Microsoft Office Excel 2003. Observao

Essa explicao passo a passo inclui etapas para criar uma soluo simples que voc pode usar em explicao passo a passo o Excel. Se voc deseja executar o explicao passo a passo com uma soluo Word ou Excel existente, comearo o explicao passo a passo no ttulo criando o Project a instalao, " " e certifique-se substituir o nome ExcelDeployment do projeto com o nome do seu projeto em todos os exemplos de cdigo e instrues. Criando o projeto Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel.

Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome ExcelDeployment. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o ExcelDeployment projeto para Solution Explorer. Adicionar cdigo para trs a pasta de trabalho Nesta etapa, voc adicionar uma caixa de mensagem ao manipulador Startup de eventos da pasta de trabalho. Isso permite que voc para verificar se a soluo est funcionando quando voc abre o documento rapidamente.

Para adicionar uma caixa de mensagem a um evento de inicializao

Visual C# Consolidado

140

1. 2.

Clique com o boto direito do mouse ThisWorkbook.vb no Solution Explorer, ou ThisWorkbook.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo ao manipulador Startup de eventos dentro a ThisWorkbook classe para mostrar uma caixa de mensagem durante a inicializao. C#

private void ThisWorkbook_Startup(object sender, System.EventArgs e) { MessageBox.Show("The workbook is deployed successfully."); } 3. 4. 5. Pressione F5 para executar o projeto. O Excel iniciado e aparecer a caixa de mensagem. Fechar a caixa de mensagem. Saia do Excel. Criar um projeto de instalao Nesta etapa, voc ir criar um projeto de instalao que voc pode compilar para criar um arquivo do Windows Installer para sua soluo. Para obter mais informaes, consulte Configurar projetos.

Em seguida, voc adicionar um projeto de instalao para sua soluo.

Para criar um projeto de instalao para a soluo


1. 2. 3. 4. 5. 6. Clique com o boto direito do mouse no n na Solution Explorer soluo. Aponte para Add no menu de atalho, e clique em New Project. A Add New Project caixa de dilogo ser exibida. No painel Project types, expanda Other Project types e selecione Setup and Deployment. No painel Templates, selecione Setup project. Nome do projeto ExcelSetup. Clique em OK. O projeto instalao aparece no Solution Explorer. Por padro, o arquivo que voc ir criar usando este projeto instalao Windows Installer inclui uma caixa de dilogo que permite ao usurio final que especifique o local de instalao da soluo. Para obter mais informaes, consulte Caixa de dilogo interface do usurio da pasta de instalao. Adicionar o pasta de trabalho e assembly da soluo para o Project da instalao Nesta etapa, voc adicionar a sada do projeto ExcelDeployment principal para o projeto de instalao. A sada do projeto ExcelDeployment principal consiste de pasta de trabalho e o conjunto de soluo.

Para adicionar o documento e conjunto ao projeto de instalao


1. 2. 3. 4. 5. 6. 7. Clique com o boto direito do mouse no ExcelSetup project n em Solution Explorer. Selecione View no menu de atalho, e depois clique em File System. Clique com o boto direito do mouse Application Folder no painel esquerdo. Aponte para Add no menu de atalho, e clique em Project Output. Selecione ExcelDeployment na caixa Project. Selecione Primary output na lista de tipos de sada. Clique em OK.

Visual C# Consolidado

141

A sada do projeto e dependncias aparecem no painel direito. 8. 9. No Solution Explorer, expanda Detected Dependencies sob o ExcelSetup n de projeto. Clique com boto direito mouse cada dependncia, exceto para Microsoft .NET Framework, e clique Exclude no menu de atalho. Criar um projeto de ao personalizada Nesta etapa, voc ir criar um projeto que contm aes personalizadas para o projeto de instalao. Aes personalizadas so um recurso do Windows Installer que permitem a voc para executar cdigo no final de uma instalao para executar aes que no podem ser executadas durante a instalao. Para obter mais informaes, consulte Aes Personalizadas.

Para criar um projeto ao personalizada


1. 2. 3. 4. 5. 6. 7. Clique com o boto direito do mouse no n na Solution Explorer soluo. Aponte para Add no menu de atalho, e clique em New Project. A Add New Project caixa de dilogo ser exibida. No painel Project types, expanda o n para a linguagem de programao, e selecione Windows. No painel Templates, selecione Class Library. Nome do projeto ExcelCustomAction. Clique em OK. O novo projeto aparece na Solution Explorer. No Solution Explorer, clique com o boto direito do mouse Class1.vb ou Class1.cs sob o ExcelCustomAction projeto e, em seguida, clique em Delete. Este arquivo desnecessrio para essa explicao passo a passo. Criar uma ao personalizada que salvas o manifesto de aplicativo Quando voc executava seu projeto anteriormente nessa explicao passo a passo pelo pressionamento F5, a processo de criao editado o manifesto do aplicativo incorporado na pasta de trabalho para aponte para o caminho relativo do conjunto. Se a pasta de trabalho e o conjunto permanecer na mesma pasta aps a instalao, ento voc no precisam modificar o manifesto do aplicativo incorporado, e voc pode ignorar esta seo. No entanto, se voc quiser que o usurio possa mover a pasta de trabalho para uma pasta diferente aps a instalao, voc deve editar o manifesto do aplicativo para apontar para o caminho completo da montagem. Voc deve atualizar o manifesto do aplicativo que est incorporado no Visual Studio Tools for Office documento de Soluo ao executar uma ao personalizada aps a instalao, porque o local do conjunto de soluo desconhecido at que o usurio especifica o local durante a instalao. Editar o manifesto do aplicativo incorporado, usando a ServerDocument classe. Para usar a ServerDocument classe no projeto de instalao, adicione cdigo para uma Installer classe dentro do projeto ao personalizada.

Para criar uma ao personalizada que edita o manifesto do aplicativo


1. 2. 3. 4. Clique com o ExcelCustomAction projeto no Solution Explorer. Aponte para Add no menu de atalho, e clique em New Item. A Add New Item caixa de dilogo ser exibida. Selecionar Installer Class, e nome da classe ManifestEditor. Adicione uma referncia ao conjunto Microsoft.VisualStudio.Tools.Applications.Runtime para o ExcelCustomAction projeto.

Visual C# Consolidado

142

5. 6.

Do ManifestEditor.cs clique com o boto direito do mouse no Solution Explorer, ou ManifestEditor.vb arquivo e clique em View Code. Adicione a instruo seguinte Imports ou using para o topo do arquivo de cdigo. C#

using Microsoft.VisualStudio.Tools.Applications.Runtime; 7. Copie o cdigo a seguir para a ManifestEditor classe. Esse cdigo substitui o Install mtodo, que usado para executar aes Instalao personalizada. O cdigo define o local de instalao especificado pelo usurio para a AssemblyPath propriedade. O caminho de instalao especificado pelo usurio e os nomes do documento e conjunto so obtidas a partir da Parameters propriedade. C# // Override the Install method to update the customization location // in the application manifest. public override void Install(System.Collections.IDictionary stateSaver) { UpdateApplicationManifest(); base.Install(stateSaver); } // Update the application manifest according to the the install location. private void UpdateApplicationManifest() { // Get the parameters passed to the task. string targetDir = this.Context.Parameters["targetdir"]; string documentName = this.Context.Parameters["documentname"]; string assemblyName = this.Context.Parameters["assemblyname"]; // Get the application manifest from the document. string documentPath = System.IO.Path.Combine(targetDir, documentName); ServerDocument serverDocument1 = new ServerDocument(documentPath, System.IO.FileAccess.ReadWrite); try { AppManifest appManifest1 = serverDocument1.AppManifest; string assemblyPath = System.IO.Path.Combine(targetDir, assemblyName); appManifest1.Dependency.AssemblyPath = assemblyPath; serverDocument1.Save(); } finally { if (serverDocument1 != null) { serverDocument1.Close(); } } } 8. Clique com o ExcelCustomAction projeto no Solution Explorer, e, em seguida clique em Build. Adicionando a ao personalizada ao projeto de instalao Nesta etapa, voc adicionar a sada do projeto ExcelCustomAction principal para o projeto de instalao. Isso permite que o arquivo Windows Installer para executar a ao personalizada que edita o manifesto do aplicativo.

Para adicionar a sada primria do projeto ao personalizada ao projeto de instalao


1. 2. 3. 4. 5. 6. 7. 8. 9. Clique com o boto direito do mouse no ExcelSetup project n em Solution Explorer. Aponte para View no menu de atalho, e clique em Custom Actions. O Custom Actions Editor, clique com boto direito no n e Install Clique em Add Custom Action. Na caixa Look In Selecionar Application Folder, e clique em Add Output Selecione ExcelCustomAction na caixa Project. Selecione Primary output na lista de tipos de sada, e depois clique em OK. Verifique que Primary output from ExcelCustomAction (Active) foi adicionado lista de sadas primria para o projeto de instalao e clique em OK Em expandir Install. o Custom Actions Editor, Clique com o boto direito do mouse Primary output from ExcelCustomAction (Active) e, em seguida clique em Properties Window.

Visual C# Consolidado

143

10. Na janela Properties, defina a CustomActionData propriedade para a seguinte seqncia: /targetdir="[TARGETDIR]/" /documentname="ExcelDeployment.xls" /assemblyname="ExcelDeployment.dll" Para obter informaes sobre a CustomActionData propriedade, consulte Propriedade CustomActionData. 11. Clique com o boto direito do mouse e, em seguida clique em Build. Em Solution Explorer, o ExcelSetup project Teste a instalao Agora voc pode testar a soluo para garantir que sua soluo instalada quando voc executar o arquivo do Windows Installer no seu computador de desenvolvimento.

Para testar a instalao


1. 2. 3. 4. Clique com o boto direito do mouse e, em seguida clique em Run. Em Solution Explorer, o ExcelSetup project Siga as instrues no Assistente de Instalao, e especificar uma pasta de instalao no seu computador de desenvolvimento. Abrir a pasta de trabalho do Excel a partir da pasta de instalao. Confirme se a caixa de mensagem aparece.

Passo-a-passo: Concedendo e removendo permisses para uma soluo do Office


Essa explicao passo a passo demonstra as noes bsicas de segurana no Microsoft Visual Studio 2005 Tools for the Microsoft Office System. Durante este explicao passo a passo, voc aprender como:

Remova a configurao de segurana padro. Adicionar um novo conjunto de permisses. Testar seu projeto. Pr-requisitos

Para concluir esta explicao passo a passo, ser necessrio:


Visual Studio Tools for Office Microsoft Office Excel 2003. Criando o projeto

Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel.

Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome My Security Test. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Security Test projeto para Solution Explorer. Adicionar cdigo para trs a planilha Nesta etapa, voc adicionar uma caixa de mensagem a um evento de inicializao da planilha.

Para adicionar uma caixa de mensagem a um evento de inicializao Visual C# Consolidado 144

1. 2. 3.

Verifique se a My Security Test.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo para o Startup mtodo dentro classe Sheet1 para mostrar uma caixa de mensagem durante a inicializao. C#

private void Sheet1_Startup(object sender, System.EventArgs e) { MessageBox.Show("Security settings are correct."); } 4. 5. 6. 7. 8. 9. No menu File, clique em Save All. Na caixa Save Project de dilogo, digite C:\Walkthroughs na caixa Location. Clique em Save. Pressione F5 para executar o projeto. O Excel iniciado e aparecer a caixa de mensagem. Fechar a caixa de mensagem. Feche o Excel.

10. No designer do Visual Studio, localize e selecione na guia para My Security Test.xls. 11. Feche My Security Test.xls (a superfcie do design de planilha Excel) no designer do Visual Studio. Feche todos os instncias do Excel antes de alterar a diretiva de segurana. Quando voc criado o projeto de pasta de trabalho do Excel, o assistente adicionado um novo grupo de cdigo de segurana e um grupo de cdigos filho diretiva de segurana Runtime no nvel do usurio. Em seguida, voc remover o grupo de cdigos que criou o assistente. Remover o grupo de cdigos padro Localize e remova o grupo de cdigo padro que foi criado.

Para remover um grupo de cdigos


1. 2. 3. No Painel de Controle, abra Administrative Tools. Executar Microsoft .NET Framework 2.0 Configuration. No modo de exibio de rvore no lado esquerdo, expanda .NET Framework 2.0 Configuration,, expandir Runtime Security Policy, expandir User, expandir Code Groups, Expandido All_Code e My Computer expanda VSTOProjects. No um GUID para cada projeto tenha criado. Expanda cada GUID para ver o caminho para o documento associado. 4. Clique com o boto direito do mouse o GUID de C:\Walkthroughs\My Security Test\My Security Test\bin\My Security Test.xls grupo de cdigos, e, em seguida clique Delete no menu de atalho. Ser exibida uma caixa de dilogo perguntando se voc tiver certeza que deseja excluir este grupo de cdigos. 5. 6. Clique em Yes. Voltar para Visual Studio, e pressione F5 para executar o projeto meu teste de segurana.

Visual C# Consolidado

145

Ser exibida informando a atual poltica de segurana .NET permite que no no que a personalizao para executar uma mensagem de erro. 7. 8. Clique em OK. Feche o Excel.

O conjunto no pode ser executado se ele no tiver permisso explcita na Diretiva de Segurana Microsoft .NET. Em seguida, conceda permisso para o conjunto usando um nome forte em vez de uma URL para prova. Dando um nome de alta segurana para o conjunto Um nome forte geralmente mais seguro que uma URL como prova. Ser criar e atribuir um nome forte o conjunto nas prximas etapas.

Para criar um nome forte


1. 2. 3. 4. 5. 6. 7. 8. No menu Project no Visual Studio, clique em My Security Test Properties. Clique na Signing guia. Selecione Sign the assembly. No, o Choose a strong name key file list clique New. Na caixa Create Strong Name Key de dilogo, digite SecurityTestKey na caixa Key file name. Desmarque a Protect my key file with a password caixa de seleo. Clique em OK. O arquivo SecurityTestKey.snk de chave aparece no Solution Explorer. No menu Build, clique em Build Solution Para criar o conjunto contra o par de chaves nome forte. Conceder confiana com base no nome de alta segurana Agora adicionar um novo grupo de cdigo para conceder confiana total para o conjunto com base no nome forte.

Para conceder confiana com base em nome forte


1. 2. 3. 4. 5. 6. Abra Microsoft .NET Framework 2.0 Configuration novamente. Clique com o boto direito do mouse no VSTOProjects n e clique New no menu de atalho Digite o nome Security Test Strong Name para o novo grupo de cdigos, e clique em Next. Na lista Choose the condition type for this code group, clique Strong Name. Clique em Import. Procure C:\Walkthroughs\My segurana Test\My segurana Test.dll segurana Test\bin\My para Visual Basic ou C:\Walkthroughs\My segurana Test\My segurana Test.dll segurana Test\bin\debug\My no C#, e clique em Open. Clique em Next. Clique Next para aceitar o FullTrust conjunto de permisses e clique em Finish. Fechar Microsoft .NET Framework 2.0 Configuration. Testar o aplicativo

7. 8. 9.

Visual C# Consolidado

146

Agora voc pode testar sua pasta de trabalho para certificar-se que seu cdigo seja executado quando a pasta de trabalho aberta.

Para testar sua pasta de trabalho


1. 2. Pressione F5 para executar o projeto. Confirme se a caixa de mensagem aparece.

COMO: Adicionar Controles a Documentos do Office


Um controle um componente no documento usado para exibir informaes ou aceitar entrada do usurio. Voc pode adicionar controles Windows Forms para o Microsoft Office Excel 2003 e Microsoft Office Word 2003 documentos em tempo de criao ou em tempo de execuo. Por exemplo, voc pode adicionar um ComboBox controle a sua planilha para que os usurios possa selecionar em uma lista de opes. Voc tambm pode adicionar controles host, como controles Bookmark e NamedRange controles, para documentos do Office. Para obter mais informaes, consulte Controles host do Word e Controles host do Excel. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Adicionando controles em tempo de design

Para arrastar um Windows Forms controle para o documento


1. Crie ou abra um projeto de pasta de trabalho do Excel ou projeto Documento do Word no Visual Studio para que o documento fique visvel no designer. Para obter informaes sobre como criar projetos, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Na guia Common Controls Da Clique no controle que voc deseja adicionar e arrasteo para o documento. o Toolbox,

2.

Observao Quando voc seleciona um controle no Excel, voc ver =EMBED("WinForms.Control.Host","") no Formula Bar. Este texto necessrio e no devem ser excludos.

Para desenhar um Windows Forms controle sobre o documento


1. Crie ou abra um projeto de pasta de trabalho do Excel ou projeto Documento do Word no Visual Studio para que o documento fique visvel no designer. Para obter informaes sobre como criar projetos, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Na guia Common Controls da caixa de ferramentas, clique no controle voc deseja adicionar. No documento, clique no local em que a extremidade superior esquerda do controle para ser localizado, e arraste para onde voc deseja o canto inferior-direito do controle seja localizado. O controle adicionado para o documento com o local especificado e tamanho. Observao Quando voc seleciona um controle no Excel, voc ver =EMBED("WinForms.Control.Host","") no Formula Bar. Este texto necessrio e no devem ser excludos.

2. 3.

Visual C# Consolidado

147

Para adicionar um controle Windows Forms para o documento clicando uma nica vez sobre o controle
1. Crie ou abra um projeto de pasta de trabalho do Excel ou projeto Documento do Word no Visual Studio para que o documento fique visvel no designer. Para obter informaes sobre como criar projetos, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Na guia Common Controls Da clique Toolbox, o controle voc deseja adicionar Um documento, clique onde desejar o controle a ser adicionado. O controle adicionado ao documento com o tamanho padro. Observao Quando voc seleciona um controle no Excel, voc ver =EMBED("WinForms.Control.Host","") no Formula Bar. Este texto necessrio e no devem ser excludos.

2. 3.

Para adicionar um controle Windows Forms para o documento clicando duas vezes no controle
1. Crie ou abra um projeto de pasta de trabalho do Excel ou projeto Documento do Word no Visual Studio para que o documento fique visvel no designer. Para obter informaes sobre como criar projetos, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Na guia Common Controls Controle voc deseja para adicionar de clique duplo no Toolbox. O controle adicionado para o documento no centralizar do documento ou painel ativo. Observao Quando voc seleciona um controle no Excel, voc ver =EMBED("WinForms.Control.Host","") no Formula Bar. Este texto necessrio e no devem ser excludos.

2.

Para adicionar um controle Windows Forms para o documento, pressionando a tecla ENTER
1. Crie ou abra um projeto de pasta de trabalho do Excel ou projeto Documento do Word no Visual Studio para que o documento fique visvel no designer. Para obter informaes sobre como criar projetos, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Na guia Common Controls Da Clique no controle que voc deseja adicionar e pressione a tecla ENTER. o Toolbox, O controle adicionado para o documento no centralizar do documento ou painel ativo. Observao Quando voc seleciona um controle no Excel, voc ver =EMBED("WinForms.Control.Host","") no Formula Bar. Este texto necessrio e no devem ser excludos. Voc tambm pode adicionar controles Windows Forms dinamicamente a um documento em tempo de execuo usando os mtodos auxiliar fornecidos pelo Microsoft Visual Studio 2005 Tools for the Microsoft Office System. No Exemplo abaixo, clula A1 de um projeto de aplicativo Excel. adicionado um Button Para obter informaes sobre como adicionar outros controles Windows Forms, consulte Adicionar controles a documentos do Office em tempo de execuo. Adicionando controles em tempo de execuo

2.

Para adicionar um Windows Forms controlar programaticamente

Visual C# Consolidado

148

No manipulador Startup de eventos de ThisWorkbook, insira o cdigo a seguir para adicionar clula C5: um Button C# private void Sheet1_Startup(object sender, System.EventArgs e) { Microsoft.Office.Tools.Excel.Controls.Button salesButton; salesButton = this.Controls.AddButton(this.get_Range("C5", missing), "salesButton"); salesButton.Text = "Calculate Total Sales"; }

COMO: Executar Clculos do Excel por Programao


O Calculate mtodo executa todos os clculos no objeto especificado. Use o mtodo do objeto que limita o intervalo de clculo para o menor nmero de clulas que voc deseja recalcular. O mecanismo de reclculo do Microsoft Office Excel 2003 muito rpido, mas se voc pode limitar o nmero de clulas envolvidas, voc pode otimizar a operao. Executar clculos para um intervalo

Para executar clculos em um controle NamedRange


1. Criar o intervalo nomeado. C# Microsoft.Office.Tools.Excel.NamedRange NamedRange1 = this.Controls.AddNamedRange(this.get_Range("A1", missing), "NamedRange1"); 2. Chame o Calculate mtodo do intervalo especificado. C# NamedRange1.Calculate();

Executar clculos para o aplicativo inteiro Para executar clculos em todas as pastas de trabalho abertas

Chame o Calculate mtodo do objeto Application. C# this.Application.Calculate(); Compilando o cdigo

Este cdigo deve ser colocado em uma classe folha, no na classe ThisWorkbook.

Como: Criar menus do Office programaticamente


Este Exemplo cria um menu chamado New Menu na barra de menus do Microsoft Office Excel 2003. O novo menu colocado esquerda do menu Help. Ele contm um comando de menu. Quando o comando de menu for clicado, texto ser inserido em uma clula na Sheet1. Para obter um Exemplo de personalizao interface de usurio no Microsoft Office Word 2003, consulte COMO: Criar Barras de Ferramentas do Office por Programao e Walkthrough: Criando menus de atalho para indicadores. Adicione o seguinte cdigo classe ThisWorkbook. Observao Defina a Tag propriedade nos controles quando voc adiciona manipuladores de eventos. Office usa a Tag propriedade para manter controle de manipuladores de eventos para um especfico

Visual C# Consolidado

149

CommandBarControl. Se a Tag propriedade estiver em branco, os eventos no so tratados corretamente.

Observao Declarar o variveis menu no nvel de classe INSTEAD OF dentro o mtodo onde eles so chamados. Isso garante que as variveis menu permanecer no escopo, desde que o aplicativo est sendo executado. Caso contrrio, o item ser removido do coleta de lixo em algum momento indeterminado, e seu cdigo do manipulador de eventos pra de funcionar. Exemplo C# // Declare the menu variable at the class level. private Office.CommandBarButton menuCommand; private string menuTag = "A unique tag"; // Call AddMenu from the Startup event of ThisWorkbook. private void ThisWorkbook_Startup(object sender, System.EventArgs e) { CheckIfMenuBarExists(); AddMenuBar(); } // If the menu already exists, remove it. private void CheckIfMenuBarExists() { try { Office.CommandBarPopup foundMenu = (Office.CommandBarPopup) this.Application.CommandBars.ActiveMenuBar.FindControl( Office.MsoControlType.msoControlPopup, System.Type.Missing, menuTag, true, true); if (foundMenu != null) { foundMenu.Delete(true); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } // Create the menu, if it does not exist. private void AddMenuBar() { try { Office.CommandBarPopup cmdBarControl = null; Office.CommandBar menubar = (Office.CommandBar)Application.CommandBars.ActiveMenuBar; int controlCount = menubar.Controls.Count; string menuCaption = "&New Menu"; // Add the menu. cmdBarControl = (Office.CommandBarPopup)menubar.Controls.Add( Office.MsoControlType.msoControlPopup, missing, missing, controlCount, true); if (cmdBarControl != null) { cmdBarControl.Caption = menuCaption; // Add the menu command. menuCommand = (Office.CommandBarButton)cmdBarControl.Controls.Add( Office.MsoControlType.msoControlButton, missing, missing, missing, true); menuCommand.Caption = "&New Menu Command"; menuCommand.Tag = "NewMenuCommand"; menuCommand.FaceId = 65; menuCommand.Click += new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler( menuCommand_Click); } } catch (Exception e) { MessageBox.Show(e.Message); } } // Add text to cell A1 when the menu is clicked. private void menuCommand_Click(Microsoft.Office.Core.CommandBarButton Ctrl, ref bool CancelDefault) { Globals.Sheet1.Range["A1", missing].Value2 = "The menu command was clicked."; }

COMO: Criar Barras de Ferramentas do Office por Programao


Este Exemplo cria uma barra de ferramentas denominada Teste no Microsoft Office Word 2003. Ele aparece perto no meio do documento e contm dois botes. Quando um boto clicado, uma caixa de mensagem aparece. Para obter um Exemplo de personalizao a interface do usurio do Office no Microsoft Office Excel 2003, consulte Como: Criar menus do Office programaticamente. Adicione o seguinte cdigo classe ThisDocument. Observao Declarar o variveis barra de comando no nvel de classe INSTEAD OF dentro o mtodo onde eles so chamados. Isso garante que as variveis barra comando permanecer no escopo, desde que o aplicativo est sendo executado. Caso contrrio, o item ser removido do lixo e seu cdigo do manipulador de eventos no executado. Exemplo C#

Visual C# Consolidado

150

// Create the command bar variables at the class level. Office.CommandBar commandBar; Office.CommandBarButton firstButton; Office.CommandBarButton secondButton; private void ThisDocument_Startup(object sender, System.EventArgs e) { AddToolbar(); } private void AddToolbar() { try { commandBar = Application.CommandBars["Test"]; } catch (ArgumentException e) { // Toolbar named Test does not exist so we should create it. } if (commandBar == null) { // Add a commandbar named Test. commandBar = Application.CommandBars.Add("Test", 1, missing, true); } try { // Add a button to the command bar and an event handler. firstButton = (Office.CommandBarButton)commandBar.Controls.Add(1, missing, missing, missing, missing); firstButton.Style = Office.MsoButtonStyle.msoButtonCaption; firstButton.Caption = "button 1"; firstButton.Tag = "button1"; firstButton.Click += new Office._CommandBarButtonEvents_ClickEventHandler(ButtonClick); // Add a second button to the command bar and an event handler. secondButton = (Office.CommandBarButton)commandBar.Controls.Add(1, missing, missing, missing, missing); secondButton.Style = Office.MsoButtonStyle.msoButtonCaption; secondButton.Caption = "button 2"; secondButton.Tag = "button2"; secondButton.Click += new Office._CommandBarButtonEvents_ClickEventHandler(ButtonClick); commandBar.Visible = true; } catch (ArgumentException e) { MessageBox.Show(e.Message); } } // Handles the event when a button on the new toolbar is clicked. private void ButtonClick(Office.CommandBarButton ctrl, ref bool cancel) { MessageBox.Show("You clicked: " + ctrl.Caption); }

Visual C# Consolidado

151

DESENVOLVIMENTO CORPORATIVO (VISUAL C#)


Voc pode programar em C# para desenvolver uma variedade de aplicativos corporativos, executando em arquiteturas baseadas em servidor e produtos de servidor. A seo Servidores e desenvolvimento da empresa da biblioteca MSDN contm a orientao de arquitetura, informaes de padres e prticas, e documentao e artigos tcnicos sobre o uso dos produtos de servidor Microsoft, incluindo:

O Microsoft SQL Server Microsoft BizTalk Server Servidor Microsoft Commerce Microsoft Content Management Server Microsoft Exchange Server Microsoft Host Integration Server Microsoft Internet Security and Acceleration Server 2000 Microsoft Business Solutions Microsoft MapPoint Microsoft Speech Server

PROGRAMAO DO TABLET PC (VISUAL C#)


O Tablet PC um computador pessoal suportado pelo Microsoft Windows XP que voltado para aplicativos que permitem a entrada por ink, caneta e voz. A combinao de software e hardware em um Tablet PC permite esses mtodos de interao do usurio e permite que uma experincia de computao para usurios rica, interativa e produtiva. A plataforma Tablet PC engloba o Windows XP e suas extenses que permitem entrada e sada de dados de texto manuscrito e voz em um Tablet PC assim como o intercmbio desses dados com outros computadores. Para obter mais informaes, consulte Windows XP Tablet PC Edition no MSDN Online e o Centro de Desenvolvimento Tablet e Mobile PC.

UDIO, VDEO, JOGOS E ELEMENTOS GRFICOS (VISUAL C#)


Voc pode usar o Visual C# para criar aplicativos multimdia baseados no DirectX para tecnologias Windows Media e Cdigo Gerenciado. O DirectX gerenciado Microsoft DirectX um conjunto avanado de interfaces de programao (API) de aplicativo multimdia incorporados ao sistemas operacionais Microsoft Windows. O DirectX fornece uma plataforma de desenvolvimento padro para PCs baseados no Windows permitindo aos desenvolvedores de software acessarem recursos de hardware especializado sem precisar escrever cdigos especficos de hardware. Essa tecnologia primeiro foi apresentada em 1995 e

Visual C# Consolidado

152

um padro reconhecido para o desenvolvimento de aplicativos de multimdia na plataforma Windows. DirectX uma tecnologia do Windows que permite maior desempenho em grficos, incluindo elementos grficos em quatro cores, vdeo, e animao 3D, e som, incluindo som surround, quando voc est executando jogos ou assistindo vdeo no seu PC. Para obter mais informaes sobre o uso do DirectX em aplicativos C#, consulte DirectX 9.0 para cdigo gerenciado no MSDN Online e o Microsoft DirectX Developer Center. O Windows Media Player O controle Windows Media Player ActiveX pode ser usado em aplicativos C# para adicionar capacidade de reproduo de udio e vdeo. O Microsoft Windows Media Player 10 Software Development Kit (SDK) fornece informaes e ferramentas para personalizar o Windows Media Player e para usar o controle Windows Media Player ActiveX. O SDK inclui documentao e exemplos de cdigos mostrando como usar o controle Media Player ActiveX de um aplicativo C#. Para mais informaes, consulte O Windows Media Player 10 SDK no MSDN Online. Windows Media Encoder O Windows Media Encoder 9 Series SDK pode ser programado usando C# para executar os seguintes tipos de tarefas:

Transmitir contedo ao vivo. Uma organizao de notcias pode usar a Automation API para agendar a captura automtica e transmisso de contedo ao vivo. Por exemplo, departamentos de transporte local podem transmitir imagens reais das condies de trnsito em vrios pontos crticos, alertando os motoristas dos congestionamento de trfego e os informando de rotas alternativas. Contedo de processamento em lote. Uma organizao de produo de mdia que deve processar um volume alto de arquivos grandes pode criar um processo em lotes que usa a Automation API repetidamente para capturar e codificar fluxos, um aps o outro. Uma empresa pode usar a Automation API para gerenciar seus servios de mdia de fluxo com uma linguagem de script preferencial e o Windows Script Host. Windows Script Host um host independente de linguagem que pode ser usado para executar qualquer mecanismo de script no Microsoft Windows 95 ou posterior, Windows NT, ou sistemas operacionais Windows 2000 Criar uma interface de usurio personalizada. Um provedor de servio Internet (ISP) pode criar uma interface que usa a funcionalidade da Automation API para capturar, codificar, e transmitir fluxos de mdia. Como alternativa, voc pode usar as interfaces de usurio predefinidas dentro da Automation API para a mesma finalidade. Administrar aplicativos do Windows Media Encoder remotamente. Voc pode usar a Automation API para executar, solucionar problemas, e administrar aplicativos do Windows Media Encoder em um computador remoto.

Para mais informaes, consulte Windows Media Encoder 9 Series SDK no MSDN Online. O tpico Programao C# descreve quais referncias incluir ao trabalhar em C#. O Windows Media Server O Microsoft Windows Media Services 9 Series Software Development Kit (SDK) uma poderosa Application Programming Interface (API) baseada em automao projetada para qualquer pessoa que deseje desenvolver um aplicativo Windows Media Services 9 Series. Voc pode usar este SDK no C# programaticamente para gerenciar um servidor do Windows Media para enviar contedo de mdia digital a clientes em redes que permitem unicast e multicast. Para mais informaes, consulte Windows Media Services 9 Series SDK.

Visual C# Consolidado

153

CRIANDO STARTER KITS (VISUAL C#)


Um Starter Kit contm cdigo para um aplicativo completo e documentao sobre como modificar ou expandir o aplicativo. O Visual C# 2005 fornece dois Starter Kits que voc pode acessar a partir da caixa de dilogo New Project. Voc tambm pode criar seus prprios Starter Kits para ajudar os usurios obter e executar rapidamente em qualquer tipo de aplicativo. Criar um Starter Kit fundamentalmente o mesmo que criar um modelo de projeto normal, a nica diferena que um Starter Kit contm arquivos de documentao que esto definidos para abrir um projeto com base no Starter Kit quando for criado. Para mais informaes, consulte Introduo ao Starter Kits.

Visual C# Consolidado

154

MIGRANDO PARA O VISUAL C#


Esta seo apresenta sintaxe C# e conceitos para desenvolvedores que estiver migrando de outras linguagens de programao. Ele tambm contm a documentao de referncia do Java converso Assistente, que voc pode usar para converter origem linguagem Java em Cdigo fonte C# idioma.

C# para desenvolvedores Java


Os tpicos nesta seo fornecem uma introduo linguagem C# e o .NET Framework. Nesta seo

A linguagem de programao C# para desenvolvedores Java Exemplos de cdigo C# para desenvolvedores Java Tipos de aplicativos C# para desenvolvedores Java

Convertendo aplicativos Java para Visual C#


Fornece Microsoft Visual Studio 2005 a capacidade para converter projetos criados no Visual J ++ . verso 6.0 ou escrito em linguagem Java para Visual C# para que voc pode tirar proveito do .NET Framework Java Language Conversion Assistente gera um novo Visual C# projeto de um J visual existente ++ 6.0 projeto ou idioma Java-arquivos. O assistente Java Language Conversion assistente torna fcil a converter os arquivos existentes.

Para desenvolvedores C++ C#


A tabela a seguir contm importantes comparaes entre C# e C++ nativo, que no usa /clr. Se voc for um programador C++, esta tabela permitir que voc as diferenas entre duas linguagens de relance as mais importantes. Observao Projetos C# e C++ so derivados dos modelos de projetos diferentes. Para obter mais informaes sobre as diferenas entre projetos C++ e C#, consulte Gerenciamento item no projetos e Usando Solution Explorer.

Recurso Herana: em C++, classes e estruturas so praticamente idnticas enquanto em C#, eles so bem diferentes. Classes C# pode implementar qualquer nmero de interfaces, mas pode herdar de apenas uma classe base. Alm disso, estruturas C# no oferece suporte a herana, e no oferecerem suporte para construtores padro explcito (um fornecida por padro). Matrizes: em C++ uma matriz simplesmente um ponteiro. No C#, matrizes so objetos que incluem mtodos e propriedades. Por exemplo, o tamanho de uma matriz pode ser consultado via a Length propriedade. Matrizes C# tambm empregar Indexadores que verificam cada ndice usado para acessar a matriz. A sintaxe de declarao matrizes C# diferente do idioma para matrizes C++: os smbolos [] " " aparecer aps o tipo de matriz no C#, no a varivel. Booleans: em C++, o bool tipo essencialmente um inteiro. Em C#, h

Consulte o tpico Classe Interface struct (Referncia do C#)

Matrizes (Guia de programao do C#) Indexadores (guia de programao C#)

bool

Visual C# Consolidado

155

nenhuma converso entre o bool tipo e outros tipos. O long tipo enquanto em C++, ele est 32 bits.: em C#, o long tipo 64 bits, Passar parmetros: em C++, todas as variveis so passados por valor, a menos que explicitamente passados com um ponteiro ou uma referncia. Do ref no C#, classes so passados por referncia e estruturas so passadas pelo valor a menos que explicitamente passados por referncia com ou out modificadores de parmetro. A switch instruo: ao contrrio a instruo C++ switch, C# no oferece suporte through fall-de um rtulo case para outro. Representantes: representantes C# so aproximadamente semelhantes aos indicadores de funo em C++, so de tipo seguro e segura. Mtodos de classe base: C# oferece suporte a base palavra-chave para chamar os membros de substitudo classe base de classes derivadas. Alm disso, substituir mtodos virtual ou abstract explcito em C#, usando a override palavra-chave. Ocultando mtodo: C++ oferece suporte a implcito " ocultar " do mtodo atravs de herana. Em C#, voc deve usar o new modificador para explicitamente ocultar um membros herdadas Diretivas de pr-processamento so usadas para compilao condicional. Nenhum arquivo de cabealho so usados em C#. A manipulao de exceo e exceo acionada.: C# fornece palavrachave finally para fornecer para cdigo que deve ser executado independentemente de se Operadores C# e typeof.: C# oferece suporte, como is operadores adicionais Ele tambm apresenta funcionalidade diferente para alguns operadores lgicos. long struct Classe (referncia) C# ref Fora (referncia C#) Alternar Delegar Base Consulte tambm os exemplos para Substituir Novo

Directives Preprocessor C# finally tryfinally try-catch& Operator Operador | Operador ^ TypeOf extern

Palavra-chave extern: em C++, extern usado para importar tipos. No C#, extern usada para criar aliases para usar verses diferentes do mesmo conjunto. Palavra-chave static: em C++, static pode ser usado tanto para declarar entidades nvel de classe e para declarar tipos que so especficos para um mdulo. No C#, static s usada para declarar entidades nvel de classe. O Main mtodo em C# declarado de forma diferente da funo main em C++. Em C#, ele seja maiscula e sempre static. Alm disso, o suporte para processamento de argumentos de linha de comando muito mais robusta em C#. Ponteiros so permitidos em C#, mas somente no unsafe modo. Sobrecarga operadores ser executada de maneira diferente em C#. Seqncias: em C++ uma seqncia simplesmente um arra de caracteres. Em C#, seqncias so objeto que oferecem suporte robustos mtodos de pesquisa. Palavra-chave foreach permite-lhe percorrer matrizes e colees.

static

Main() e argumentos de linha de comando (Guia de programao C#) No seguro Operadores C# string String foreach, em

Visual C# Consolidado

156

Globals: em C#, no h suporte para mtodos globais e variveis Mtodos e variveis precisa estar contidos em ou struct. um class Importando Tipos: em C++, tipos comuns a vrios mdulos so colocados em arquivos de cabealho. No C#, essas informaes est disponveis atravs de metadados. Variveis locais em C# no podem ser usadas antes que eles sejam inicializados. Gerenciamento de memria: C++ no uma linguagem de lixo coletado; memria que no explicitamente Release permanece alocada at que o processo termina. C# uma linguagem de lixo coletado. Destructors: C# tem sintaxe diferente para deterministically liberando recursos no gerenciados. Construtores: similar ao C++, se voc no fornecer um construtor de classe em C#, um construtor padro gerado automaticamente para voc. O construtor padro inicializa todos os campos para seus valores padro. C# no oferece suporte campos Bit. Servios de entrada / sada C# e formatao contam com a biblioteca de tempo de execuo do .NET Framework. Em C#, parmetros de mtodo no podem ter valores padro. Use overloads mtodo se voc desejar obter o mesmo efeito. Em C#, tipos genricos e mtodos fornecem para parametrizao Tipo de uma maneira que semelhante aos modelos C++, embora existem diferenas significativas. Palavra-chave as semelhante a um efeito padro, exceto que em vez de acionar uma exceo se falhar a converso, o valor de retorno nulo. Isso semelhante ao uso static_cast em C++, que,. diferente dynamic_cast, executa nenhuma verificao em tempo de execuo e, portanto, no no acionar uma exceo na falha

Estrutura geral de um programa C# Usando Viso Geral Sobre Metadados Mtodos (Guia de programao do C#) Coleta de Lixo

Destructors Instruo using (Referncia do C#) Construtores da instncia Tabela de valores padro Campos bit C++ Tour linguagem C# Formatao numrica tabela de resultados Compilador CS0241 de erro Generics em C#

Como referncia (C#)

Para obter mais informaes sobre comparaes entre palavras-chave em C# e outras linguagens de programao, consulte Equivalentes do idioma. Para obter informaes sobre a estrutura geral do aplicativos C#, consulte Estrutura geral de um programa C# (guia de programao C#).

Visual C# Consolidado

157

GUIA DE PROGRAMAO C#
Esta seo fornece informaes detalhadas sobre vrios recursos chaves da linguagem C# acessveis atravs do .NET Framework. Sees de idioma Em um programa C# Main() e argumentos de linha de comando (Guia de programao C#) Tipos de dados (guia de programao C#) Matrizes (Guia de programao do C#) Seqncias (guia de programao C#) Instrues, expresses, e operadores (guia de programao C#) Objetos, classes e Structs (guia de programao C#) Propriedades (Guia de programao do C#) Indexadores (guia de programao C#) Representantes (guia de programao C#) Eventos (Guia de programao do C#) Generics (Guia de programao C#) Iterators (guia de programao C#) Namespaces (Guia de programao C#) Tipos anulveis (guia de programao C#) No seguro cdigo e ponteiros (guia de programao C#) Comentrios de documentao XML (Guia de programao C#)

Em um programa C#
A seo aborda a estrutura geral de um programa C#, e inclui o Exemplo padro " Hello, World! ". Nesta seo

Hello world--seu programa primeiro (guia de programao C#) Estrutura geral de um programa C# (guia de programao C#) Sees relacionadas Guia de Introduo ao Visual C# Migrando para o Visual C# Guia de Programao C# Referncia C# Exemplos do Visual C# Especificao da Linguagem C#

Para obter mais informaes, consulte as sees a seguir no Especificao da Linguagem C#:

Introduo 1

Visual C# Consolidado

158

Hello world-seu primeiro programa (guia de programao C#)


O seguinte programa Console a verso do programa Tradicional do "Hello World!", que exibe a seqncia Hello World! C#. CSharp using System; // A "Hello World!" program in C# namespace HelloWorld { class Hello { static void Main() { System.Console.WriteLine("Hello World!"); } } } Vamos agora examinar as partes importantes deste programa por sua vez. Comentrios A primeira linha contm um comentrio: CSharp // A "Hello World!" program in C# Os caracteres // convertem o restante da linha em um comentrio. Voc tambm pode comentar um bloco de texto, colocando-o entre os caracteres /* e */, por exemplo: CSharp /* A "Hello World!" program in C#. This program displays the string "Hello World!" on the screen. */ O mtodo principal O programa C# deve conter um mtodo chamado Main, no qual o controle de execuo inicia e termina. O mtodo Main onde voc cria objetos e executa outros mtodos. O mtodo Main um mtodo static (esttico) que reside em uma classe ou uma estrutura. No Exemplo anterior "Hello World! ", ele reside em uma classe chamada Hello. Declare o mtodo Main de uma das maneiras a seguir:

Podendo retornar void: CSharp static void Main() { //... }

Podendo tambm retornar um int: CSharp static int Main() { //... return 0; }

Com ambos os tipos de retorno, pode levar argumentos: CSharp static void Main(string[] args) { //... } OuCSharp static int Main(string[] args) { //... return 0; }

O parmetro do mtodo Main uma matriz (array) de string que representa os argumentos de linha de comando usados para chamar o programa. Observe que, diferentemente C++, essa matriz no inclui o nome do arquivo executvel (EXE). Para obter mais informaes sobre como usar argumentos de linha de comando, consulte o Exemplo em Main() e argumentos de linha de comando (Guia de programao C#) e COMO: Criar e usar DLLs em C# (Guia de programao C#). Entrada e Sada

Visual C# Consolidado

159

Programas C# geralmente usam os servios de entrada / sada fornecidos pela Biblioteca de tempo de execuo do .NET Framework A instruo, System.Console.WriteLine("Hello World!"); usa o mtodo WriteLine , um dos mtodos de sada da classe Console na biblioteca de tempo de execuo. Ele exibe seu parmetro de seqncia no fluxo de sada padro seguido por uma nova linha. Outros mtodos da classe Console so usados para diversas operaes de entrada e sada. Se voc incluir a diretiva using System;no incio do programa, voc pode usar as classes e mtodos do namespace System sem ter de referenci-los totalmente. Por exemplo, voc pode chamar Console.WriteLine Em vez de, System.Console.Writeline: CSharp using System; CSharp Console.WriteLine("Hello World!"); Para obter mais informaes sobre mtodos de entrada / sada, consulte System.IO. Compilao e execuo Voc pode compilar o programa " Hello World! " Criando um projeto no Visual Studio IDE, ou usando a linha de comando. Use o Prompt de Comandos do Visual Studio ou execute o arquivo vsvars32.bat para colocar a ferramenta Visual C# definida no caminho do seu prompt de comando. Para compilar o programa a partir da linha de comando:

Crie o arquivo de origem usando qualquer editor de texto e salv-lo usando um nome, como Hello.cs. Arquivos cdigo fonte C# usam a extenso .cs. Para chamar o compilador, digite o comando: Se seu programa no contm quaisquer erros de compilao, um arquivo chamado Hello.exe ser criado.

csc Hello.cs

Para executar o programa, digite o comando:

Hello Para obter mais informaes sobre o compilador C# e suas opes, consulte Opes do compilador C#.

Estrutura geral de um programa C# (guia de programao C#)


Programas C# podem consistir de um ou mais arquivos. Cada arquivo pode no conter espaos para nome (namespaces), ou conter vrios. Espaos para nome podem conter tipos, como classes, estruturas, interfaces, enumeraes, e representantes (delegates), alm de outros espaos. A seguir temos o esqueleto de um programa C# que contm todos esses elementos. CSharp // A skeleton of a C# program using System; namespace YourNamespace { class YourClass { } struct YourStruct { } interface IYourInterface { } delegate int YourDelegate(); enum YourEnum { } namespace YourNestedNamespace { struct YourStruct { } } class YourMainClass { static void Main(string[] args) { //Your program starts here... } } }

Main() e argumentos de linha de comando (Guia de programao C#)


O mtodo Main o ponto de entrada do seu programa, onde voc cria objetos e chama outros mtodos. S pode haver um nico ponto de entrada em um programa C#.

Visual C# Consolidado

160

CSharp class TestClass { static void Main(string[] args) { // Display the number of command line arguments: System.Console.WriteLine(args.Length); } } Viso Geral

O Main mtodo o ponto de entrada do seu programa, onde o controle de execuo do programa inicia e termina.

Ele declarado dentro de uma classe ou estrutura. Ele deve ser esttico (static) e ele no deve ser pblico. (No Exemplo acima, como no especificamos um modificador de acesso explicitamente, ele recebe o modificador de acesso padro, que (private) particular).

Ou ele pode retornar void ou ento um tipo int. O mtodo Main pode ser declarado com ou sem parmetros. Parmetros podem ser lidos como argumentos de linha de comando indexados a partir do zero. Diferentemente C e C++, o nome do programa no tratado como o primeiro argumento de linha de comando.

Argumentos de linha de comando (guia de programao C#)


O Main mtodo pode usar argumentos, nesse caso, necessrio uma das seguintes formas: C# static int Main(string[] args) C# static void Main(string[] args) O parmetro do mtodo Main uma String matriz que representa os argumentos de linha de comando. Geralmente voc verificar a existncia dos argumentos testando a Length propriedade, por exemplo: C# if (args.Length == 0) { System.Console.WriteLine("Please enter a numeric argument."); return 1; } Voc tambm pode converter os argumentos de seqncia para tipos numricos, usando a Convert classe ou o Parse mtodo. Por exemplo, a instruo a seguir converte a seqncia em um nmero longo, usando o Parse mtodo na classe Int64: long num = Int64.Parse(args[0]); Tambm possvel para usar o tipo long C#, os aliases Int64: long num = long.Parse(args[0]); Voc pode usar o Convert mtodo ToInt64 de classe para fazer a mesma coisa: long num = Convert.ToInt64(s); Para obter mais informaes, consulte Parse e Convert. Exemplo Neste exemplo, o programa leva um argumento em tempo de execuo, converte o argumento em um inteiro, e calcula o fatorial do nmero. Se nenhum argumento so fornecidos, o programa emite uma mensagem que explica o uso correto do programa. C# // arguments: 3

Visual C# Consolidado

161

C# public class Functions { public static long Factorial(int n) { if (n < 0) { return -1; } //error result - undefined if (n > 256) { return -2; } //error result - input is too big if (n == 0) { return 1; } // Calculate the factorial iteratively rather than recursively: long tempResult = 1; for (int i = 1; i <= n; i++) { tempResult *= i; } return tempResult; } } C# class MainClass { static int Main(string[] args) { // Test if input arguments were supplied: if (args.Length == 0) { System.Console.WriteLine("Please enter a numeric argument."); System.Console.WriteLine("Usage: Factorial <num>"); return 1; } try { // Convert the input arguments to numbers: int num = int.Parse(args[0]); System.Console.WriteLine("The Factorial of {0} is {1}.", num, Functions.Factorial(num)); return 0; } catch (System.FormatException) { System.Console.WriteLine("Please enter a numeric argument."); System.Console.WriteLine("Usage: Factorial <num>"); return 1; } } } Sada The Factorial of 3 is 6. Comentrios A seguir esto dois executa de Exemplo de programa assumindo o que Factorial.exe o nome do programa.

Execute # 1:
Insira a seguinte linha de comando: Factorial 10 Voc obtm o seguinte resultado: The Factorial of 10 is 3628800.

Execute # 2:
Insira a seguinte linha de comando: Factorial Voc obtm o seguinte resultado: Please enter a numeric argument. Usage: Factorial <num>

COMO: Exibir argumentos de linha de comando (Guia de programao C#)


Argumentos fornecidos para um executvel na linha de comando so acessveis atravs um parmetro opcional para Main. Os argumentos so fornecidos na forma de uma matriz de seqncias. Cada elemento da matriz contm um argumento. Espao White-entre argumentos removido. Por exemplo, considere essas invocaes de linha de comando de um executvel fictcia: Entrada na linha de comando executable.exe a b c Matriz de seqncias de caracteres passado para principal "a" "b" "c" " um " " dois "

executable.exe one two

executable.exe one two three " dois " um

Visual C# Consolidado

162

" trs " Exemplo Este Exemplo exibe os argumentos de linha de comando passados para um aplicativo de linha de comando. O resultado mostrado para a primeira entrada na tabela acima. C# class CommandLine { static void Main(string[] args) { // The Length property provides the number of array elements System.Console.WriteLine("parameter count = {0}", args.Length); for (int i = 0; i < args.Length; i++) { System.Console.WriteLine("Arg[{0}] = [{1}]", i, args[i]); } } }

Sada
parameter count = 3 Arg[0] = [a] Arg[1] = [b] Arg[2] = [c]

COMO: Acessar argumentos de linha de comando usando foreach (Guia de programao C#)
Outra abordagem para Iterando atravs da matriz a usar a foreach instruo conforme mostrado no exemplo. A foreach instruo pode ser usada para iterar por uma matriz, uma classe Coleo .NET Framework, ou qualquer classe ou estrutura que implementa a IEnumerable interface. Exemplo Este Exemplo demonstra como imprimi-los os argumentos de linha de comando usando foreach. C# // arguments: John Paul Mary C# class CommandLine2 { static void Main(string[] args) { System.Console.WriteLine("Number of command line parameters = {0}", args.Length); foreach (string s in args) { System.Console.WriteLine(s); } } }

Sada
Number of command line parameters = 3 John Paul Mary

Main() retorna valores (Guia de programao C#)


O Main mtodo pode ser do tipo void: C# static void Main() { //... } Ele tambm pode retornar um int: C# static int Main() { //... return 0; } Se o valor de retorno da Main no deve ser usado, seguida, retornar void permite que cdigo ligeiramente mais simples. No entanto, retornar um inteiro permite que o programa para relacionar informaes de status para outros programas ou scripts que chamar o executvel. Um Exemplo de usar o valor de retorno da Main mostrado no Exemplo a seguir. Exemplo Um arquivo em lotes, neste Exemplo usado para executar um programa e testar o valor a Main funo de retorno. Quando um programa executado no Windows, qualquer valor retornado da Main funo armazenado em uma varivel de ambiente chamada ERRORLEVEL. Ao inspecionar a

Visual C# Consolidado

163

ERRORLEVEL

varivel, arquivos em lotes portanto podem determinar o resultado da execuo. Tradicionalmente, um valor de retorno de zero indica execuo com xito. Abaixo um programa muito simples que retorna zero da funo Main. class MainReturnValTest { static int Main() { //... return 0; } }

C# Como este Exemplo usa um arquivo em lotes, melhor para compilar esse cdigo a partir da linha de comando, conforme demonstrado no Como construir a partir da linha de comando:. Em seguida, um arquivo em lotes usado para chamar o executvel resultante do Exemplo de cdigo anterior. Porque o cdigo retorna zero, o arquivo em lotes ir reportar xito, mas se o cdigo anterior alterado para retornar um valor diferente de zero, e ento re-Compiled, subseqente execuo do arquivo em lotes indicar falha. rem test.bat @echo off MainReturnValueTest @if "%ERRORLEVEL%" == "0" goto good :fail echo Execution Failed echo return value = %ERRORLEVEL% goto end :good echo Execution Succeded echo return value = %ERRORLEVEL% goto end :end Sada de exemplo Execution Succeded return value = 0

Tipos de dados (guia de programao C#)


C# uma linguagem altamente digitada; portanto cada varivel e objeto deve ter um tipo declarado. Viso geral sobre tipos de dados Um tipo de dados pode ser descrito como sendo um:

Um tipo, como dados internos ou char, ou um int Um tipo, como dados definidos pelo usurio ou interface. um class Tipos de dados tambm podem ser definidos como sendo um: Tipos valor (referncia C#) que armazenam valores, ou Tipos de referncia (referncia C#) que armazenam referncias para os dados reais. Sees relacionadas

Para obter mais informaes:


Projetando (guia de programao C#) Boxing e Unboxing (C# programao guia) Tipos (referncia C#) Objetos, classes e Structs (guia de programao C#) Especificao da Linguagem C#

Para obter mais informaes sobre tipos, consulte as sees a seguir no Especificao da Linguagem C#:

Tipos 1.3 e variveis Namespace 3.8 e nomes tipo Tipos valor 4.1 Tipos de referncia 4.2 4.3 Boxing e Unboxing

Visual C# Consolidado

164

MATRIZES (GUIA DE PROGRAMAO DO C#)


Uma matriz uma estrutura de dados que contm um nmero de variveis do mesmo tipo. Matrizes so declaradas com um tipo: type[] arrayName; Os exemplos a seguir criar matrizes dimensional nica, multidimensional, e denteadas: C# class TestArraysClass { static void Main() { // Declare a single-dimensional array int[] array1 = new int[5]; // Declare and set array element values int[] array2 = new int[] { 1, 3, 5, 7, 9 }; // Alternative syntax int[] array3 = { 1, 2, 3, 4, 5, 6 }; // Declare a two dimensional array int[,] multiDimensionalArray1 = new int[2, 3]; // Declare and set array element values int[,] multiDimensionalArray2 = { { 1, 2, 3 }, { 4, 5, 6 } }; // Declare a jagged array int[][] jaggedArray = new int[6][]; // Set the values of the first array in the jagged array structure jaggedArray[0] = new int[4] { 1, 2, 3, 4 }; } } Viso geral de matriz Uma matriz tem as seguintes propriedades:

Pode ser Dimensional nico uma matriz, Multidimensional ou Jagged. O valor padro de elementos da matriz numrica so definidas como zero, e elementos de referncia so definidos como nulo. Uma matriz denteada uma matriz de matrizes, e portanto seus elementos so tipos de referncia e so inicializados para null. Matrizes forem zero indexado: uma matriz com n elementos indexada a partir 0 para n-1. Elementos de matriz podem ser de qualquer tipo, incluindo um tipo de matriz. Tipos de matriz so Tipos de referncia derivados do tipo Array base abstrato. Desde isso e IEnumerable implementa IEnumerable Tipo, voc pode utilizar foreach iterao em todas as matrizes em C#.

Matrizes como objetos (guia de programao C#)


No C#, matrizes so realmente objetos, e no apenas endereveis regies de memria contgua como em C e C++. Array o tipo base abstrato de todos os tipos de matriz. Voc pode usar as propriedades, e outros membros da classe, que Array tem. Um Exemplo disso deve estar usando a Length propriedade para obter o comprimento de uma matriz. O cdigo a seguir atribui o comprimento da matriz numbers, que 5, a uma varivel chamada lengthOfNumbers: C# int[] numbers = { 1, 2, 3, 4, 5 }; int lengthOfNumbers = numbers.Length; A System.Array classe fornece vrios outros til mtodos e propriedades para classificao, pesquisa, e copiando matrizes. Exemplo Este Exemplo usa a Rank propriedade para exibir o nmero de dimenses de uma matriz. C# class TestArraysClass { static void Main() { // Declare and initialize an array: int[,] theArray = new int[5, 10]; System.Console.WriteLine("The array has {0} dimensions.", theArray.Rank); } }

Visual C# Consolidado

165

Sada The array has 2 dimensions.

Matrizes multidimensionais (guia de programao C#)


Matrizes podem ter mais de uma dimenso. Por exemplo, a declarao a seguir cria uma matriz bidimensional de quatro linhas e duas colunas: C# int[,] array = new int[4, 2]; Alm disso, a declarao a seguir cria uma matriz de trs dimenses, 4, 2 e 3: C# int[, ,] array1 = new int[4, 2, 3]; Inicializao de matriz Voc pode inicializar a matriz na declarao conforme mostrado no Exemplo o seguir: C# int[,] array2D = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }; int[, ,] array3D = new int[,,] { { { 1, 2, 3 } }, { { 4, 5, 6 } } }; Voc tambm pode inicializar a matriz sem especificar a classificao: C# int[,] array4 = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }; Se voc optar por declarar uma varivel de matriz sem a inicializao, voc deve usar o new operador para atribuir uma matriz varivel Por exemplo: C# int[,] array5; array5 = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }; // OK //array5 = {{1,2}, {3,4}, {5,6}, {7,8}}; // Error Voc tambm pode atribuir um valor a um elemento de matriz, por exemplo: C# array5[2, 1] = 25; O Exemplo de cdigo a seguir inicializa as variveis de matriz como padro (exceto para denteadas matrizes): C# int[,] array6 = new int[10, 10];

Matrizes passagem como parmetros (guia de programao C#)


Matrizes podem ser passados para mtodos como parmetros. Como matrizes so tipos de referncia, o mtodo pode alterar o valor dos elementos. Passando matrizes dimensional nica como parmetros Voc pode passar uma matriz dimensional nica inicializado para um mtodo. Por exemplo: C# PrintArray(theArray); O mtodo chamado na linha acima poderia ser definido como: C# void PrintArray(int[] arr) { // method code }

Visual C# Consolidado

166

Voc tambm pode inicializar e passa uma nova matriz em uma etapa Por exemplo: C# PrintArray(new int[] { 1, 3, 5, 7, 9 }); Exemplo 1

Descrio
No Exemplo a seguir, a uma matriz de seqncia de caracteres inicializado e passado como um parmetro para o PrintArray mtodo, onde seus elementos so exibidos:

Cdigo
C# class ArrayClass { static void PrintArray(string[] arr) { for (int i = 0; i < arr.Length; i++) { System.Console.Write(arr[i] + "{0}", i < arr.Length - 1 ? " " : ""); } System.Console.WriteLine(); } static void Main() { // Declare and initialize an array: string[] weekDays = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; // Pass the array as a parameter: PrintArray(weekDays); } } Sada 1 Sun Mon Tue Wed Thu Fri Sat Passando Matrizes multidimensionais como parmetros Voc pode passar uma matriz multidimensional inicializado para um mtodo. Por exemplo, matriz dimensional for theArray Um dois: C# PrintArray(theArray); O mtodo chamado na linha acima poderia ser definido como: C# void PrintArray(int[,] arr) { // method code } Voc tambm pode inicializar e passa uma nova matriz em uma etapa Por exemplo: C# PrintArray(new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }); Exemplo 2

Descrio
Neste exemplo, uma matriz bidimensional inicializado e passada para o PrintArray mtodo, onde seus elementos so exibidos.

Cdigo
C# class ArrayClass2D { static void PrintArray(int[,] arr) { // Display the array elements: for (int i = 0; i < 4; i++) { for (int j = 0; j < 2; j++) { System.Console.WriteLine("Element({0},{1})={2}", i, j, arr[i, j]); } } } static void Main() { // Pass the array as a parameter: PrintArray(new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }); } } Sada 2 Element(0,0)=1 Element(0,1)=2 Element(1,0)=3 Element(1,1)=4 Element(2,0)=5

Visual C# Consolidado

167

Element(2,1)=6 Element(3,0)=7 Element(3,1)=8

Passando REF usando matrizes e out (guia programao C#)


Todos os Limite parmetros, como um out parmetro de um tipo de matriz deve ser atribudo antes que ela usada; ou seja, ele deve ser atribudo pelo chamado. Por exemplo: C# static void TestMethod1(out int[] arr) { arr = new int[10]; // definite assignment of arr } Como todos os Ref parmetros, um ref parmetro de um tipo de matriz deve ser atribudo pelo chamador definitivamente. Portanto, no necessrio para serem atribudos pelo chamado definitivamente. Um ref parmetro de um tipo de matriz pode ser alterado como resultado da chamada. Por exemplo, a matriz pode ser atribudo o Nulo valor ou podem ser inicializados para uma matriz diferente. Por exemplo: C# static void TestMethod2(ref int[] arr) { arr = new int[10]; // arr initialized to a different array } Os seguintes exemplos dois demonstram a diferena entre out e ref quando usada em passar matrizes para mtodos. Exemplo 1 Neste exemplo, a matriz theArray declarado no chamador (o Main mtodo), e inicializado no mtodo FillArray. Em seguida, os elementos da matriz so retornados para o chamador e exibido. C# class TestOut { static void FillArray(out int[] arr) { // Initialize the array: arr = new int[5] { 1, 2, 3, 4, 5 }; } static void Main() { int[] theArray; // Initialization is not required // Pass the array to the callee using out: FillArray(out theArray); // Display the array elements: System.Console.WriteLine("Array elements are:"); for (int i = 0; i < theArray.Length; i++) { System.Console.Write(theArray[i] + " "); } } } Sada 1

Array elements are:


12345 Exemplo 2 Neste exemplo, a matriz theArray inicializado no chamador (o Main mtodo), e passada para o FillArray mtodo usando o ref parmetro. Algumas dos elementos da matriz so atualizadas no mtodo FillArray. Em seguida, os elementos da matriz so retornados para o chamador e exibido. C# class TestRef { static void FillArray(ref int[] arr) { // Create the array on demand: if (arr == null) { arr = new int[10]; } // Fill the array: arr[0] = 1111; arr[4] = 5555; } static void Main() { // Initialize the array: int[] theArray = { 1, 2, 3, 4, 5 }; // Pass the array using ref: FillArray(ref theArray); // Display the updated array: System.Console.WriteLine("Array elements are:"); for (int i = 0; i < theArray.Length; i++) { System.Console.Write(theArray[i] + " "); } } } Sada 2 Array elements are: 1111 2 3 4 5555

Visual C# Consolidado

168

Exemplo matrizes Download sample Este Exemplo descreve e mostra como matrizes funcionam em C#. Para obter mais informaes, consulte Matrizes (Guia de programao do C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo matrizes no Visual Studio

No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc arrays.cs arrays

Para criar e executar o Exemplo matrizes a partir da linha de comando

Seqncias (guia de programao C#)


As sees a seguir discutem o string tipo de dados, que um alias para a String classe.

Usando Strings (guia de programao C#)


Uma seqncia C# uma matriz de caracteres declarado usando a string palavra-chave. Uma seqncia de caracteres literal declarada usar aspas, como mostrado no Exemplo a seguir: C# string s = "Hello, World!"; Voc pode extrair substrings, e concatenar seqncias, como este: C#

Visual C# Consolidado

169

string s1 = "orange"; string s2 = "red"; s1 += s2; System.Console.WriteLine(s1); // outputs "orangered" s1 = s1.Substring(2, 5); System.Console.WriteLine(s1); // outputs "anger" Objetos seqncia so imutvel, significando que eles no podem ser alterados uma vez que tenha sido criada. Mtodos que atuam em seqncias realmente retornam novos objetos de seqncia. No Exemplo anterior, quando o contedo de s1 e s2 so concatenadas para formar uma nica seqncia, as duas seqncias contendo "orange" e "red" so mantidos inalterados ambos. O += operador cria uma nova seqncia contendo o contedo combinados. O resultado que s1 se refere a uma seqncia diferente totalmente agora. Uma seqncia contendo apenas "orange" ainda existe, mas no referenciado quando s1 concatenada. Portanto, por razes de desempenho, grandes quantidades de concatenao ou outra manipulao de seqncia de caracteres envolvidos devem ser executadas com a StringBuilder classe, como este: C# System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append("one "); sb.Append("two "); sb.Append("three"); string str = sb.ToString(); A StringBuilder classe discutida mais na seo " StringBuilder usando ". Trabalhando com seqncias

Escape caracteres
Escape caracteres, como " \n " (nova linha) e " \t " (guia) pode ser includas em seqncias. A linha: C# string hello = "Hello\nWorld!"; o mesmo que: Hello World! Se voc desejar incluir uma barra com verses anteriores, ele deve ser precedido com outro invertida. A seqncia a seguir: C# string filePath = "\\\\My Documents\\"; realmente o mesmo que: \\My Documents\

O smbolo @
O @ Smbolo informa o Construtor de seqncia para ignorar caracteres de escape e quebras de linha. As seguintes seqncias duas so portanto idnticas: C# string p1 = "\\\\My Documents\\My Files\\"; string p2 = @"\\My Documents\My Files\";

ToString()
Como todos os objetos derivados Object, seqncias fornecem o ToString mtodo, que converte um valor em uma seqncia. Este mtodo pode ser usado para converter valores numricos em seqncias, como este: C#
int year = 1999; string msg = "Eve was born in " + year.ToString(); System.Console.WriteLine(msg); // outputs "Eve was born in 1999"

Visual C# Consolidado

170

Acessando caracteres individuais


Caracteres individuais contidos em uma seqncia de caracteres podem ser acessados usando mtodos, como SubString(), Replace(), Split() e Trim(). C# string s3 = "Visual C# Express"; System.Console.WriteLine(s3.Substring(7, 2)); // outputs "C#" System.Console.WriteLine(s3.Replace("C#", "Basic")); // outputs "Visual Basic Express" Tambm possvel para copiar os caracteres em uma matriz de caracteres, como este: C# string s4 = "Hello, World"; char[] arr = s4.ToCharArray(0, s4.Length); foreach (char c in arr) { System.Console.Write(c); // outputs "Hello, World" } Caracteres individuais de uma seqncia podem ser acessados com um ndice, como este: C# string s5 = "Printing backwards"; for (int i = 0; i < s5.Length; i++) { System.Console.Write(s5[s5.Length - i - 1]); // outputs "sdrawkcab gnitnirP" }

Alterando a Caixa
Para alterar as letras em uma seqncia para superior ou minsculas, use ToUpper() ou ToLower(), como isso: C# string s6 = "Battle of Hastings, 1066"; System.Console.WriteLine(s6.ToUpper()); // outputs "BATTLE OF HASTINGS 1066" System.Console.WriteLine(s6.ToLower()); // outputs "battle of hastings 1066"

Comparaes
Do == a maneira mais simples para comparar duas seqncias para usar e != operadores, que executar uma comparao que diferencie maisculas de minsculas. C# string color1 = "red"; string color2 = "green"; string color3 = "red"; if (color1 == color3) { System.Console.WriteLine("Equal"); } if (color1 != color2) { System.Console.WriteLine("Not equal"); } Objetos seqncia tambm ter um CompareTo() mtodo que retorna um valor inteiro com base em se uma seqncia menos-(<)or greater-than (>) que outra . Ao comparar seqncias, o valor Unicode usado, e minsculo tem um valor menor que maisculo. C# string s7 = "ABC"; string s8 = "abc"; if (s7.CompareTo(s8) > 0) { System.Console.WriteLine("Greater-than"); } else { System.Console.WriteLine("Less-than"); } Para procurar por uma seqncia dentro outra seqncia, use IndexOf(). Retorna IndexOf()-1 se a seqncia de pesquisa no encontrada; caso contrrio, ele retorna o ndice do primeiro local em que ele ocorre baseada em zero. C#
string s9 = "Battle of Hastings, 1066"; System.Console.WriteLine(s9.IndexOf("Hastings")); // outputs 10 System.Console.WriteLine(s9.IndexOf("1967")); // outputs -1

Dividindo um string em Substrings


Dividir uma seqncia em substrings , como dividindo uma frase em palavras individuais uma tarefa de programao comuns. O Split() mtodo utiliza uma char matriz de delimitadores,

Visual C# Consolidado

171

por exemplo, um caractere de espao, e retorna uma matriz de substrings. Voc pode acessar essa matriz com foreach, como este: C# char[] delimit = new char[] { ' ' }; string s10 = "The cat sat on the mat."; foreach (string substr in s10.Split(delimit)) { System.Console.WriteLine(substr); } Esse cdigo sadas cada palavra em uma linha separada, como este: The cat sat on the mat. Usando StringBuilder A StringBuilder classe cria um buffer de seqncia que oferece melhor desempenho se seu programa executa uma grande quantidade de manipulao de seqncia de caracteres. A StringBuilder seqncia tambm permite que voc para reatribuir caracteres individuais, algo que o tipo de dados de seqncia interna no oferece suporte. Esse cdigo, por exemplo, altera o contedo de uma seqncia sem criar uma nova seqncia: C# System.Text.StringBuilder sb = new System.Text.StringBuilder("Rat: the ideal pet"); sb[0] = 'C'; System.Console.WriteLine(sb.ToString()); System.Console.ReadLine(); Neste exemplo, um StringBuilder objeto usado para criar uma seqncia de um conjunto de tipos numricos: C# class TestStringBuilder { static void Main() { System.Text.StringBuilder sb = new System.Text.StringBuilder(); // Create a string composed of numbers 0 - 9 for (int i = 0; i < 10; i++) { sb.Append(i.ToString()); } System.Console.WriteLine(sb); // displays 0123456789 // Copy one character of the string (not possible with a System.String) sb[0] = sb[9]; System.Console.WriteLine(sb); // displays 9123456789 } }

Visual C# Consolidado

172

ESPECIFICAO DA LINGUAGEM C#
As verses 1.2 e 2.0 das especificaes da linguagem C# so a fonte autorizada de gramtica e sintaxe C#. Elas contm informaes detalhadas sobre todos os aspectos da linguagem, incluindo muitos pontos no abordados na documentao do produto Visual C#. A especificao 1.2 discute recursos que foram adicionados para a linguagem antes do Visual C# 2005 e a especificao 2.0 discute recursos que foram adicionados para o Visual C# 2005. As especificaes da linguagem C# esto disponveis no formato Microsoft Word nos seguintes locais:

No MSDN Online em http://msdn.microsoft.com/vcsharp/Programming/Language/default.aspx No Visual Studio, na pasta VC#\Specifications\1033\ sob o diretrio de instalao do seu Microsoft Visual Studio 2005 . Se voc no tiver o Microsoft Word instalado em seu computador, voc pode visualizar, copiar e imprimir a verso do Word da especificao com o gratuito Palavra visualizador 2003. A especificao da linguagem C# tambm est disponvel como um livro publicado pelo Addison Wesley.

Visual C# Consolidado

173

REFERNCIA C#
Esta seo fornece material de referncia para as palavras-chave do C#, operadores, erros de compilador e avisos.

Palavras-chave C#
Palavras-chave so identificadores reservados que tm significado especial para o compilador. Eles no podem ser usados como identificadores em seu programa a menos que incluam @ como um prefixo. Por exemplo, @if um identificador vlido mas if no, porque uma palavra-chave. abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed foat for foreach goto if implicit in int interface internal is ock ong new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackaloc static struct switch this throw true try typeof uint uong unchecked unsafe ushort using virtual volatile void while

namespace string

Palavras-chave contextuais Obter Valor parcial Onde Definir Produzir

Palavra-chave abstract
O modificador abstract pode utilizar com classes, mtodos, propriedades, indicadores e eventos.

Visual C# Consolidado

174

Utilize o modificador abstract em uma declarao de classe se deseja indicar que a classe s deve atuar como classe-base de outras classes. As classes do tipo abstract apresentam as seguintes caractersticas:

No podem se criar instancias de uma classe abstrata. Uma classe abstrata pode conter descritores de acesso e mtodos abstratos.

No possvel modificar uma classe abstrata com o modificador sealed, o qual significa que a classe no pode heredar. Uma classe no abstrata derivada de uma classe abstrata deve incluir implementaes reales de todos os descritores de acesso e mtodos abstratos herdados. Utilize o modificador abstract em uma declarao de mtodo ou propriedade para indicar que o mtodo ou a propriedade no contm implementao. Os mtodos abstratos apresentam as seguintes caractersticas:

Um mtodo abstrato , implcitamente, um mtodo virtual. As declaraes de mtodos abstratos s permitido em classes abstratas.

Como uma declarao de mtodo abstrato no proporciona uma implementao, no existe corpo do mtodo; a declarao de mtodo finaliza simplemente com um ponto e vrgua e sem chaves ({ }) depois da firma. Por exemplo: public abstract void MyMethod();
A implementao a proporciona um mtodo de reemplazo, o qual um membro de uma classe no abstrata.

Utilizar os modificadores static ou virtual em uma declarao de mtodo abstrato produza um erro. As propriedades abstratas funcionam como os mtodos abstratos, salvo as diferenas na sintaxis das declaraes e chamadas.

incorreto utilizar o modificador abstract em uma propriedade esttica.

Uma propriedade abstrata herdada pode substituir em uma classe derivada se se inclui uma declarao de propriedade que use o modificador override. Uma classe abstrata deve proporcionar implementaes para todos os membros da interface. Uma classe abstrata que implementa uma interface poderia assinalar os mtodos da interface os mtodos abstratos. Por exemplo:

interface I { void M(); } abstract class C: I { public abstract void M(); } Exemplo Neste exemplo, a classe MyDerivedC derivada de uma classe abstrata MyBaseC. A classe abstrata contm um mtodo abstrato, MyMethod(), e duas propriedades abstratas, GetX() e GetY(). // abstract_keyword.cs // Abstract Classes

Visual C# Consolidado

175

using System; abstract class MyBaseC // Abstract class { protected int x = 100; protected int e = 150; public abstract void MyMethod(); // Abstract method public abstract int GetX // Abstract property { get; } public abstract int GetY // Abstract property { get; } } class MyDerivedC: MyBaseC { public override void MyMethod() { x++; y++; } public override int GetX // overriding property { get { return x+10; } } public override int GetY // overriding property { get { return y+10; } } public static void Main() { MyDerivedC mC = new MyDerivedC(); mC.MyMethod(); Console.WriteLine("x = {0}, e = {1}", mC.GetX, mC.GetY); } }

Resultado
x = 111, e = 161 No Exemplo anterior, se intenta criar uma instancia da classe abstrata mediante uma instruo como a seguinte: MyBaseC mC1 = new MyBaseC(); // Erro obter a seguinte mensagem de erro:

Visual C# Consolidado

176

Cannot criate an instance of the abstract class 'MyBaseC'.

Palavra-chave event
Especifica um evento. [attributes] [modifiers] e v e n t type declarator; [attributes] [modifiers] e v e n t type member-name { accessor-declarations} ; de onde: attributes (opcional) modifiers (opcional)

Modificadores opcionais, entre os que se incluem: abstract new override static virtual extern um dos quatro modificadores de acesso

type Tipo delegado ao qual se deseja associar este evento. declarator Mome do evento. Mome do evento. member-name accessor-declarations (opcional) Declarao de os descritores de acesso , os quais se utilizam para agregar ou quitar controladores de eventos no cdigo cliente. As funes para descritores de acesso so add e remove. Definir s uma de elas produza um erro. Comentarios A palavra-chave event permite especificar um delegado ao qual se invocar quando ocorra algum "evento" no cdigo. o delegado pode ter ou no o varios mtodos asociados a os que se chamar quando o cdigo indique que o evento se ha producido. possvel poner um evento de qualquer programa a disposio de outros programas que utilizem Common Language Runtime do .NET Framework. Para criar e utilizar eventos do C#, siga os seguintes pasos: Crie ou identifique um delegado. Se est definindo um evento propio, tambm deve asegurarse de que existe um delegado que possa utilizar com a palavra-chave event. Se o evento est predefinido, por Exemplo em .NET Framework, entonces os consumidores do evento s necessitan conhecer o nome do delegado. 1. Crie uma classe que contenha: a. Um evento criado desde o delegado. b. Um mtodo que comprova se existe uma instancia do delegado declarado com a palavra-chave event (este mtodo opcional). outra opo consiste em inserir este fragmento de cdigo dentro do cdigo que produza o evento.

Visual C# Consolidado

177

c. Os mtodos que chaman ao evento. Estes mtodos podem ser reemplazos de cierta funcionalidad da classe-base. Esta classe define ou evento. 2. Defina ao menos uma classe que conecte os mtodos com o evento. Cada uma de estas classes incluir o seguinte:

A asociao de uno ou varios mtodos, mediante os operadores += e -=, com o evento na classe-base. A definio de os mtodos que se asociaro com o evento. Utilize ou evento: Crie um objeto da classe que contm a declarao do evento. 3.

Crie um objeto da classe que contm a definio do evento, mediante ou construtor que definiu.

Resultado
Exemplo 1 Este Exemplo mostra que possvel declarar um evento em uma interface e implement-lo em uma classe: // event_keyword.cs using System; public delegate void MyDelegate(); // delegate declaration public interface I { event MyDelegate MyEvent; void FireAway(); } public class MyClass: I { public event MyDelegate MyEvent; public void FireAway() { if (MyEvent != null) MyEvent(); } } public class MainClass { static private void f() { Console.WriteLine("This is called whem the event fires."); } static public void Main () { I i = new MyClass(); i.MyEvent += new MyDelegate(f); i.FireAway();

Visual C# Consolidado

178

} } Exemplo 2 Uno de os usos daccessor-declarations consiste em exponer um gram nmero de eventos sem ter que assinalar um campo para cada evento, sino utilizando em seu lugar uma taba hash que almacene as instancias de os eventos. Isto s resulta til se se dispe de um gram nmero de eventos, pois se preves que a maiora de os eventos no se implementaro. // event_keyword2.cs using System; using System.Collections; public delegate void MyDelegate1(int i); public delegate void MyDelegate2(string s); public delegate void MyDelegate3(int i, object o); public delegate void MyDelegate4(); public class PropertyEventsSample { private Hashtable eventTable = new Hashtable(); public event MyDelegate1 Event1 { add { eventTable["Event1"] = (MyDelegate1)eventTable["Event1"] + value; } remove { eventTable["Event1"] = (MyDelegate1)eventTable["Event1"] - value; } } public event MyDelegate1 Event2 { add { eventTable["Event2"] = (MyDelegate1)eventTable["Event2"] + value; } remove { eventTable["Event2"] = (MyDelegate1)eventTable["Event2"] - value; } } public event MyDelegate2 Event3 { add { eventTable["Event3"] = (MyDelegate2)eventTable["Event3"] + value; } remove { eventTable["Event3"] = (MyDelegate2)eventTable["Event3"] - value; }

Visual C# Consolidado

179

} public event MyDelegate3 Event4 { add { eventTable["Event4"] = (MyDelegate3)eventTable["Event4"] + value; } remove { eventTable["Event4"] = (MyDelegate3)eventTable["Event4"] - value; } } public event MyDelegate3 Event5 { add { eventTable["Event5"] = (MyDelegate3)eventTable["Event5"] + value; } remove { eventTable["Event5"] = (MyDelegate3)eventTable["Event5"] - value; } } public event MyDelegate4 Event6 { add { eventTable["Event6"] = (MyDelegate4)eventTable["Event6"] + value; } remove { eventTable["Event6"] = (MyDelegate4)eventTable["Event6"] - value; } } } public class MyClass { public static void Main() { } } Exemplo 3 Outro uso das propriedades de eventos contempla o caso no que se implementam duas interfaces, cada uma com um evento do mesmo nome. Nesse caso, deve utilizar uma propriedade de evento de implementao explcita: // event_keyword3.cs using System; public delegate void MyDelegate1(); public interface I1

Visual C# Consolidado

180

{ event MyDelegate1 MyEvent; } public delegate int MyDelegate2(string s); public interface I2 { event MyDelegate2 MyEvent; } public class ExplicitEventsSample: I1, I2 { public event MyDelegate1 MyEvent; // normal implementation of I1.MyEvent. event MyDelegate2 I2.MyEvent // explicit implementation of I2.MyEvent { add { MyEvent2Storage += value; } remove { MyEvent2Storage -= value; } } private MyDelegate2 MyEvent2Storage; // underlying storage for I2.MyEvent. private void FireEvents() { if (MyEvent != null) MyEvent(); if (MyEvent2Storage != null) MyEvent2Storage("helo"); } } public class MyClass { public static void Main() { } }

Palavra-chave new
Em C#, a palavra-chave new pode utilizar como operador ou como modificador.

Operador new utilizado para criar objetos na pilha e invocar construtores. Modificador new utilizado para ocultar um membro herdado de um membro de classe-

base.

OPERADOR NEW
O operador new utilizado para criar objetos e invocar construtores, por exemplo: Class1 MyClass = new Class1();

Visual C# Consolidado

181

Tambm utilizado com o fim de invocar o construtor predeterminado para tipos de valores, por exemplo: int myInt = new int(); Na instruo anterior se inicializa myInt com o valor 0, que ou predeterminado para o tipo int. Essa instruo tno mesmo efeito que: int myInt = 0; Lembre que um erro declarar um construtor predeterminado para um tipo struct, j que todos os tipos de valores posuem implcitamente um construtor pblico predeterminado. No obstante, se podem se declarar construtores com parmetros para um tipo struct. Os objetos do tipo valor, tais como as estruturas, so criados na pilha, enquanto que os objetos do tipo referencia, tais como as classes, so criados na pilha. O operador new no pode sobrecargar. Se o operador new fala na assinalao de memoria, iniciar a exceo OutOfMemoryException. Exemplo No seguinte exemplo, so criados e se inicializam, mediante o operador new, um objeto struct e um objeto class y, a continuao, se lhes assinalam valores. Os valores predeterminados e assinalados se mostram em tela. // cs_operator_new.cs // The new operator using System; class NewTest { struct MyStruct { public int x; public int y; public MyStruct (int x, int y) { this.x = x; this.y = y; } } class MyClass { public string name; public int id; public MyClass () { }

Visual C# Consolidado

182

public MyClass (int id, string name) { this.id = id; this.name = name; } } public static void Main() { // Criate objects using default construtors: MyStruct Ocation1 = new MyStruct(); MyClass Empoyee1 = new MyClass(); // Display values: Console.WriteLine("Default values:"); Console.WriteLine(" Struct members: {0}, {1}", Ocation1.x, Ocation1.y); Console.WriteLine(" Class members: {0}, {1}", Empoyee1.name, Empoyee1.id); // Criate objects using parameterized construtors:: MyStruct Ocation2 = new MyStruct(10, 20); MyClass Empoyee2 = new MyClass(1234, "John Martin Smith"); // Display values: Console.WriteLine("Assigned values:"); Console.WriteLine(" Struct members: {0}, {1}", Ocation2.x, Ocation2.y); Console.WriteLine(" Class members: {0}, {1}", Empoyee2.name, Empoyee2.id); } }

Resultado
Default values: Struct members: 0, 0 Class members: , 0 Assigned values: Struct members: 10, 20

Visual C# Consolidado

183

Class members: John Martin Smith, 1234 Observe no Exemplo que o valor predeterminado de uma srie null. Por tanto, no se mostra em tela.

MODIFICADOR NEW
Use o modificador new para ocultar explcitamente um membro herdado de uma classe-base. Para ocultar um membro herdado, declare-o na classe derivada com o mesmo mome e modifiqueo com o modificador new. Considere a seguinte classe: public class MyBaseC { public int x; public void Invoke() {} } Ao declarar um membro com o nome Invoke em uma classe derivada se ocultar o mtodo Invoke na classe-base, assim: public class MyDerivedC : MyBaseC { new public void Invoke() {} } Mas, o campo x no ser afetado, j que no oculta nenhum mome similar. A ocultao de nomes por meio da herana toma uma das seguintes formas:

Constante, campo, propriedade ou tipo introduzido em uma classe ou estrutura que oculta todos os membros da classe-base com o mesmo nome. Mtodo introduzido em uma classe o estrutura que oculta propriedades, campos e tipos, com o mesmo nome, na classe-base. Tambm oculta todos os mtodos da classe-base com a mesma firma. Para obter mais informao, veja 3.6 Firmas e sobrecarga. Indicador introduzido em uma classe o estrutura que oculta todos os indicadores da classebase com a mesma firma. incorreto utilizar simultneamente new e override no mesmo membro.

Se utilizada o modificador new em uma declarao que no oculta um membro herdado, se gera uma advertencia. Exemplo Neste exemplo, uma classe-base, MyBaseC, e uma classe derivada, MyDerivedC, utilizam o mesmo mome de campo x, o que produza a ocultao do valor do campo herdado. o Exemplo demostra o uso do modificador new. Tambm mostra como obter acesso a os membros ocultos da classe-base mediante sus nomes completos. // cs_modifier_new.cs // The new modifier using System; public class MyBaseC { public static int x = 55;

Visual C# Consolidado

184

public static int e = 22; } public class MyDerivedC : MyBaseC { new public static int x = 100; // Name hiding public static void Main() { // Display the overlapping value of x: Console.WriteLine(x); // Access the hiddem value of x: Console.WriteLine(MyBaseC.x); // Display the unhiddem member y: Console.WriteLine(y); } }

Resultado
100 55 22 Se elimina o modificador new, ou programa seguir compilndose e executndose, pois se obter a advertencia: The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'. Tambm pode utilizar o modificador new para modificar um tipo anidado, Se o tipo anidado est ocultando outro tipo, como se mostra no seguinte exemplo. Exemplo Neste exemplo, uma classe anidada, MyClass, oculta uma classe com o mesmo mome na classebase. o Exemplo demostra o uso do modificador new para eliminar ou mensagem dadvertencia, assim como ou acesso a os membros da classe oculta mediante sus nomes completos. // cs_modifer_new_nested.cs // Using the new modifier with nested types using System; public class MyBaseC { public class MyClass { public int x = 200; public int y;

Visual C# Consolidado

185

} } public class MyDerivedC : MyBaseC { new public class MyClass // nested type hiding the base type members { public int x = 100; public int y; public int z; } public static void Main() { // Criating object from the overlapping class: MyClass S1 = new MyClass(); // Criating object from the hiddem class: MyBaseC.MyClass S2 = new MyBaseC.MyClass(); Console.WriteLine(S1.x); Console.WriteLine(S2.x); } }

Resultado
100 200

PALAVRA-CHAVE STRUCT
Um tipo struct um tipo de valor que pode conter construtores, constantes, campos, mtodos, propriedades, indicadores, operadores, eventos e tipos anidados. A declarao de um tipo struct toma a forma seguinte: [attributes] [modifiers] s t r u c t identifier [: interfaces] body [; ] de onde: attributes (opcional) Informao declarativa adicional. Para obter mais informao sobre os atributos e as classes datributo, veja 17. Atributos. modifiers (opcional)

Visual C# Consolidado

186

Os modificadores permitidos so new e os cuatro modificadores de acesso . identifier Mome do tipo struct. interfaces (opcional) body Cuerpo da estrutura que contm as declaraes de os membros. Comentarios O tipo struct adequado para representar objetos de poca complejidad, como puntos, rectnguos e cores. Mas possvel representar um ponto como uma classe, uma estrutura mais eficaz em algunos casos. Por exemplo, se se declara uma matriz de 1000 objetos Point, se deber assinalar memoria adicional para fazer referencia a cada objeto. Neste caso, a estrutura apresenta um menor costo. um erro declarar um construtor predeterminado (sin parmetros) para uma estrutura. Siempre existe um construtor predeterminado que inicializa os membros da estrutura com sus valores predeterminados. um erro inicializar um campo de instancia de uma estrutura. Quando se cria um objeto struct mediante o operador new, se cria e se chama ao construtor apropriada. A diferena das classes, podem se criar instancias das estruturas sem utilizar o operador new. Se no utilizado new, os campos permanecero sem assinalar e ou objeto no se poder utilizar at haver inicializado todos os campos. A diferena das classes, para as estruturas no existe herana. uma estrutura no pode heredar de outra estrutura ou classe, nem pode ser a base de uma classe. Sem embargo, as estruturas herdam da classe-base Object. uma estrutura pode implementar interfaces do mesmo modo que as classes. A diferena de C++, no pode declarar uma classe mediante a palavra-chave struct. Em C#, as classes e as estruturas so semnticamente diferentes. uma estrutura um tipo de valor, enquanto que uma classe um tipo de referencia. A menos que se necessite semntica de tipos de referencia, o sistema pode processar uma classe que ocupe menos de 16 bytes de forma mais eficaz como estrutura. Para obter mais informao sobre estruturas, veja 11. Estruturas e ou Tutorial de estruturas. Em as extenses administradas para C++, os equivalentes a uma classe do C# e a uma estrutura do C# so os seguintes: C# class Extenses administradas para C++ __gc struct ou __gc class __value struct ou __value class Para obter mais informao... palavra chave __gc Lista que contm as interfaces implementadas pela estrutura, todas separadas por comas.

struct

palavra chave __value

Exemplo 1 Este Exemplo mostra a inicializao de um tipo struct mediante construtores predeterminados e construtores com parmetros. // keyword_struct.cs

Visual C# Consolidado

187

// struct declaration and initialization using System; public struct Point { public int x, y; public Point(int p1, int p2) { x = p1; e = p2; } } class MainClass { public static void Main() { // Initialize: Point myPoint = new Point(); Point yourPoint = new Point(10,10); // Display results: Console.Write("My Point: "); Console.WriteLine("x = {0}, e = {1}", myPoint.x, myPoint.y); Console.Write("Your Point: "); Console.WriteLine("x = {0}, e = {1}", yourPoint.x, yourPoint.y); } }

Resultados
My Point: x = 0, e = 0 Your Point: x = 10, e = 10 Exemplo 2 Este Exemplo mostra uma caracterstica exclusiva das estruturas. Cria um objeto Point sem utilizar o operador new. Se se reemplaza a palavra struct pela palavra class, ou programa no se compilar. // keyword_struct2.cs // Declare a struct object without "new" using System; public struct Point { public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } } class MainClass { public static void Main() { // Declare an object:

Visual C# Consolidado

188

Point myPoint; // Initialize: myPoint.x = 10; myPoint.y = 20; // Display results: Console.WriteLine("My Point:"); Console.WriteLine("x = {0}, e = {1}", myPoint.x, myPoint.y); } }

Resultados
My Point: x = 10, e = 20

PALAVRA-CHAVE AS
O operador as utilizado para realizar converses entre tipos compatibles. o operador as utilizado em expresses da forma: expression a s type de onde: expression Expresso de um tipo de referencia. type Tipo de referencia. Comentarios O operador as funciona como um molde de converso de tipos pero, se existe um erro na conversin, proporciona o valor null em vez de produzir uma exceo. mais formalmente, uma expresso da forma: expression as type equivale a: expression is type ? (type)expression : (type)null salvo que expression s se avalie uma vez. Deve ter-se em conta que o operador as somente executa converses de referencia e converses boxing. O operador as no pode realizar outras converses, como as definidas pelo usuario, que deveriam ser realizadas utilizando expresses de converso. Exemplo // cs_keyword_as.cs // The as operator using System; class MyClass1 { } class MyClass2

Visual C# Consolidado

189

{ } public class IsTest { public static void Main() { object [] myObjects = new object[6]; myObjects[0] = new MyClass1(); myObjects[1] = new MyClass2(); myObjects[2] = "helo"; myObjects[3] = 123; myObjects[4] = 123.4; myObjects[5] = null; for (int i=0; i<myObjects.Length; ++i) { string s = myObjects[i] as string; Console.Write ("{0}:", i); if (s != null) Console.WriteLine ( "'" + s + "'" ); else Console.WriteLine ( "not a string" ); } } }

Resultado
0:not a string 1:not a string 2:'helo' 3:not a string 4:not a string 5:not a string

Palavra-chave explicit
A palavra-chave explicit utilizada para declarar um operador de converso do tipo explcita definida pelo usuario (6.4.4 Converses explcitas definidas pelo usuario). Por exemplo: class MyType { public static explicit operator MyType(int i) { // code to convert from int to MyType } } A diferena da converso implcita, os operadores de converso explcita devem invocarse mediante uma converso explcita do tipo (cast). int i; MyType x = (MyType)i; // int-to-MyType requires cast

Visual C# Consolidado

190

Se no utilizado esta converso explcita, se produza um erro de compilao. Se uma operao de converso do tipo pode produzir excees ou prdida de informao, deve definirse como explicit. Desta forma, se evita que o compilador realice a converso automticamente e se produzcam posibles consecuencias no desejadas. Exemplo O seguinte Exemplo define uma estrutura, Digit, que reapresenta um nico dgito decimal. Se define um operador para converses de byte a Digit, pois como no todos os bytes podem se converter em Digit, a converso explcita. // cs_keyword_explicit.cs using System; struct Digit { byte value; public Digit(byte value) { if (value>9) throw new ArgumentException(); this.value = value; } // define explicit byte-to-Digit conversion operator: public static explicit operator Digit(byte b) { Digit d = new Digit(b); Console.WriteLine("conversion occurred"); return d; } } class Test { public static void Main() { try { byte b = 3; Digit d = (Digit)b; // explicit conversion } catch (Exception e) { Console.WriteLine("{0} Exception caught.", e); } } }

Resultado
conversion occurred

Palavra-chave null
A palavra-chave null um literal que representa uma referencia nula, assim, uma referencia que no aponta a nenhum objeto. Null o valor predeterminado das variveis de tipos de referencia.

Visual C# Consolidado

191

Palavra-chave switch
A instruo switch uma instruo de controle que permite manejar varias selees e passar o controle a uma das instrues case de seu corpo. Apresenta a seguinte forma: s w i t c h ( expression) { c a s e constant-expression: statement jump-statement [d e f a u l t : statement jump-statement] } De onde: expression Expresso do tipo integral ou srie. statement Instrues que se devem executar se se transfere o controle etiqueta caSe o default. jump-statement Instruo de salto que transfere o controle fora do corpo case. constant-expression O controle se transfere a uma instruo case especfica segundo o valor desta expresso. Comentarios O controle se transfere instruo case cuja constante constant-expression coincide com a expresso expression. A instruo switch pode incluir qualquer nmero de elementos case, pois no pode haver dos constantes case com o mesmo valor em uma mesma instruo switch. A execuo do corpo da instruo empieza na instruo selecionada e contina at que a instruo de salto jump-statement transfere o controle fora do corpo case. Observe que necessrio colocar jump-statement ao final de cada boque, incluido ou ltimo boque, j seja uma instruo caSe o uma instruo default. A diferena da instruo switch de C++, C# no admite ou paso explcito de uma etiqueta case a outra. Se o deseja, pode utilizar goto a uma etiqueta caSe o goto default. Se expression no coincide com nenhuma constante constant-expression, o controle se transfere s instrues que seguem etiqueta default opcional. Se no existe uma etiqueta default, o controle se transfere fora da instruo switch. Exemplo // statements_switch.cs using System; class SwitchTest { public static void Main() { Console.WriteLine("Coffee sizes: 1=Small 2=Medium 3=Large"); Console.Write("Please enter your selection: ");

Visual C# Consolidado

192

string s = Console.ReadLine(); int n = int.Parse(s); int cost = 0; switch(n) { case 1: cost += 25; break; case 2: cost += 25; goto case 1; case 3: cost += 50; goto case 1; default: Console.WriteLine("Invalid selection. Please select 1, 2, or 3."); break; } if (cost != 0) Console.WriteLine("Please insert {0} cents.", cost); Console.WriteLine("Thank you for your business."); } } Entrada 2

Resultados do Exemplo
Coffee sizes: 1=Small 2=Medium 3=Large Please enter your selection: 2 Please insert 50 cents. Thank you for your business. Descrio do cdigo No Exemplo anterior, se utilizou uma varivel do tipo integral, n, para os casos da instruo switch. Observe que tambm pode utilizar a varivel de srie, s, diretamente. Nesse caso, a estrutura switch pode apresentar a seguinte forma: switch(s) { case "1": ... case "2": ...

Visual C# Consolidado

193

} Mas no se admite passar explcitamente de uma etiqueta de caso a outra, se est permitido apilhar etiquetas de caso, por exemplo: case 0: case 1: // do something;

Palavra-chave base
A palavra-chave base utilizada para obter acesso a os membros da classe-base desde uma classe derivada: Realice uma chamada a um mtodo da classe-base substitudo por outro mtodo. Especifique a qu construtor da classe-base deve chamar para criar instancias da classe derivada. O acesso a uma classe-base s se permite em um construtor, em um mtodo de instancia ou em um descritor de acesso a uma propriedade de instancia. incorreto utilizar a palavra-chave base dentro de um mtodo esttico. Exemplo Neste exemplo, tanto a classe-base, Person, como a classe derivada, Empoyee, posuem um mtodo denominado Getinfo. Mediante a palavra-chave base, pode realizar uma chamada ao mtodo Getinfo da classe-base desde a classe derivada. // keywords_base.cs // Accessing base class members using System; public class Person { protected string ssn = "444-55-6666"; protected string name = "John L. Malgraine"; public virtual void GetInfo() { Console.WriteLine("Name: {0}", name); Console.WriteLine("SSN: {0}", ssn); } } class Empoyee: Person { public string id = "ABC567EFG"; public override void GetInfo() { // Calling the base class GetInfo method: base.GetInfo(); Console.WriteLine("Empoyee ID: {0}", id); } } class TestClass { public static void Main() { Empoyee E = new Empoyee();

Visual C# Consolidado

194

E.GetInfo(); } }

Resultado
Name: John L. Malgraine SSN: 444-55-6666 Empoyee ID: ABC567EFG Exemplo Este Exemplo mostra como especificar o construtor da classe-base o que se realiza a chamada quando so criados instancias de uma classe derivada. // keywords_base2.cs using System; public class MyBase { int num; public MyBase() { Console.WriteLine("in MyBase()"); } public MyBase(int i ) { num = i; Console.WriteLine("in MyBase(int i)"); } public int GetNum() { return num; } } public class MyDerived: MyBase { // This construtor will call MyBase.MyBase() public MyDerived() : base() { } // This construtor will call MyBase.MyBase(int i) public MyDerived(int i) : base(i) { } public static void Main() { MyDerived md = new MyDerived(); MyDerived md1 = new MyDerived(1); } }

Visual C# Consolidado

195

Resultado
in MyBase() in MyBase(int i)

Palavra-chave extern
Use o modificador extern em uma declarao de mtodo para indicar que o mtodo se implementa externamente. um uso habitual do modificador extern com o atributo DllImport. Veja DllImportAttribute (Classe) para obter mais informao. incorreto utilizar simultneamente os modificadores abstract e extern para modificar o mesmo membro. O uso do modificador extern significa que o mtodo se implementa fora do cdigo do C#, enquanto que o uso do abstract significa que a implementao do mtodo no se inclui na classe. Como uma declarao de mtodo externo no proporciona uma implementao, no existe corpo do mtodo; a declarao de mtodo finaliza simplemente com um ponto e vrgula e sem chaves ({ }) depois da firma. Por exemplo: public static extern int MyMethod(int x); Nota o uso da palavra-chave extern mais limitado que em C++. Para comparara com a palavra-chave de C++, veja Utilizar extern para especificar vinculao na Referencia do lenguaje C++. Exemplo Neste exemplo, ou programa recibe uma srie do usuario e a mostra dentro de um quadro de mensagem. o programa utiliza ou mtodo MessageBox importado da biblioteca User32.dll. using System; using System.Runtime.InteropServices; class MyClass { [DllImport("User32.dll")] public static extern int MessageBox(int h, string m, string c, int type); public static int Main() { string myString; Console.Write("Enter your message: "); myString = Console.ReadLine(); return MessageBox(0, myString, "My Message Box", 0); } } Execuo de Exemplo Enter your message: Where do you want to go today? Tras escrever o texto anterior, aparece na pantala um quadro de mensagem com ese texto. Exemplo Este Exemplo utiliza dos arquivos, CM.cs e Cmdll.c, para demostrar o uso de extern. o arquivo C uma DLL externa que se invoca desde ou programa escrito em C#.

Arquivo Cmdll.c Visual C# Consolidado 196

// cmdll.c // compile with: /LD /MD int __declspec(dllexport) MyMethod(int i) { return i*10; }

Arquivo CM.cs
// cm.cs using System; using System.Runtime.InteropServices; public class MyClass { [DllImport("Cmdll.dll")] public static extern int MyMethod(int x); public static void Main() { Console.WriteLine("MyMethod() returns {0}.", MyMethod(5)); } }

Resultado
MyMethod() returns 50.

Compilao
Para gerar ou proyecto, siga estes pasos:

Compile Cmdll.c como uma DLL mediante a lnea de comandos de Visual C++: Compile CM.cs mediante a lnea de comandos:

cl /LD /MD Cmdll.c csc CM.cs Desta forma, se criar o arquivo executable CM.exe. Quando execute este programa, MyMethod passar o valor 5 ao arquivo DLL, o qual devoltar o valor multiplicado por 10.

Palavra-chave object
O tipo object um alias de System.Object do .NET Framework. As variveis do tipo object podem receber valores de qualquer tipo. Todos os tipos de dados, predefinidos e definidos pelo usuario, herdam da classe System.Object. ou tipo de dados object ou tipo hacia o qual e desde o qual os objetos se conviertem mediante boxing. Exemplo O seguinte Exemplo mostra como as variveis do tipo object podem aceitar valores de qualquer tipo de dados e como podem utilizar mtodos de System.Object procedentes do .NET Framework. // keyword_object.cs using System; public class MyClass1 { public int i = 10;

Visual C# Consolidado

197

} public class MyClass2 { public static void Main() { object a; a = 1; // an example of boxing Console.WriteLine(a); Console.WriteLine(a.GetType()); Console.WriteLine(a.ToString()); Console.WriteLine(); a = new MyClass1 (); MyClass1 ref_MyClass1; ref_MyClass1 = (MyClass1)a; Console.WriteLine(ref_MyClass1.i); } }

Resultados
1 System.Int32 1 10

Palavra-chave this
A palavra-chave this faz referencia instancia atual da classe. As funes membro estticas no apresentam um ponteiro this. Esta palavra-chave this pode ser utilizada para obter acesso a membros desde construtores, mtodos de instancia e descritores de acesso de instancias. A continuao, se indicam algunos usos comunes de this: Obter acesso a membros com o fim de evitar ambigedades com nomes similares, por exemplo: public Empoyee(string name, string alias) { this.name = name; this.alias = alias; } Passar um objeto como parmetro a outros mtodos, por exemplo, para: Declarar indicadores, por exemplo: CalcTax(this); public int this [int param] { get { return array[param]; } set {

Visual C# Consolidado

198

array[param] = value; } } incorreto fazer referencia a this em um mtodo esttico, em um descritor de acesso a uma propriedade esttica ou em um inicializador de varivel de uma declarao de campo. Exemplo Neste exemplo, this utilizado para obter acesso a os membros da classe Empoyee, name e alias, que apresentam ambigedad com nomes similares. Tambm utilizado para passar um objeto ao mtodo CalcTax, o qual pertence a outra classe. // keywords_this.cs // this example using System; public class Empoyee { public string name; public string alias; public decimal salary = 3000.00m; // Construtor: public Empoyee(string name, string alias) { // Use this to qualify the fields, name and alias: this.name = name; this.alias = alias; } // Printing method: public void printEmpoyee() { Console.WriteLine("Name: {0}\nAlias: {1}", name, alias); // Passing the object to the CalcTax method by using this: Console.WriteLine("Taxes: {0:C}", Tax.CalcTax(this)); } } public class Tax { public static decimal CalcTax(Empoyee E) { return (0.08m*(E.salary)); } } public class MainClass { public static void Main() { // Criate objects: Empoyee E1 = new Empoyee ("John M. Trainer", "jtrainer"); // Display results: E1.printEmpoyee(); }

Visual C# Consolidado

199

Resultado
Name: John M. Trainer Alias: jtrainer Taxes: $240.00

Palavra-chave bool
A palavra-chave bool um alias de System.Boolean. utilizado para declarar variveis que armazenam os valores booleanos true e false. Literais possvel assinalar um valor booleano a uma varivel do tipo bool, por exemplo: bool MyVar = true; Tambm pode assinalar uma expresso que se avalie como bool a uma varivel do tipo bool, por exemplo: bool Alphabetic = (c > 64 && c < 123); Converses Em C++, um valor do tipo bool pode converter em um valor do tipo int; assim: false equivale a cero e true equivale a valores distintos de cero. Em C#, no possvel realizar a converso do tipo bool a outros tipos ou viceversa. Por exemplo, a seguinte instruo if no vlida em C#, mas se o em C++: int x = 123; if (x) // Invalid in C# { printf("The value of x is nonzero."); } Para provar uma varivel do tipo int, tem que comparara explcitamente com um valor (por exemplo, cero); assim: int x = 123; if (x != 0) // The C# way { Console.Write("The value of x is nonzero."); } Exemplo Neste exemplo, se escreve um carcter desde ou teclado e ou programa comprova se se trata de uma letra. Nesse caso, comprova se minscula ou maiscula. Em cada caso, se mostra a mensagem apropriada. // keyword_bool.cs // Character Tester using System; public class BoolTest { public static void Main() { Console.Write("Enter a character: "); char c = (char) Console.Read(); if (Char.IsLetter(c))

Visual C# Consolidado

200

if (Char.IsOwer(c)) Console.WriteLine("The character is owercase."); else Console.WriteLine("The character is uppercase."); else Console.WriteLine("The character is not an alphabetic character."); } } Entrada X

Resultados do Exemplo
Enter a character: X The character is uppercase. Sucesivas execues de Exemplo podran ter este aspecto: Enter a character: x The character is owercase. Enter a character: 2 The character is not an alphabetic character.

Palavra-chave false
Em C#, a palavra-chave false pode utilizar como um operador sobrecarregado ou como um literal.

Operador false Literal false

OPERADOR FALSE
Em os tipos definidos pelo usuario pode definir um operador false que devolve o valor do tipo bool true para indicar um valor lgico falso; caso contrario, devolve false. Isto resulta til para tipos que representam valores true, false e null (nem true nem false), como os utilizados em base de dados. Esses tipos podem se utilizar em as expresses de controle das instrues if, do, while e for, assim como em expresses condicionales. Se um tipo define false como operador, tambm deve definir true como operador. Um tipo no pode sobrecarregar diretamente os operadores lgicos condicionais (&& e ||), pois pode conseguir um efeito equivalente se se sobrecarrega os operadores lgicos normais e os operadores true e false (veja 7.11.2 Operadores lgicos condicionais definidos pelo usuario). Exemplo Veja o Exemplo de 11.4.2 Tipo boolean para base de dados.

FALSE (LITERAL)
A palavra-chave false um literal do tipo bool que reapresenta o valor lgico "falso". Exemplo // cs_keyword_false.cs using System;

Visual C# Consolidado

201

class test { public static void Main() { bool a = false; Console.WriteLine( a ? "yes" : "no" ); } }

Resultado
no

Palavra-chave operator
A palavra-chave operator utilizado para declarar um operador em uma declarao de classe o estrutura. uma declarao de operador pode apresentar uma das seguintes cuatro formas: p u b l i c s t a t i c result-type o p e r a t o r unary-operator ( op-type operand ) p u b l i c s t a t i c result-type o p e r a t o r binary-operator ( op-type operand, op-type2 operand2 ) p u b l i c s t a t i c i m p l i c i t o p e r a t o r conv-type-out ( conv-type-in operand ) p u b l i c s t a t i c e x p l i c i t o p e r a t o r conv-type-out ( conv-type-in operand ) de onde: result-type Tipo do resultado do operador. true false unary-operator Uno de os seguintes: + - ! ~ ++ op-type Tipo do primeiro (o nico) parmetro. Mome do primeiro (o nico) parmetro. ^ << >> == != > < >= <= operand binary-operator Uno de os seguintes: op-type2 Tipo do segundo parmetro. Mome do segundo parmetro. Tipo de destino de um operador de converso de tipos. Tipo de entrada de um operador de converso de tipos. operand2 conv-type-out conv-type-in

Visual C# Consolidado

202

Comentarios As dos primeras formas declaram operadores definidos pelo usuario que sobrecarrega operadores integrados. Tenga em cuenta que no todos os operadores integrados podem sobrecargarse (veja Operadores sobrecargables). Ao menos uno de os tipos op-type e op-type2 deve ser ou tipo contenedor (assim, ou tipo do qual membro ou operador). De este modo, por exemplo, se evita ter que redefinir o operador dadio de inteiros. As dos ltimas formas declaram operadores de conversin. S uno de os tipos conv-type-in e conv-type-out deve ser ou tipo contenedor (assim, um operador de converso s pode realizar converses de seu tipo contenedor a outro tipo, ou de outro tipo a seu tipo contenedor). Os operadores s podem tomar parmetros de valor, no parmetros ref ou out. Qualquer declarao de operador pode estar precedida por uma lista opcional de atributos. Exemplo A continuao, se mostra uma classe muy simplificada para nmeros racionales. Sobrecarga os operadores + e * para implementar a adio e multiplicao de nmeros fraccionarios, e tambm proporciona um operador que convierte fraces em nmeros reales do tipo double. // cs_keyword_operator.cs using System; class Fraction { int num, den; public Fraction(int num, int den) { this.num = num; this.dem = den; } // overoad operator + public static Fraction operator +(Fraction a, Fraction b) { return new Fraction(a.num * b.dem + b.num * a.den, a.dem * b.den); } // overoad operator * public static Fraction operator *(Fraction a, Fraction b) { return new Fraction(a.num * b.num, a.dem * b.den); } // define operator double public static implicit operator double(Fraction f) { return (double)f.num / f.den; } } class Test { public static void Main() { Fraction a = new Fraction(1, 2); Fraction b = new Fraction(3, 7);

Visual C# Consolidado

203

Fraction c = new Fraction(2, 3); Console.WriteLine((double)(a * b + c)); } }

Resultado
0.880952380952381

Palavra-chave throw
A instruo throw utilizado para sealizar a apario de uma situao anmaa (exceo) durante a execuo do programa. Apresenta a seguinte forma: t h r o w [expression]; de onde: expression O objeto exceo. Este elemento se omite se se vuelve a iniciar ou objeto de exceo atual em uma clusula catch. Comentarios A exceo provocada um objeto cuja classe derivada de System.Exception, por exemplo: class MyException : System.Exception {} throw new MyException(); Normalmente, a instruo throw utilizado com as instrues try-catch ou try-finally. Quando se provoca uma exceo, ou programa busca a instruo catch que controa esa exceo. Tambm pode voltar a iniciar uma exceo detectada mediante a instruo throw. Exemplo Este Exemplo mostra como provocar uma exceo mediante a instruo throw. // throw example using System; public class ThrowTest { public static void Main() { string s = null; if (s == null) { throw(new ArgumentNullException()); } Console.Write("The string s is null"); // not executed } }

Resultado
Se produza a exceo seguinte: System.ArgumentNullException

Visual C# Consolidado

204

Palavra-chave break
A instruo break permite terminar a instruo switch ou o lao envolvente em os quais aparece. o controle se transfere instruo que sigue instruo terminada, se existe alguna. A instruo apresenta a seguinte forma: break; Exemplo Neste exemplo, a instruo condicional contm um contador preparado para contar de 1 a 100; sem embargo, a instruo break termina ou lao tras 4 iteraes. // statements_break.cs using System; class BreakTest { public static void Main() { for (int i = 1; i <= 100; i++) { if (i == 5) break; Console.WriteLine(i); } } }

Resultado
1 2 3 4 Exemplo Este Exemplo mostra o uso de break em uma instruo switch. // statements_break2.cs // break and switch using System; class Switch { public static void Main() { Console.Write("Enter your selection (1, 2, or 3): "); string s = Console.ReadLine(); int n = Int32.Parse(s); switch(n) { case 1: Console.WriteLine("Current value is {0}", 1); break; case 2: Console.WriteLine("Current value is {0}", 2); break;

Visual C# Consolidado

205

case 3: Console.WriteLine("Current value is {0}", 3); break; default: Console.WriteLine("Sorry, invalid selection."); break; } } } Entrada 1

Resultados do Exemplo
Enter your selection (1, 2, or 3): 1 Current value is 1 Se se escreveu 4, ou resultado sera: Enter your selection (1, 2, or 3): 4 Sorry, invalid selection.

Palavra-chave try-finally
O bloco finally til para liberar os recursos assinalados no bloco try. o controle se transfere siempre ao bloco finally independientemente de como finalice o bloco try. A instruo apresenta a seguinte forma: t r y try-bock f i n a l l y finally-bock de onde: try-bock Contm o segmento de cdigo que pode produzir a exceo. Contm o controlador da exceo e ou cdigo que realiza a liberao de recursos. finally-bock Comentarios Se biem catch utilizado para controlar excees que ocurrem em um bloco de instruces, finally utilizado para garantizar que um bloco de cdigo se executa independientemente de como finaliza o bloco try anterior. Exemplo Neste exemplo, existe uma instruo de converso no vlida que produza uma exceo. Se se executa ou programa, se obtem um mensagem de erro em tiempo de execuo, pois a clusula finally se executa de todas formas e mostra o resultado. // try-finally using System; public class TestTryFinally { public static void Main() { int i = 123; string s = "Some string"; object ou = s;

Visual C# Consolidado

206

try { // Invalid conversion; ou contains a string not an int i = (int) o; } finally { Console.Write("i = {0}", i); } } }

Resultado
Se produza a exceo seguinte: System.InvalidCastException Mas se captur uma exceo, a instruo de salida incluida no bloco finally se executar de todas formas, assim: i = 123 Para obter mais informao acerca de finally, veja try-catch-finally.

Palavra-chave out
A palavra-chave out aplicada a parmetros de mtodos faz que um mtodo haga referencia varivel pasada ao mtodo. Qualquer cambio que se realice no parmetro dentro do mtodo se reflejar em esa varivel quando se devuelva o controle ao mtodo que realiz a chamada. Declarar um mtodo como out til quando se deseja que devuelva varios valores. um mtodo que utiliza um parmetro out puede, no obstante, seguir devolviendo um valor. um mtodo pode ter mais de um parmetro out. Para utilizar um parmetro out, ou argumento deve passarse explcitamente ao mtodo como um argumento out. o valor de um argumento out no se passar ao parmetro out. Uma varivel que se pasa como argumento out no necessita inicializarse. No obstante, deve assinalarse um valor ao parmetro out antes de que o mtodo devuelva a chamada. Uma propriedade no uma varivel y, por tanto, no pode passar como parmetro out. Se as declaraes de dois mtodos s se diferenan no uso de out, existir sobrecarga. Sem embargo, no possvel definir uma sobrecarga que s se diferencie em ref e out. Por exemplo, as seguintes declaraes de sobrecarga so vlidas: class MyClass { public void MyMethod(int i) {i = 10;} public void MyMethod(out int i) {i = 10;} } pois as seguintes no o son: class MyClass { public void MyMethod(out int i) {i = 10;} public void MyMethod(ref int i) {i = 10;} } Exemplo

Visual C# Consolidado

207

// cs_out.cs using System; public class MyClass { public static int TestOut(out char i) { i = 'b'; return -1; } public static void Main() { char i; // varivel need not be initialized Console.WriteLine(TestOut(out i)); Console.WriteLine(i); } }

Resultado
-1 b

Palavra-chave true
Em C#, a palavra-chave true pode utilizar como um operador sobrecarregado ou como um literal:

Operador true Literal true

OPERADOR TRUE
Em os tipos definidos pelo usuario pode definir um operador true que devolve o valor do tipo bool true para indicar um valor lgico verdadero; caso contrario, devolve false. Isto resulta til para tipos que representam valores true, false e null (nem true nem false), como os utilizados em base de dados. Esses tipos podem se utilizar em as expresses de controle das instrues if, do, while e for, assim como em expresses condicionales. Se um tipo define true como operador, tambm deve definir false como operador. Um tipo no pode sobrecarregar diretamente os operadores lgicos condicionais (&& e ||), pois pode conseguir um efeito equivalente se se sobrecarrega os operadores lgicos normais e os operadores true e false (veja 7.11.2 Operadores lgicos condicionais definidos pelo usuario). Exemplo Veja o Exemplo de 11.4.2 Tipo boolean para base de dados.

TRUE (LITERAL)
A palavra-chave true um literal do tipo bool que reapresenta o valor lgico "verdadero". Exemplo // cs_keyword_true.cs using System; class test

Visual C# Consolidado

208

{ public static void Main() { bool a = true; Console.WriteLine( a ? "yes" : "no" ); } }

Resultado
yes

Palavra-chave byte
A palavra-chave byte denota um tipo integral que armazena valores segundo se indica na taba seguinte. Tipo byte Literais As variveis do tipo byte podem se declarar e inicializar como no seguinte exemplo: byte myByte = 255; Na declarao anterior, ou literal inteiro 255 se convierte implcitamente do tipo int ao tipo byte. Se o literal inteiro supera ou intervalo de valores do tipo byte, se produzir um erro de compilao. Converses Existe uma converso implcita predefinida de byte a short, ushort, int, uint, ong, uong, foat, double ou decimal. No podem se converter implcitamente tipos numricos no literais cujo tamanho darmazenamiento seja superior a byte (veja Tabela de tipos integrais para conhecer os tamanhos darmazenamiento de os tipos integrais). Considere, por exemplo, as dos seguintes variveis do tipo byte, x e y: byte x = 10, e = 20; A instruo dassinalao seguinte produzir um erro de compilao, j que a expresso aritmtica do lado direito do operador dassinalao se avalie de forma predeterminada como int. byte z = x + y; // Erro: conversion from int to byte Para solucionar este problema, utilize uma converso explcita: byte z = (byte)(x + y); // OK: explicit conversion Mas, possvel utilizar as instrues seguintes, de onde a varivel de destino tem um tamanho darmazenamiento igual ou superior: int x = 10, e = 20; int m = x + y; ong n = x + y; Intervalo 0 a 255 Tamanho Inteiro de 8 bits sem signo Tipo do .NET Framework System.Byte

Visual C# Consolidado

209

Assim mesmo, no existe converso implcita de tipos de ponto flutuante a tipo byte. Por exemplo, a instruo seguinte gerar um erro de compilao, a menos que se utilize uma converso explcita: byte x = 3.0; // Erro: no implicit conversion from double byte e = (byte)3.0; // OK: explicit conversion Para chamar os mtodos sobrecarregados, deve se utilizar uma converso explcita de tipos. Considere, por exemplo, os dos seguintes mtodos sobrecarregados que utilizam parmetros do tipo byte e int: public static void MyMethod(int i) {} public static void MyMethod(byte b) {} Se utilizada a converso ao tipo byte, se garante a chamada ao tipo correto; por exemplo: MyMethod(5); // Calling the method with the int parameter MyMethod((byte)5); // Calling the method with the byte parameter Para obter mais informao sobre expresses aritmticas com tipos de ponto flutuante e tipos integrais, veja foat e double. Para obter mais informao sobre as regas de converso numrica implcitas, veja a Taba de converses numricas implcitas.

Palavra-chave fixed
Impide que o recolector de elementos no utilizados cambie a colocao de uma varivel. Apresenta a seguinte forma: f i x e d ( type* ptr = expr ) statement de onde: type Tipo no administrado ou tipo void. ptr expr Expresso que pode converter implcitamente em um tipo type*. statement Instruo o bloco executable. Comentarios A instruo fixed s se permite em um contexto unsafe. A instruo fixed establece um ponteiro em uma varivel administrada e "fija" esa varivel durante a execuo da instruo o bloco statement. Sem fixed, os ponteiros a variveis administradas seran de poca utilidad, j que o proceso de recoleo de elementos no utilizados poderia cambiar a colocao das variveis de forma impredecible. De hecho, ou compilador do C# no permite definir um ponteiro a uma varivel administrada se no em uma instruo fixed. // assume class Point { public int x, y; } Point pt = new Point(); // pt is a managed varivel, subject to g.c. fixed ( int* p = &pt.x ){ // must use fixed to get address of pt.x and *p = 1; // pin pt in place while we use the pointer } Um ponteiro pode inicializar com a direo de uma matriz ou de uma srie: Mome de ponteiro.

Visual C# Consolidado

210

fixed (int* p = arr) ... // equivalent to p = &arr[0] fixed (char* p = str) ... // equivalent to p = &str[0] Se podem inicializar varios ponteiros vez, siempre que sean do mesmo tipo: fixed (byte* ps = srcarray, pd = dstarray) {...} Para inicializar ponteiros de diferente tipo, simplemente anide instrues fixed: fixed (int* p1 = &p.x) fixed (double* p2 = &array[5]) // do something with p1 and p2 Os ponteiros inicializados em instrues fixed no podem se modificar. Depois de executar a instruo o bloco statement, qualquer varivel anteriormente fijada queda j sometida ao proceso de recoleo de elementos no utilizados. Por consiguiente, no deve apuntar a esas variveis desde fora da instruo fixed. no modo no seguro (unsafe), pode assinalar memoria pilha, de onde no est sometida a recoleo de elementos no utilizados y, por o tanto, no necessita fijarse. Veja stackaloc para obter mais informao. Exemplo // statements_fixed.cs // compile with: /unsafe using System; class Point { public int x, y; } class FixedTest { // unsafe method: takes pointer to int unsafe static void SquarePtrParam (int* p) { *p *= *p; } unsafe public static void Main() { Point pt = new Point(); pt.x = 5; pt.y = 6; // pin pt in place: fixed (int* p = &pt.x) { SquarePtrParam (p); } // pt now unpinned Console.WriteLine ("{0} {1}", pt.x, pt.y); } }

Resultado
25 6

Visual C# Consolidado

211

Palavra-chave override
Utilize o modificador override para modificar um mtodo, uma propiedad, um indicador ou um evento. Os mtodos de reemplazo proporcionam uma nueva implementao de um membro herdado de uma classe-base. ou mtodo substitudo por uma declarao override se conhece como mtodo base reemplazado. ou mtodo base substitudo deve ter a mesma firma que o mtodo de reemplazo. No pode substituir um mtodo esttico ou no virtual. ou mtodo base substitudo deve ser virtual, abstract u override. Uma declarao override no pode cambiar a accesibilidad do mtodo virtual. Tanto ou mtodo de reemplazo como ou mtodo virtual devem ter o mesmo modificador de nivo de acesso . No podem se utilizar os seguintes modificadores para modificar um mtodo de reemplazo: new static virtual abstract Uma declarao de propriedade de reemplazo deve especificar o mesmo modificador de acesso , tipo e mome que a propriedade herdada, e a propriedade reemplazada deve ser virtual, abstract u override. Para obter mais informao acerca do acesso a os membros de uma classe-base, veja 7.5.8 acesso base. Para obter mais informao sobre como substituir mtodos, veja 10.5.4 Mtodos de reemplazo. Exemplo Veja o Exemplo correspondiente da palavra-chave virtual. Desde dentro da classe derivada que posee um mtodo de reemplazo, an possvel ter acesso , mediante a palavra-chave base, ao mtodo base substitudo que tno mesmo nome. Por exemplo, se se dispe de um mtodo virtual MyMethod(), e um mtodo de reemplazo em uma classe derivada, pode obter acesso ao mtodo virtual desde a classe derivada mediante a chamada: base.MyMethod() Compare esta opo com a de C++, de onde utilizado o operador de resoluo de mbito (::) e o nome da classe-base, por exemplo: My_Base_Class_Name::MyMethod() Exemplo Neste exemplo, existe uma classe-base, Square, e uma classe derivada, Cube. Como a rea de um cubo a soma das reas de seis quadrados, possvel calcular mediante uma chamada ao mtodo Area() da classe-base. // cs_override_keyword.cs // Calling overridem methods from the base class using System; class TestClass { public class Square { public double x; // Construtor: public Square(double x) { this.x = x; }

Visual C# Consolidado

212

public virtual double Area() { return x*x; } } class Cube: Square { // Construtor: public Cube(double x): base(x) { } // Calling the Area base method: public override double Area() { return (6*(base.Area())); } } public static void Main() { double x = 5.2; Square s = new Square(x); Square c = new Cube(x); Console.WriteLine("Area of Square = {0:F2}", s.Area()); Console.WriteLine("Area of Cube = {0:F2}", c.Area()); } }

Resultado
Area of Square = 27.04 Area of Cube = 162.24

Palavra-chave try-catch
A instruo try-catch consta de um bloco try seguido de uma ou mais clusulas catch, as quais especificam controladores para diferentes excees . Esta instruo apresenta uma das seguintes formas: t r y try-bock c a t c h ( exception-declaration-1) catch-bock-1 c a t c h ( exception-declaration-2) catch-bock-2 ... t r y try-bock c a t c h catch-bock de onde: try-bock Contm o segmento de cdigo que pode produzir a exceo. Declarao do objeto exceo. Contm o controlador da exceo. exception-declaration, exception-declaration-1, exception-declaration-2 catch-bock, catch-bock-1, catch-bock-2 Comentarios

Visual C# Consolidado

213

O bloco try-bock Contm o bloco de cdigo suceptvel de causar a exceo. Este bloco se executa at que se produza uma exceo ou at completarse satisfatoriamente. Por exemplo, ou seguinte intento de converter o tipo de um objeto null provoca a exceo NullReferenceException: object o2 = null; try { int i2 = (int) o2; // Erro } A clusula catch pode utilizar sem argumentos, em cujo caso captura qualquer tipo de exceo e se conhece como clusula catch geral. Tambm pode aceitar um argumento de objeto derivado de System.Exception, em cujo caso trata uma exceo especfica. Por exemplo: catch (InvalidCastException e) { } possvel utilizar mais de uma clusula catch especfica na mesma instruo try-catch. Neste caso, a ordem das clusulas catch importante j que estas se examinam por ordem. As excees mais especficas se capturam ant que as menos especficas. Se pode utilizar uma instruo throw no bloco catch para voltar a provocar a exceo capturada pela instruo catch. Por exemplo: catch (InvalidCastException e) { throw (e); // Rethrowing exception e } Se deseja voltar a provocar a exceo que est sendo atualmente controlada por uma clusula catch sem parmetros, use a instruo throw sem argumentos. Por exemplo: catch { throw; } Quando estes dentro de um bloco try, inicialice s variveis declaradas em seu interior; caso contrario, pode provocarse uma exceo ant de que se complete a execuo do boque. Por exemplo, no seguinte Exemplo de cdigo, a varivel x se inicializa dentro do bloco try. Ao intentar utilizar a varivel fora do bloco try, na instruo Write(x), se gerar ou seguinte erro do compilador: Uso de varivel ocal no assinalada. public static void Main() { int x; try { x = 123; // Don't do that. // ... } catch { // ... } Console.Write(x); // Erro: Use of unassigned ocal varivel 'x'. }

Visual C# Consolidado

214

Exemplo Neste exemplo, o bloco try contm uma chamada ao mtodo MyFn(), que pode produzir uma exceo. A clusula catch Contm o controlador da exceo, o qual simplemente mostra um mensagem na tela. Quando se realiza a chamada instruo throw desde dentro de MyFn(), o sistema busca a instruo catch e mostra a mensagem Exception caught. // Rethrowing exceptions: using System; class MyClass { public static void Main() { MyClass x = new MyClass(); try { string s = null; x.MyFn(s); } catch (Exception e) { Console.WriteLine("{0} Exception caught.", e); } } public void MyFn(string s) { if (s == null) throw(new ArgumentNullException()); } }

Resultado
Se produza a exceo seguinte: System.ArgumentNullException Exemplo Neste exemplo, se utilizam dos instrues catch. A exceo mais especfica, que aparece em primeiro lugar, se captura primero. // Ordering catch clauses using System; class MyClass { public static void Main() { MyClass x = new MyClass(); try { string s = null; x.MyFn(s); } // Most specific: catch (ArgumentNullException e)

Visual C# Consolidado

215

{ Console.WriteLine("{0} First exception caught.", e); } // Least specific: catch (Exception e) { Console.WriteLine("{0} Second exception caught.", e); } } public void MyFn(string s) { if (s == null) throw new ArgumentNullException(); } }

Resultado
Se produza a exceo seguinte: System.ArgumentNullException No Exemplo anterior, se empieza com a clusula catch menos especfica, se obter o mensagem: A previous catch clause already catch all exceptions of this or a super type ('System.Exception') No obstante, para capturar a exceo menos especfica, deve substituir a instruo throw pela seguinte: throw new Exception();

Palavra-chave switch
A instruo switch uma instruo de controle que permite manejar varias selees e passar o controle a uma das instrues case de seu cuerpo. Apresenta a seguinte forma: s w i t c h ( expression) { c a s e constant-expression: statement jump-statement [d e f a u l t : statement jump-statement] } De onde: expression Expresso do tipo integral ou srie. statement Instrues que se devem executar se se transfere o controle etiqueta caSe o default. jump-statement Instruo de salto que transfere o controle fora do corpo case. constant-expression

Visual C# Consolidado

216

O controle se transfere a uma instruo case especfica segundo o valor desta expresso. Comentarios O controle se transfere instruo case cuja constante constant-expression coincide com a expresso expression. A instruo switch pode incluir qualquer nmero de elementos case, pois no pode haver dos constantes case com o mesmo valor em uma mesma instruo switch. A execuo do corpo da instruo empieza na instruo selecionada e contina at que a instruo de salto jump-statement transfere o controle fora do corpo case. Observe que necessrio colocar jump-statement ao final de cada boque, incluido ou ltimo boque, j seja uma instruo caSe o uma instruo default. A diferena da instruo switch de C++, C# no admite ou paso explcito de uma etiqueta case a outra. Se o deseja, pode utilizar goto a uma etiqueta caSe o goto default. Se expression no coincide com nenhuma constante constant-expression, o controle se transfere s instrues que seguem etiqueta default opcional. Se no existe uma etiqueta default, o controle se transfere fora da instruo switch. Exemplo // statements_switch.cs using System; class SwitchTest { public static void Main() { Console.WriteLine("Coffee sizes: 1=Small 2=Medium 3=Large"); Console.Write("Please enter your selection: "); string s = Console.ReadLine(); int n = int.Parse(s); int cost = 0; switch(n) { case 1: cost += 25; break; case 2: cost += 25; goto case 1; case 3: cost += 50; goto case 1; default: Console.WriteLine("Invalid selection. Please select 1, 2, or 3."); break; } if (cost != 0) Console.WriteLine("Please insert {0} cents.", cost); Console.WriteLine("Thank you for your business."); } } Entrada 2

Visual C# Consolidado

217

Resultados do Exemplo
Coffee sizes: 1=Small 2=Medium 3=Large Please enter your selection: 2 Please insert 50 cents. Thank you for your business. Descrio do cdigo No Exemplo anterior, se utilizou uma varivel do tipo integral, n, para os casos da instruo switch. Observe que tambm pode utilizar a varivel de srie, s, diretamente. Nesse caso, a estrutura switch pode apresentar a seguinte forma: switch(s) { case "1": ... case "2": ... } Mas no se admite passar explcitamente de uma etiqueta de caso a outra, se est permitido apilhar etiquetas de caso, por exemplo: case 0: case 1: // do something;

Palavra-chave foat
A palavra-chave foat denota um tipo simple que armazena valores de ponto flutuante de 32 bits. A seguinte taba mostra a precisin e ou intervalo aproximado para o tipo foat. Tipo foat Literais De forma predeterminada, um literal numrico real no lado direito do operador dassinalao se trata como double. Por consiguiente, para inicializar uma varivel do tipo foat, utilize ou sufijo f ou F; por exemplo: foat x = 3.5F; Se no utiliza ou sufijo na declarao anterior, obter um erro de compilao, j que est intentando armazenar um valor do tipo double em uma varivel do tipo foat. Converses possvel combinar tipos numricos integral e tipos de ponto flutuante em uma expresso. Neste caso, os tipos integrais se conviertem em tipos de ponto fotante. A evaluao da expresso se realiza segundo as seguintes reglas:
Se uno de os tipos de ponto flutuante double, a expresso se avalie como double (o bool no caso de expresses relacionales ou booleanas).

Intervalo aproximado 1.5 10 a 3.4 10


45 38

Precisin 7 dgitos

Tipo do .NET Framework System.Single

Se no existe nenhum tipo double na expresso, esta se avalie como foat (o bool no caso de expresses relacionales ou booleanas). Uma expresso de ponto flutuante pode conter os seguintes conjuntos de valores: Cero negativo e positivo

Visual C# Consolidado

218

Infinito positivo e negativo Valor Nam (no um nmero) O conjunto finito de valores distintos de cero

Para obter mais informao sobre estes valores, consulte o estndar IEEE para aritmtica binaria de ponto flutante, disponivel no sitio Web http://www.ieee.org/. Exemplo No seguinte exemplo, se inclui um int, um short e um foat em uma expresso matemtica que proporciona um resultado do tipo foat (observe que no existe nenhum double na expresso). // keyword_foat.cs // Mixing types in expressions using System; class MixedTypes { public static void Main() { int x = 3; foat e = 4.5f; short z = 5; Console.WriteLine("The result is {0}", x*y/z); } }

Resultados
The result is 2.7

Palavra-chave params
A palavra-chave params permite especificar um parmetro de mtodo que aceita um nmero varivel dargumentos. No permitido parmetros adicionales depois da palavra-chave params, nem varias palavraschave params em uma mesma declarao de mtodo. Exemplo // cs_params.cs using System; public class MyClass { public static void UseParams(params int[] list) { for ( int i = 0 ; i < list.Length ; i++ ) Console.WriteLine(list[i]); Console.WriteLine(); } public static void UseParams2(params object[] list) { for ( int i = 0 ; i < list.Length ; i++ ) Console.WriteLine(list[i]); Console.WriteLine(); } public static void Main() {

Visual C# Consolidado

219

UseParams(1, 2, 3); UseParams2(1, 'a', "test"); int[] myarray = new int[3] {10,11,12}; UseParams(myarray); } }

Resultado
1 2 3 1 a test 10 11 12

Palavra-chave typeof
O operador typeof utilizado com o fim de obter ou objeto System.Type para um tipo. uma expresso typeof se apresenta da seguinte forma: t y p e o f ( type) de onde: type Tipo cujo objeto System.Type se deseja obtener. Comentarios O operador typeof no pode sobrecargar. Para obter ou tipo de uma expresso em tiempo de execuo, pode utilizar o mtodo GetType do .NET Framework. Exemplo // cs_operator_typeof.cs // Using typeof operator using System; using System.Reflection; public class MyClass { public int intI; public void MyMeth() { } public static void Main() {

Visual C# Consolidado

220

Type t = typeof(MyClass); // alternatively, you could use // MyClass t1 = new MyClass(); // Type t = t1.GetType(); MethodInfo[] x = t.GetMethods(); foreach (MethodInfo xtemp in x) { Console.WriteLine(xtemp.ToString()); } Console.WriteLine(); MemberInfo[] x2 = t.GetMembers(); foreach (MemberInfo xtemp2 in x2) { Console.WriteLine(xtemp2.ToString()); } } }

Resultado
Int32 GetHashCode() Boolean Equals(System.Object) System.String ToString() Void MyMeth() Void Main() System.Type GetType() Int32 intI Int32 GetHashCode() Boolean Equals(System.Object) System.String ToString() Void MyMeth() Void Main() System.Type GetType() Void .ctor() Exemplo // cs_operator_typeof2.cs // Using GetType method using System; class GetTypeTest { public static void Main() { int radius = 3; Console.WriteLine("Area = {0}", radius*radius*Math.PI); Console.WriteLine("The type is {0}",

Visual C# Consolidado

221

(radius*radius*Math.PI).GetType()); } }

Resultado
Area = 28.2743338823081 The type is System.Double

Palavra-chave try-catch
A instruo try-catch consta de um bloco try seguido de uma ou mais clusulas catch, as quais especificam controladores para diferentes excees . Esta instruo apresenta uma das seguintes formas: t r y try-bock c a t c h ( exception-declaration-1) catch-bock-1 c a t c h ( exception-declaration-2) catch-bock-2 ... t r y try-bock c a t c h catch-bock de onde: try-bock Contm o segmento de cdigo que pode produzir a exceo. Declarao do objeto exceo. Contm o controlador da exceo. exception-declaration, exception-declaration-1, exception-declaration-2 catch-bock, catch-bock-1, catch-bock-2 Comentarios O bloco try-bock Contm o bloco de cdigo suceptvel de causar a exceo. Este bloco se executa at que se produza uma exceo ou at completarse satisfatoriamente. Por exemplo, ou seguinte intento de converter o tipo de um objeto null provoca a exceo NullReferenceException: object o2 = null; try { int i2 = (int) o2; // Erro } A clusula catch pode utilizar sem argumentos, em cujo caso captura qualquer tipo de exceo e se conhece como clusula catch geral. Tambm pode aceitar um argumento de objeto derivado de System.Exception, em cujo caso trata uma exceo especfica. Por exemplo: catch (InvalidCastException e) { } possvel utilizar mais de uma clusula catch especfica na mesma instruo try-catch. Neste caso, a ordem das clusulas catch importante j que estas se examinam por ordem. As excees mais especficas se capturam antes que as menos especficas.

Visual C# Consolidado

222

Se pode utilizar uma instruo throw no bloco catch para voltar a provocar a exceo capturada pela instruo catch. Por exemplo: catch (InvalidCastException e) { throw (e); // Rethrowing exception e } Se deseja voltar a provocar a exceo que est sendo atualmente controlada por uma clusula catch sem parmetros, use a instruo throw sem argumentos. Por exemplo: catch { throw; } Quando estes dentro de um bloco try, inicialice s variveis declaradas em seu interior; caso contrario, pode provocarse uma exceo antes de que se complete a execuo do boque. Por exemplo, no seguinte Exemplo de cdigo, a varivel x se inicializa dentro do bloco try. Ao intentar utilizar a varivel fora do bloco try, na instruo Write(x), se gerar ou seguinte erro do compilador: Uso de varivel ocal no assinalada. public static void Main() { int x; try { x = 123; // Don't do that. // ... } catch { // ... } Console.Write(x); // Erro: Use of unassigned ocal varivel 'x'. } Exemplo Neste exemplo, o bloco try contm uma chamada ao mtodo MyFn(), que pode produzir uma exceo. A clusula catch Contm o controlador da exceo, o qual simplemente mostra um mensagem na tela. Quando se realiza a chamada instruo throw desde dentro de MyFn(), o sistema busca a instruo catch e mostra a mensagem Exception caught. // Rethrowing exceptions: using System; class MyClass { public static void Main() { MyClass x = new MyClass(); try { string s = null; x.MyFn(s); } catch (Exception e)

Visual C# Consolidado

223

{ Console.WriteLine("{0} Exception caught.", e); } } public void MyFn(string s) { if (s == null) throw(new ArgumentNullException()); } }

Resultado
Se produza a exceo seguinte: System.ArgumentNullException Exemplo Neste exemplo, se utilizam dos instrues catch. A exceo mais especfica, que aparece em primeiro lugar, se captura primero. // Ordering catch clauses using System; class MyClass { public static void Main() { MyClass x = new MyClass(); try { string s = null; x.MyFn(s); } // Most specific: catch (ArgumentNullException e) { Console.WriteLine("{0} First exception caught.", e); } // Least specific: catch (Exception e) { Console.WriteLine("{0} Second exception caught.", e); } } public void MyFn(string s) { if (s == null) throw new ArgumentNullException(); } }

Resultado
Se produza a exceo seguinte:

Visual C# Consolidado

224

System.ArgumentNullException No Exemplo anterior, se empieza com a clusula catch menos especfica, se obter o mensagem: A previous catch clause already catches all exceptions of this or a super type ('System.Exception') No obstante, para capturar a exceo menos especfica, deve substituir a instruo throw pela seguinte: throw new Exception();

Palavra-chave for
O lao for executa uma instruo ou um bloco de instrues repetidamente at que uma expresso especificada se avalie como false. Apresenta a seguinte forma: f o r ( [initializers]; [expression]; [iterators]) statement de onde: initializers Lista de expresses ou instrues dassinalao, separadas por comas, que inicializam os contadores do lao. expression Expresso que pode converterse implcitamente no tipo bool ou em um tipo que contenga a sobrecarga de os operadores true e false. A expresso se usa para comprovar ou criterio de terminao do lao. iterators Expresses ou instrues que incrementan ou reducem os contadores do lao. Instrues que se devem executar dentro do lao. statement Comentarios A instruo for executa sus instrues internas repetidamente da seguinte forma:

Primero, avalie os inicializadores.

A continuao, enquanto expression se avalie como true, se executan as instrues do lao e se avalien os iteradores. Quando expression se faz false, o controle se transfere fora do lao. Debido a que a comprobao de expression tem lugar antes da execuo do lao, a instruo for se executa cero ou varias veces. Todas as expresses da instruo for so opcionales; por exemplo, a seguinte instruo utilizado para criar um lao infinito:

for (;;) { ... } Exemplo // statements_for.cs // for oop using System; public class ForOopTest { public static void Main()

Visual C# Consolidado

225

{ for (int i = 1; i <= 5; i++) Console.WriteLine(i); } }

Resultado
1 2 3 4 5

Palavra-chave private
A palavra-chave private um modificador de acesso de membros. ou acesso do tipo private corresponde ao nivo de acesso mais restrictivo. Os membros privados s so accesibles dentro do corpo da classe o a estrutura na qual se declaran. Os tipos anidados do mesmo corpo tambm podem ter acesso a esses membros privados. Fazer referencia a um membro privado fora da classe o estrutura na que se declara produza um erro de compilao. Encontrar uma comparao de private com os outros modificadores de acesso em Niveles daccesibilidad. Exemplo Neste exemplo, a classe Empoyee contm um membro pblico, Name, e um membro privado, Salary. ou acesso ao membro pblico pode realizar diretamente, enquanto que o acesso ao membro privado deve fazerse a travs do mtodo pblico AccessSalary(). // private_keyword.cs using System; class Empoyee { public string name = "xx"; double salary = 100.00; // private access by default public double AccessSalary() { return salary; } } class MainClass { public static void Main() { Empoyee e = new Empoyee(); // Accessing the public field: string n = e.name; // Accessing the private field: double s = e.AccessSalary(); }

Visual C# Consolidado

226

} No Exemplo anterior, se intenta obter acesso diretamente a os membros privados mediante uma instruo como a seguinte: double s = e.salary; obter o seguinte mensagem de erro: 'Empoyee.Salary' is inaccessible due to its protection level.

Palavra-chave uint
A palavra-chave uint denota um tipo integral que armazena valores segundo ou tamanho e ou intervo que se indicam na taba seguinte. Tipo uint Literais As variveis do tipo uint podem se declarar e inicializar como no seguinte exemplo: uint myUint = 4294967290; Quando um literal inteiro no tem sufijo, seu tipo ou primero de estes tipos no que pode representar seu valor: int, uint, ong, uong. Neste exemplo, uint. Tambm pode utilizar o sufijo u ou U: uint myUint = 123U; Quando utilizado ou sufijo U ou u, ou tipo do literal ser uint ou uong, segundo seu tamanho. Neste exemplo, uint. Converses Existe uma converso implcita predefinida de uint a ong, uong, foat, double ou decimal. Por exemplo: foat myFoat = 4294967290; // OK: implicit conversion to foat Existe uma converso implcita predefinida de byte, ushort ou char a uint. Em qualquer outro caso, deve utilizar uma converso explcita. Por exemplo, para uma varivel do tipo ong, myOng, a seguinte instruo dassinalao produzir um erro de compilao sem uma converso explcita: ong myOng = 22; uint myUint = myOng; // Erro: no implicit conversion from ong uint myUint = (uint)myOng; // OK: explicit conversion Observe que tampoco existe converso implcita de tipos de ponto flutuante a uint. Por exemplo, a instruo seguinte gerar um erro de compilao, a menos que se utilize uma converso explcita: uint x = 3.0; // Erro: no implicit conversion from double uint e = (uint)3.0; // OK: explicit conversion Para obter mais informao sobre expresses aritmticas com tipos de ponto flutuante e tipos integrais, veja foat e double. Para obter mais informao sobre as regas de converso numrica implcitas, veja a Taba de converses numricas implcitas. Intervalo 0 a 4.294.967.295 Tamanho Inteiro de 32 bits sem signo Tipo do .NET Framework System.UInt32

Visual C# Consolidado

227

PALAVRA-CHAVE CHAR
A palavra-chave char utilizado para declarar um carcter Unicode no intervalo indicado na seguinte tabla. Os caracteres Unicode so caracteres de 16 bits que se utilizam para representar a maiora de os lenguajes escritos de todo ou mundo. Tipo do .NET Framework System.Char

Tipo char Literais

Intervalo U+0000 a U+ffff

Tamanho Carcter Unicode de 16 bits

As constantes do tipo char podem se escrever como caracteres literais, secuencias de escape hexadecimales ou representaes Unicode. Os cdigos de caracteres integrais podem se converter explcitamente ao tipo char. Em as seguintes instrues se declara uma varivel do tipo char e se inicializa com o carcter X: char MyChar = 'X'; // Character literal char MyChar = '\x0058'; // Hexadecimal char MyChar = (char)88; // Cast from integral type char MyChar = '\u0058'; // Unicode Converses Um valor do tipo char pode converter implcitamente a os tipos ushort, int, uint, ong, uong, foat, double ou decimal. Sem embargo, no existem converses implcitas desde outros tipo ao tipo char.

Palavra-chave foreach, in
A instruo foreach repite um grupo de instrues incluidas no lao para cada elemento de uma matriz ou de um objeto collection. A instruo foreach utilizado para iterar em uma coleo de elementos e obter a informao desejada, pois no deve utilizar para cambiar ou contenido da coleco, j que podem se produzir efectos secundarios imprevisibles. A instruo apresenta a seguinte forma: f o r e a c h ( type identifier i n expression) statement de onde: type Tipo do identificador identifier. identifier Varivel de iterao que reapresenta ou elemento da coleco. Se a varivel de iterao um tipo de valor, se trata em efeito de uma varivel de s lectura que no pode ser modificada. expression Expresso que reapresenta uma matriz ou uma coleo de objetos. ou tipo de os elementos da coleo deve poder converterse ao tipo de identifier. No utilize uma expresso que evale como null. Evale um tipo que implemente IEnumerable ou um tipo que declare um mtodo GetEnumerator. no ltimo caso, GetEnumerator deve devoltar um tipo que implemente IEnumerator ou que declare todos os mtodos definidos em IEnumerator statement

Visual C# Consolidado

228

Instrues que se devem executar dentro do lao.

Comentarios As instrues do lao seguem executndose para cada elemento da matriz ou a coleco. Quando j se han recorrido todos os elementos da coleco, o controle se transfere seguinte instruo fora do bloco foreach. Para obter mais informao acerca da palavra-chave foreach, incluidos exemplos de cdigo, veja os temas seguintes:

Usar foreach com arrays Usar foreach com colees

Palavra-chave volatile
A palavra-chave volatile indica que um campo pode ser modificado no programa pelo sistema operativo, ou hardware ou um subproceso em execuo de forma simultnea. v o l a t i l e declaration de onde: declaration A declarao de um campo. Comentarios O sistema siempre lee o valor atual de um objeto voltil no ponto de onde se solicita, aum quando a instruo previa pidiera um valor ao mesmo objeto. Assim mesmo, o valor de um objeto se escreve inmediatamente no momento da assinalao. O modificador volatile se suele utilizar para um campo ao que tengan acesso varios subprocesses sem utilizar a instruo ock para serializar ou acesso . O uso do modificador volatile garante que um subproceso recupere o valor mais atualizado de os escritos por outro subproceso. O tipo de um campo marcado como voltil est restringido a os seguintes tipos: Qualquer tipo de referencia. Qualquer tipo de ponteiro (em um contexto no seguro). Os tipos byte, sbyte, short, ushort, int, uint, char, foat ou bool. Um tipo enum com um tipo base enum de byte, sbyte, short, ushort, int ou uint.

Para obter mais informao sobre o modificador volatile, veja 10.4.3 Campos voltiles. Exemplo O Exemplo seguinte mostra como declarar uma varivel de campo pblica como volatile. // csharp_volatile.cs class Test { public volatile int i; Test(int _i) { i = _i; } public static void Main() {

Visual C# Consolidado

229

} }

Palavra-chave delegate
Uma declarao delegate define um tipo de referencia que pode utilizar para encapsular um mtodo com uma firma especfica. uma instancia de delegado encapsua um mtodo esttico ou de instancia. Os delegados so similares a os ponteiros a funes de C++, pois so mais seguros e proporcionam maior seguridad de tipos. A declarao apresenta a seguinte forma: [attributes] [modifiers] d e l e g a t e result-type identifier ( [formal-parameters]) ; de onde: attributes (opcional) Informao declarativa adicional. Para obter mais informao sobre os atributos e as classes datributo, veja 17. Atributos. modifiers (opcional) Os modificadores permitidos so new e os cuatro modificadores de acesso . result-type Tipo do resultado, que coincide com o tipo devuelto do mtodo. Mome do delegado. identifier formal-parameters (opcional) Lista de parmetros. Se um parmetro um ponteiro, ou delegado deve declararse com o modificador unsafe. Comentarios Um delegado permite passar uma funo como parmetro. A seguridad de tipos de os delegados requiere que a funo que se pasa como delegado tenga a mesma firma que a declarao do delegado. Veja ou Tutorial de delegados para obter mais informao sobre o uso de delegados. O Tutorial de delegados mostra como componer delegados, assim, criar delegados a partir de outros delegados. um delegado que contm um parmetro out no pode componer. Os delegados so a base de os eventos. Para obter mais informao sobre delegados, veja 15. Delegados. Exemplo 1 O seguinte um Exemplo sencilo de declarao e uso de um delegado. // keyword_delegate.cs // delegate declaration delegate void MyDelegate(int i); class Program { public static void Main() { TakesADelegate(new MyDelegate(DelegateFunction)); } public static void TakesADelegate(MyDelegate SomeFunction) {

Visual C# Consolidado

230

SomeFunction(21); } public static void DelegateFunction(int i) { System.Console.WriteLine("Called by delegate with number: {0}.", i); } }

Resultados
Called by delegate with number: 21. Exemplo 2 no seguinte exemplo, um delegado se assinala os mtodos estticos e de instancia e devolve informao especfica de cada uno de elos. // keyword_delegate2.cs // Calling both static and instance methods from delegates using System; // delegate declaration delegate void MyDelegate(); public class MyClass { public void InstanceMethod() { Console.WriteLine("A message from the instance method."); } static public void StaticMethod() { Console.WriteLine("A message from the static method."); } } public class MainClass { static public void Main() { MyClass p = new MyClass(); // Map the delegate to the instance method: MyDelegate d = new MyDelegate(p.InstanceMethod); d(); // Map to the static method: d = new MyDelegate(MyClass.StaticMethod); d(); } }

Resultados
A message from the instance method. A message from the static method.

Visual C# Consolidado

231

Palavra-chave ock
A palavra-chave ock marca um bloco de instrues como uma seo crucial, para o que utiliza ou boqueo de exclusin mutua de um objeto, a execuo de uma instruo y, posteriormente, a liberao do boqueo. A instruo apresenta a seguinte forma: o c k ( expression) statement_bock de onde: expression Especifica ou objeto sobre ou que se deseja aplicar a instruo ock. Expression deve ser um tipo de referencia. Normalmente, expression ser this, se se deseja proteger uma varivel de instancia, ou biem typeof(classe), se se deseja proteger uma varivel do tipo static (o se a seo crtica se encontra em um mtodo esttico da classe dada). statement_bock Instrues da seo crtica. Comentarios A instruo ock permite garantizar que um subproceso no va a entrar em uma seo crtica de cdigo enquanto outro subproceso j se encontra em ella. Se outro subproceso intenta entrar em um cdigo boqueado, esperar at que o objeto se libere. Exemplo 1 O seguinte Exemplo mostra um uso simple de subprocesses em C#. // statements_ock.cs using System; using System.Threading; class ThreadTest { public void runme() { Console.WriteLine("runme called"); } public static void Main() { ThreadTest b = new ThreadTest(); Thread t = new Thread(new ThreadStart(b.runme)); t.Start(); } }

Resultado
runme called Exemplo 2 O seguinte Exemplo usa subprocesses e ock. Enquanto a instruo ock est presente, o bloco de instrues constituye uma seo crtica e balance nunca se converter em um nmero negativo. // statements_ock2.cs using System;

Visual C# Consolidado

232

using System.Threading; class Account { int balance; Random r = new Random(); public Account(int initial) { balance = initial; } int Withdraw(int amount) { // This condition will never be true unless the ock statement // is commented out: if (balance < 0) { throw new Exception("Negative Balance"); } // Comment out the next line to see the effect of leaving out // the ock keyword: ock (this) { if (balance >= amount) { Console.WriteLine("Balance before Withdrawal :" +balance); Console.WriteLine("Amount to Withdraw :-"+ amount); balance = balance - amount; Console.WriteLine("Balance after Withdrawal : " + balance); return amount; } else { return 0; // transaction rejected } } } public void DoTransactions() { for (int i = 0; i < 100; i++) { Withdraw(r.Next(1, 100)); } } } class Test { public static void Main() { Thread[] threads = new Thread[10]; Account acc = new Account (1000); for (int i = 0; i < 10; i++) { Thread t = new Thread(new ThreadStart(acc.DoTransactions));

Visual C# Consolidado

233

threads[i] = t; } for (int i = 0; i < 10; i++) { threads[i].Start(); } } }

Palavra-chave stackaloc
Permite assinalar um bloco de memoria na pilba. type * ptr = s t a c k a l o c type [ expr ] ; de onde: type ptr expr Expresso entera. Comentarios Se reserva na pia um bloco de memoria de tamanho suficiente para conter expr elementos do tipo type; a direo do bloco se armazena no ponteiro ptr. Esta memoria no est sometida a reciclaje y, por o tanto, no necessita fijarse (por medio de fixed). A vida do bloco de memoria se limita vida do mtodo no que se define. O operador stackaloc s vlido em inicializadores de variveis ocales. Como se utilizam ponteiros (ver A.2 Tipos de ponteiro), stackaloc requiere um contexto unsafe. O operador stackaloc similar a _aloca da biblioteca de tiempo de execuo de C. Exemplo // cs_keyword_stackaloc.cs // compile with: /unsafe using System; class Test { public static unsafe void Main() { int* fib = stackaloc int[100]; int* p = fib; *p++ = *p++ = 1; for (int i=2; i<100; ++i, ++p) *p = p[-1] + p[-2]; for (int i=0; i<10; ++i) Console.WriteLine (fib[i]); } } Mome de ponteiro. Tipo no administrado.

Resultado
1

Visual C# Consolidado

234

1 2 3 5 8 13 21 34 55

Visual C# Consolidado

235

Visual C# Consolidado

236

OPERADORES C#
C# fornece um conjunto grande de operadores, que so smbolos que especificam as operaes para executar em uma expresso. C# predefines os operadores aritmticos e lgicos normal, bem como uma variedade de outras pessoas como mostrado na tabela a seguir. Operaes em integral tipos, como ==, !=, <, >, <=, >=, binary +, binary -, ^, &, |, ~, ++, --,. e sizeof() geralmente so permitidos em enumeraes Alm disso, vrios operadores podem ser Sobrecarregado pelo usurio, assim alterando seu significado quando aplicado a um tipo definido pelo usurio. Categoria de operadores Aritmtica Lgico (boolean e bit a bit) Concatenao de seqncia de caracteres Incremento, decrement SHIFT Relacional Atribuio Acesso membro Indexao Converso Condicional Concatenao representante e remoo A criao do objeto Informaes de Tipo Estouro Controle de exceo Indirection e endereo Estouro Aritmtico Os operadores aritmticos (+., -) pode produzir resultados que estejam fora do intervalo dos valores possveis para o tipo numrico envolvido, /* Voc deve consultar a seo sobre um operador especfico para obter detalhes, mas em geral:

Operadores + - * / % & | ^ ! ~ && || True False + ++ -<< >> == != < > <= >= = += -= *= /= %= &= |= ^= <<= >>= ?? . [] () ?: + Novo Como sizeof TypeOf Marcada desmarcada * -> [] &

Qualquer throws estouro aritmtico inteiro ou descarta os bits do resultado mais significativos. um OverflowException Diviso por zero sempre throws um DivideByZeroException. Ponto flutuante estouro aritmtico ou diviso por zero nunca gera uma exceo, como tipos de ponto flutuante esto baseados em IEEE 754 and caso tenha disposies para representar infinito e NaN (Not a Number). Estouro Aritmtico Decimal Sempre gera um OverflowException. Decimal diviso por zero sempre throws um DivideByZeroException. Quando estouro inteiro ocorre, o que acontece depende do contexto de execuo, que pode ser marcado ou desmarcado. Em um contexto selecionado, ser gerada. um OverflowException Em um contexto desmarcado, os bits do resultado mais significativos so descartados e continua a execuo. Assim, C# oferece a voc a opo de manipulao ou ignorando estouro.

Visual C# Consolidado

237

Os operadores aritmticos, alm de tipo integral-tipo para integral-casts podem causar estouro, por exemplo, Projetando e esto sujeitas s execuo marcado ou desmarcado. para um Longo An Int, Entretanto, operadores bit a bit e operadores SHIFT nunca causar estouro.

Transbordamento aritmtico
Os operadores aritmticos (+, -, *, /) podem produzir resultados fora do intervalo de valores possveis para o tipo numrico implicado. Pode encontrar mais informao acerca de um determinado operador na seo Referena do lenguaje C#; no obstante, em general:
O transbordamento aritmtico de inteiros inicia uma exceo de transbordamento (OverflowExcetion) o bem elimina os bits mais significativos do resultado (vase mais abaixo). a diviso de inteiros por cero sempre produz uma exceo DivideByZeroExcetion. O transbordamento aritmtico ou a diviso por cero em ponto flutuante no produzem uma exceo, j que os tipos de ponto flutuante se baseiam em o estndar IEEE 754, que proporciona uma representao para os valores infinito e Nam (Not a Number, no um nmero). O transbordamento aritmtico de valores do tipo decimal sempre produz uma exceo

OverflowExcetion. a diviso de valores decimal por zero sempre produz uma exceo DivideByZeroExcetion. Quando produzido um transbordamento de inteiros, lo que ocurre depende do contexto da execuo, o qual pode ser checkede o unchecked. em um contexto checkede (comprobado), produzido uma exceo OverflowExcetion. em um contexto uncheckede (no comprobado), os bits mais significativos do resultado no se temm em cuenta e a execuo contina. Desta forma, C# permite escolher entre atender o desatender o transbordamento. Alm dos operadores aritmticos, as converses explcitas entre tipos integrais tambm podem produzir transbordamento (por exemplo, converter um tipo long em um tipo int) e esto sometidas ao tipo de execuo checkede o unchecked. Por otro lado, observe que os operadores de deslocamento e de bit a bit nunca produzem transbordamento.

Operadores sobrecarregados
C# permite sobrecarregar operadores nos tipos definidos pelo usuario, mediante a definio, com a palavra chave operator, de funes membro estticas. No obstante, no todos os operadores podem ser sobrecarregados, e alguns apresentam restrices, como se indica na seguinte tabela: Operadores +, -, !, ~, ++, --, true, false +, -, *, /, %, &, |, ^, <<, >> Posibilidade de sobrecarrega Estes operadores unrios podem ser sobrecarregados. Estes operadores binrios podem ser sobrecarregados.

Visual C# Consolidado

238

==, !=, <, >, <=, >= &&, ||

Os operadores de comparao podem ser sobrecarregados (veja a nota mais abaixo). Os operadores lgicos no podem ser cargar, mas se avaliam com & e |, que podem sobrecarregarse. Veja 7.11.2 Operadores lgicos condicionais definidos pelo usuario. O operador de indicao de arrays no pode sobrecarregar, mas podem ser definido indicadores. O operador de converso explcita do tipos no pode sobrecarregar, mas podem ser definido novos operadores de converso (veja explicit e implicit). Os operadores de assinalao no podem ser sobrecarregados, mas +=, por exemplo, se avalia com +, o qual se pode sobrecarregar. Estes operadores no podem ser sobrecarregados.

[] ()

+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= =, ., ?:, ->, new, is, sizeof, typeof

Nota os operadores de comparao, se sobrecarregam, devem ser por parejas; dizer, se sobrecarrega ==, tambm deve sobrecarregar !=. Tambm cierta a opo contraria, anlogamente para o caso de < e >, e para <= e >=.

Operador [ ]
Os colchetes ([ ]) so utilizados para arrays, indicadores e atributos. Tambm podem ser utilizar com ponteiros. type [ ] array [ indexexpr ] De onde: type Tipo. array Array. indexexpr Expresso de ndice. Comentarios Um tipo de array composto de um tipo seguido de []: int[] fib; // fib is of type int[], "array of int" fib = new int[100]; // criate a 100-element int array Para obter acesso a um elemento do array, o ndice do elemento desejado se encierra entre colchetes: fib[0] = fib[1] = 1; for( int i=2; i<100; ++i ) fib[i] = fib[i-1] + fib[i-2]; produzido uma exceo se o ndice do array est fora do intervalo declarado. O operador de indicao no pode sobrecarregar; no obstante, os tipos podem definir indicadores, que so propriedades que aceitam um ou varios parmetros. Os parmetros de um

Visual C# Consolidado

239

indicador ficam entre colchetes, como os ndices de um array, mas podem ser declarar de qualquer tipo (a diferena dos ndices de um array, que somente podem ser integrais). Por exemplo, .NET Framework define um tipo Hashtable que asoa chaves e valores do tipo arbitrario: Collections.Hashtable h = new Collections.Hashtable(); h["a"] = 123; // note: using a string as the index Os colchetes tambm so utilizados para especificar atributos: [attribute(AllowMultiple=true)] public class Attr { } Podem ser utilizados colchetes para obter o valor que aponta um ponteiro segundo um ndice (veja A.2 Tipos de ponteiros): unsafe fixede ( int* p = fib ) // p points to fib from earlier example { p[0] = p[1] = 1; for( int i=2; i<100; ++i ) p[i] = p[i-1] + p[i-2]; } No obstante, tenga em cuenta que no se realiza uma comprobao dos lmites do ndice.

Operador ( )
Alm disso de seu uso para especificar o ordem de as operaes em uma expresso, os parntesis so utilizados para especificar converses do tipo explcitas (cast): ( type ) expr De onde: type Nome do tipo o que se deseja converter a expresso expr. expr Expresso. Comentarios Uma converso do tipo invoca explcitamente ao operador de converso para converter o tipo da expresso expr ao tipo type; ser produzido um erro na converso se no se tenha definido esse operador. Para definir um operador de converso, veja explicit e implicit. Exemplo O seguinte programa converte explcitamente um tipo double em um tipo int. O programa no compilar sem o operador de converso do tipo. // cs_operator_parentheses.cs using System; class Test { public static void Main() { double x = 1234.7; int a; a = (int)x; // cast double to int Console.WriteLine(a);

Visual C# Consolidado

240

} }

Resultado
1234

Operador . (ponto)
O operador de ponto utilizado para o acesso a membros. name1 . name2 De onde: name1 Nome. name2 Nome. Comentarios Por exemplo, considere a seguinte clase: class Simple { public int a; public void b() { } } Simple s = new Simple(); A variveis tem dos membros, a e b; para tener acesso a ellos, use o operador de ponto: s.a = 6; // assign to field a; s.b(); // invoke member function b; O ponto tambm utilizado para formar nomes completos, dizer, nomes que especificam o namespaces ou a interfaz (por exemplo) que pertencem. System.Console.WriteLine("hello"); // class Console in namespace System A directiva using hace que a calificao de nomes seja opcional em alguns casos: using System; ... System.Console.WriteLine("hello"); Console.WriteLine("hello"); // same thing Mas, um identificador ambiguo deve calificarse: using System; using OtherSystem; // a namespace containing another Console class ... System.Console.WriteLine( "hello" ); // must qualify Console

Operador +
O operador + pode funcionar como operador unrio o binrio.

Visual C# Consolidado

241

+ expr expr1 + expr2 De onde: expr Expresso. expr1 Expresso. expr2 Expresso. Comentarios Os operadores + unrios se encontram predefinidos para todos os tipos numricos. O resultado de uma operao + unaria aplicada a um tipo numrico simplemente o valor do operando. Os operadores + binrios esto predefinidos para os tipos numricos e de cadena de caracteres. Para tipos numricos, + calcula a suma de seus dos operandos. Quando ao menos um dos operandos do tipo string, + concatena as representaes do tipo string dos operandos. Os tipos delegados tambm proporcionam um operador binrio +, o qual realiza a concatenao de delegados. Os tipos definidos pelo usuario podem sobrecarregar os operadores + unrio e binrio (veja operator). Exemplo // cs_operator_plus.cs using System; class Test { public static void Main() { Console.WriteLine(+5); // unary plus Console.WriteLine(5 + 5); // addition Console.WriteLine(5 + .5); // addition Console.WriteLine("5" + "5"); // string concatenation Console.WriteLine(5.0 + "5"); // string concatenation // note automatic conversion from double to string } }

Resultado
5 10 5.5 55 55

Operador O operador - pode funcionar como operador unrio o binrio. - expr

Visual C# Consolidado

242

expr1 - expr2 De onde: expr Expresso. expr1 Expresso. expr2 Expresso. Comentarios Os operadores - unrios se encontram predefinidos para todos os tipos numricos. O resultado de uma operao - unaria aplicada a um tipo numrico a negao do operando. Os operadores binrios esto predefinidos para todos os tipos numricos e de enumerao de modo que restam o segundo operando do primeiro. Os tipos delegados tambm proporcionam um operador - binrio, o qual realiza a eliminao de delegados. Os tipos definidos pelo usuario podem sobrecarregar os operadores - unrio e binrio (veja operator). Exemplo // cs_operator_minus.cs using System; class Test { public static void Main() { int a = 5; Console.WriteLine(-a); Console.WriteLine(a - 1); Console.WriteLine(a - .5); } }

Resultado
-5 4 4.5

Operador *
O operador de multiplicao (*) calcula o produto de seus operandos. Todos os tipos numricos possuem operadores de multiplicao predefinidos. expr1 * expr2 De onde: expr1 Expresso. expr2

Visual C# Consolidado

243

Expresso. Comentarios O operador * tambm utilizado para declarar tipos de ponteiros e para desfazer a referena a ponteiros (veja A.2 Tipos de ponteiros). Os tipos definidos pelo usuario podem sobrecarregar o operador * (veja operator). Exemplo // cs_operator_mult.cs using System; class Test { public static void Main() { Console.WriteLine(5 * 2); Console.WriteLine(-.5 * .2); Console.WriteLine(-.5m * .2m); // decimal type } }

Resultado
10 -0.1 -0.10

Operador /
O operador de diviso (/) permite dividir seu primeiro operando pelo segundo. Todos os tipos numricos possuem operadores de diviso predefinidos. expr1 / expr2 De onde: expr1 Expresso. expr2 Expresso. Comentarios Os tipos definidos pelo usuario podem sobrecarregar o operador / (veja operator). Exemplo // cs_operator_division.cs using System; class Test { public static void Main() { Console.WriteLine(-5/2); Console.WriteLine(-5.0/2); } }

Visual C# Consolidado

244

Resultado
-2 -2.5

Operador %
O operador de mdulo (%) calcula o resto de dividir seu primeiro operando pelo segundo. Todos os tipos numricos possuem operadores de mdulo predefinidos. expr1 % expr2 De onde: expr1 Expresso. expr2 Expresso. Comentarios Os tipos definidos pelo usuario podem sobrecarregar o operador % (veja operator). Exemplo // cs_operator_modulus.cs using System; class Test { public static void Main() { Console.WriteLine(5 % 2); // int Console.WriteLine(-5 % 2); // int Console.WriteLine(5.0 % 2.2); // double Console.WriteLine(5.0m % 2.2m); // decimal Console.WriteLine(-5.2 % 2.0); // double } }

Resultado
1 -1 0.6 0.6 -1.2 Observe os erros de rede onde o que apresenta o tipo double.

Operador &
O operador & pode funcionar como operador unrio o binrio. & expr expr1 & expr2 De onde: expr

Visual C# Consolidado

245

Expresso. expr1 Expresso. expr2 Expresso. Comentarios O operador & unrio devolve a direo de memoria de seu operando (requiere um contexto unsafe). Os operadores & binrios esto predefinidos para os tipos integrais e bool. Para tipos integrais, & calcula a operao AND bit a bit de seus operandos. Para operandos do tipo bool, & calcula a operao lgica AND de seus operandos; dizer, o resultado true se, e somente se, ambos operandos so true. Os tipos definidos pelo usuario podem sobrecarregar o operador & binrio (veja operator). Exemplo // cs_operator_ampersand.cs using System; class Test { public static void Main() { Console.WriteLine(true & false); // logical and Console.WriteLine(true & true); // logical and Console.WriteLine("0x{0:x}", 0xf8 & 0x3f); // bitwise and } }

Resultado
False True 0x38

Operador |
Os operadores binrios | esto predefinidos para os tipos integrais e bool. Para tipos integrais, | calcula a operao OR bit a bit de seus operandos. Para operandos do tipo bool, | calcula a operao lgica OR de seus operandos; dizer, o resultado false se, e somente se, ambos operandos so false. expr1 | expr2 De onde: expr1 Expresso. expr2 Expresso. Comentarios Os tipos definidos pelo usuario podem sobrecarregar o operador | (veja operator).

Visual C# Consolidado

246

Exemplo // cs_operator_OR.cs using System; class Test { public static void Main() { Console.WriteLine(true | false); // logical or Console.WriteLine(false | false); // logical or Console.WriteLine("0x{0:x}", 0xf8 | 0x3f); // bitwise or } }

Resultado
True False 0xff

Operador ^
Os operadores ^ binrios esto predefinidos para os tipos integrais e bool. Para tipos integrais, ^ calcula a operao OR exclusiva bit a bit de seus operandos. Para operandos do tipo bool, ^ calcula a operao lgica OR exclusiva de seus operandos; dizer, o resultado true se, e somente se, exatamente um dos operandos true. expr1 ^ expr2 De onde: expr1 Expresso. expr2 Expresso. Comentarios Os tipos definidos pelo usuario podem sobrecarregar o operador ^ (veja operator). Exemplo // cs_operator_bitwise_OR.cs using System; class Test { public static void Main() { Console.WriteLine(true ^ false); // logical exclusive-or Console.WriteLine(false ^ false); // logical exclusive-or Console.WriteLine("0x{0:x}", 0xf8 ^ 0x3f); // bitwise exclusive-or } }

Resultado
True False

Visual C# Consolidado

247

0xc7

Operador !
O operador lgico negao (!) um operador unrio que nega seu operando. Est definido para o tipo bool, e devolve true se, e somente se, seu operando false. ! expr De onde: expr Expresso. Comentarios Os tipos definidos pelo usuario podem sobrecarregar o operador ! (veja operator). Exemplo // cs_operator_negation.cs using System; class Test { public static void Main() { Console.WriteLine(!true); Console.WriteLine(!false); } }

Resultado
False True

Operador ~
O operador ~ realiza uma operao de complemento bit a bit sobre seu operando. Os operadores de complemento bit a bit esto predefinidos para int, uint, long e ulong. ~ expr De onde: expr Expresso. Comentarios Os tipos definidos pelo usuario podem sobrecarregar o operador ~ (veja operator). Exemplo // cs_operator_bitwise_compl.cs using System; class Test { public static void Main() {

Visual C# Consolidado

248

Console.WriteLine("!0x{0:x8} = 0x{1:x8}", 8, ~8); Console.WriteLine("!0x{0:x8} = 0x{1:x8}", -8, ~-8); } }

Resultado
!0x00000008 = 0xfffffff7 !0xfffffff8 = 0x00000007

Operador =
O operador de assinalao (=) armazena o valor do operando situado a seu direita na colocao de armazenamento, propriedade ou indicador indicado pelo operando situado a seu esquerda, e devolve o valor como resultado. Os operandos devem ser do mesmo tipo (o o operando da direita deve poder converter implcitamente ao tipo do operando da esquerda). lhs = expr De onde: lhs Uma colocao de armazenamento, uma propriedade ou um indicador. expr Expresso. Comentarios O operador de assinalao no pode sobrecarregar. Exemplo // cs_operator_assignment.cs using System; class Test { public static void Main() { double x; int i; i = 5; // int to int assignment x = i; // implicit conversion from int to double i = (int)x; // needs cast Console.WriteLine("i is {0}, x is {1}", i, x); object obj = i; Console.WriteLine("boxede value = {0}, type is {1}", obj, obj.GetType()); i = (int)obj; Console.WriteLine("unboxed: {0}", i); } }

Resultado
i is 5, x is 5 boxede value = 5, type is System.Int32 unboxed: 5

Visual C# Consolidado

249

Operador <
Todos os tipos numricos e de enumerao definem um operador relacional "menor que" (<) que devolve true se o primeiro operando menor que o segundo, e false em caso contrario. expr1 < expr2 De onde: expr1 Expresso. expr2 Expresso. Comentarios Os tipos definidos pelo usuario podem sobrecarregar o operador < (veja operator). se sobrecarrega <, tambm deve sobrecarregar >. Exemplo // cs_operator_less_than.cs using System; class Test { public static void Main() { Console.WriteLine(1 < 1.1); Console.WriteLine(1.1 < 1.1); } }

Resultado
True False

Operador >
Todos os tipos numricos e de enumerao definem um operador relacional "maior que" (>) que devolve true se o primeiro operando maior que o segundo, e false em caso contrario. expr1 > expr2 De onde: expr1 Expresso. expr2 Expresso. Comentarios Os tipos definidos pelo usuario podem sobrecarregar o operador > (veja operator). se sobrecarrega >, tambm deve sobrecarregar <. Exemplo // cs_operator_greater_than.cs

Visual C# Consolidado

250

using System; class Test { public static void Main() { Console.WriteLine(1.1 > 1); Console.WriteLine(1.1 > 1.1); } }

Resultado
True False

Operador ?:
O operador condicional (?:) devolve um de dois valores segundo o valor de uma expresso booleana. O operador condicional utilizado em expresses da forma: cond-expr ? expr1 : expr2 De onde: cond-expr Expresso do tipo bool. expr1 Expresso. expr2 Expresso. Comentarios Si cond-expr true, expr1 se avalia e se devolve como resultado; se cond-expr false, expr2 a que se avalia e se devolve como resultado. Somente uma de as dos, expr1 o expr2, resulta evaluada. Os clculos que, em qualquer otro caso, podran requerir um bloque de deciso if-elpodem ser expresar mais concisa e elegantemente mediante o operador condicional. Por exemplo, para evitar uma diviso por cero em o clculo da funo sinc, podra escreverse: if(x != 0.0) s = Math.Sin(x)/x; else s = 1.0; o bien, com o operador condicional, s = x != 0.0 ? Math.Sin(x)/x : 1.0; O operador condicional asociativo por a direita, de modo que uma expresso da forma: a ? b : c ? de : e se avalia como a ? b : (c ? de : e) en lugar de (a ? b : c) ? de : e

Visual C# Consolidado

251

O operador condicional no pode sobrecarregar. Exemplo // cs_operator_condicional.cs using System; class Test { public static double sinc(double x) { return x != 0.0 ? Math.Sin(x)/x : 1.0; } public static void Main() { Console.WriteLine(sinc(0.2)); Console.WriteLine(sinc(0.1)); Console.WriteLine(sinc(0.0)); } }

Resultado
0.993346653975306 0.998334166468282 1

Operador ++
O operador de incremento (++) incrementa seu operando em 1. Este operador pode aparecer antes o depois de seu operando: + + var var + + De onde: var Expresso que indica uma colocao de armazenamento, uma propriedade ou um indicador. Comentarios A primeira forma uma operao de incremento prefixo. O resultado da operao o valor do operando depois de haver sido incrementado. A segunda forma uma operao de incremento postfijo. O resultado da operao o valor do operando antes de haver sido incrementado. Os tipos numricos e de enumerao possuem operadores de incremento predefinidos. Os tipos definidos pelo usuario podem sobrecarregar o operador ++ (veja operator). Exemplo // cs_operator_increment.cs using System; class Test { public static void Main() { double x;

Visual C# Consolidado

252

x = 1.5; Console.WriteLine(++x); x = 1.5; Console.WriteLine(x++); Console.WriteLine(x); } }

Resultado
2.5 1.5 2.5

Operador -O operador de decremento (--) reduz seu operando em 1. Este operador pode aparecer antes o depois de seu operando: - - var var - De onde: var Expresso que indica uma colocao de armazenamento, uma propriedade ou um indicador. Comentarios A primeira forma uma operao de decremento prefixo. O resultado da operao o valor do operando depois de haver experimentado o decremento. A segunda forma uma operao de decremento postfijo. O resultado da operao o valor do operando antes de haver experimentado o decremento. Os tipos numricos e de enumerao possuem operadores de decremento predefinidos. Os tipos definidos pelo usuario podem sobrecarregar o operador -- (veja operator). Exemplo // cs_operator_decrement.cs using System; class Test { public static void Main() { double x; x = 1.5; Console.WriteLine(--x); x = 1.5; Console.WriteLine(x--); Console.WriteLine(x); } }

Visual C# Consolidado

253

Resultado
0.5 1.5 0.5

Operador &&
O operador AND condicional (&&) realiza uma operao lgica AND de seus operandos do tipo bool mas somente avalia seu segundo operando se necessrio. expr1 & & expr2 De onde: expr1 Expresso. expr2 Expresso. Comentarios A operao x && y corresponde com a operao x&y salvo que se x false, e no se avalia (j que o resultado da operao AND ser false independentemente do valor de y). Este se conhece como evaluao "cortocircuitada". O operador AND condicional no pode sobrecarregar, mas as sobrecarregas dos operadores lgicos normales e os operadores true e false se consideran tambem, com ciertas restrices, sobrecarregas dos operadores lgicos condicionais (veja 7.11.2 Operadores lgicos condicionais definidos pelo usuario). Exemplo No seguinte exemplo, observe que a expresso que utiliza && somente avalia o primeiro operando. // cs_operator_logical_and.cs using System; class Test { static bool fn1() { Console.WriteLine("fn1 called"); return false; } static bool fn2() { Console.WriteLine("fn2 called");

Visual C# Consolidado

254

return true; } public static void Main() { Console.WriteLine("regular AND:"); Console.WriteLine("result is {0}", fn1() & fn2()); Console.WriteLine("short-circuit AND:"); Console.WriteLine("result is {0}", fn1() && fn2()); } }

Resultado
regular AND: fn1 called fn2 called result is False short-circuit AND: fn1 called result is False

Visual C# Consolidado

255

DIRECTIVES PREPROCESSOR C#
Esta seo discute diretivas pr-processamento a linguagem C#: #IF # Else #elif #endif Definir # #undef #warning #Error # Line #Region #endregion # pragma Aviso # pragma Soma de verificao # pragma Enquanto o compilador no no tm um preprocessor separado, as diretivas descritas nesta seo so processadas como se no havia um; essas diretivas so usadas para ajudar na compilao condicional. Ao contrrio das diretivas C e C++, voc no pode usar essas diretivas para criar macros. Uma diretiva de pr-processamento deve ser a nica instruo em uma linha.

#If (referncia C#)


Permite que #if voc iniciar uma diretiva condicional, teste um smbolo ou smbolos para ver se eles avaliada como true. Se eles fazer Avaliar a true, o compilador avaliar todo o cdigo entre e #if a diretiva mais prximo #endif. Por exemplo, #define DEBUG // ... #if DEBUG Console.WriteLine("Debug version"); #endif Voc pode usar os operadores == (igualdade), = (inequality), && (e). e || (ou) para avaliar vrios smbolos Voc tambm pode agrupar smbolos e operadores com parnteses. Comentrios #if e #undef diretivas, permite que voc incluir ou excluir cdigo com base na condio de um ou mais smbolos., #endif juntamente com, Definir # o # Else, #elif Isso pode ser til durante a compilao cdigo para uma compilao de depurao ou quando compilar para uma configurao especfica. Um comeando diretiva condicional com uma #if diretiva explicitamente deve ser terminado com uma #endif diretiva. Permite que #define voc defina um smbolo, que, usando o smbolo como a expresso transmitida para a #if diretiva, a expresso ser avaliada para true. Voc tambm pode definir um smbolo com a / Define opo de compilador. Voc pode undefine um smbolo com #undef.

Visual C# Consolidado

256

Um smbolo que voc define com /define ou com #define no entrar em conflito com uma varivel com o mesmo nome. Isto , um nome de varivel no deve ser passado para uma Diretiva de pr-processamento e um smbolo s pode ser avaliado por uma diretiva de prprocessamento. O escopo de um smbolo criado com #define o arquivo no qual ele foi definido. Exemplo // preprocessor_if.cs #define DEBUG #define VC_V7 using System; public class MyClass { static void Main() { #if (DEBUG && !VC_V7) Console.WriteLine("DEBUG is defined"); #elif (!DEBUG && VC_V7) Console.WriteLine("VC_V7 is defined"); #elif (DEBUG && VC_V7) Console.WriteLine("DEBUG and VC_V7 are defined"); #else Console.WriteLine("DEBUG and VC_V7 are not defined"); #endif } } Sada DEBUG and VC_V7 are defined

#Else Pessoa (referncia C#)


Permite que #else voc crie uma diretiva condicional composta, para que, se nenhuma das expresses nas diretivas Anterior #IF ou (opcional) #elif para true, o compilador ser avaliaro todo cdigo entre #else e os subseqentes #endif. Comentrios Deve #endif ser a prxima diretiva pr-processamento aps #else. Veja #IF um Exemplo de como usar #else.

#elif (referncia C#)


Permite que #elif voc crie uma diretiva condicional composta. Ser a #elif expresso ser avaliada se nem o precedente #IF nem todas as expresses anterior, opcional, #elif diretiva avaliada como true. Se uma #elif expresso avaliada como true, o compilador avaliar todo o cdigo entre e #elif a prxima diretiva condicional. Por exemplo: #define VC7 //... #if debug Console.Writeline("Debug build"); #elif VC7 Console.Writeline("Visual Studio 7"); #endif Voc pode usar os operadores == (igualdade), != (inequality), && (e). e || (ou), para avaliar vrios smbolos Voc tambm pode agrupar smbolos e operadores com parnteses. Comentrios Equivale #elif a usar: #else #if Uso #elif mais simples, porque cada #if requer pode ser usada sem um correspondente #endif. enquanto a #endif, um #elif Veja #IF um Exemplo de como usar #elif.

#endif (referncia C#)


Especifica #endif o trmino de uma diretiva condicional, que comeou com a #IF diretiva. Por exemplo, #define DEBUG // ... #if DEBUG Console.WriteLine("Debug version"); #endif

Visual C# Consolidado

257

Comentrios Uma diretiva condicional, comeando com uma #if diretiva, explicitamente deve ser terminada com uma #endif diretiva. Veja #If (referncia C#) um Exemplo de como usar #endif.

# Definir (referncia C#)


Permite que #define voc defina um smbolo, para que, usando o smbolo como a expresso transmitida para a #IF diretiva, a expresso ser avaliada para true. Por exemplo: #define DEBUG Comentrios Smbolos podem ser usados para especificar condies para a compilao. Voc pode testar para o smbolo com um #IF ou #elif. Voc tambm pode usar o conditional atributo para executar compilao condicional. Voc pode definir um smbolo, mas voc pode atribuir um valor para um smbolo. A #define diretiva deve aparecer no arquivo antes de usar as instrues que so tambm no diretivas. Voc tambm pode definir um smbolo com a / Define opo de compilador. Voc pode undefine um smbolo com #undef. Um smbolo que voc define com /define ou com #define no entrar em conflito com uma varivel com o mesmo nome. Isto , um nome de varivel no deve ser passado para uma Diretiva de pr-processamento e um smbolo s pode ser avaliado por uma diretiva de prprocessamento. O escopo de um smbolo criado com #define o arquivo no qual ele foi definido. Veja #IF um Exemplo de como usar #define.

#undef (referncia C#)


Permite que #undef voc undefine um smbolo, que, usando o smbolo como a expresso em uma #IF diretiva, a expresso ser avaliada para false. Um smbolo pode ser definido tanto com a Definir # diretiva ou a / Define opo de compilador. A #undef diretiva deve aparecer no arquivo antes de usar todas as instrues que so tambm no diretivas. Exemplo // preprocessor_undef.cs // compile with: /d:DEBUG #undef DEBUG using System; class MyClass { static void Main() { #if DEBUG Console.WriteLine("DEBUG is defined"); #else Console.WriteLine("DEBUG is not defined"); #endif } } Sada DEBUG is not defined

#warning (referncia C#)


Permite que #warning voc gere um aviso um nvel partir de um local especfico em seu cdigo. Por exemplo: #warning Deprecated code in this method. Comentrios Um uso comum de #warning em uma diretiva condicional. Tambm possvel para gerar um erro definido pelo usurio com #Error (referncia C#).

Visual C# Consolidado

258

Exemplo // preprocessor_warning.cs // CS1030 expected #define DEBUG class MainClass { static void Main() { #if DEBUG #warning DEBUG is defined #endif } }

#Error (referncia C#)


Permite que #error voc gerar um erro partir de um local especfico em seu cdigo. Por exemplo: #error Deprecated code in this method. Comentrios Um uso comum de #error em uma diretiva condicional. Tambm possvel para gerar um aviso definida pelo usurio com #warning (referncia C#). Exemplo // preprocessor_error.cs // CS1029 expected #define DEBUG class MainClass { static void Main() { #if DEBUG #error DEBUG is defined #endif } }

# Line (referncia C#)


Permite que #line voc modificar o compilador o nmero de linha e (opcionalmente) a sada nome de arquivo de erros e avisos. Este Exemplo mostra como para relatar dois avisos associados a nmeros de linha. A #line 200 diretiva fora o nmero de linha a ser 200 (embora o padro seja #7). A outra linha (#9) segue a seqncia normal como um resultado da diretiva padro #line. class MainClass { static void Main() { #line 200 int i; // CS0168 on line 200 #line default char c; // CS0168 on line 9 } } Comentrios A #line diretiva pode ser usada em uma etapa no processo de criao automatizado e intermedirios. Por exemplo, se linhas foram removidas do arquivo de cdigo de fonte original, mas voc queria o compilador para gerar sada com base em numerao no arquivo, a linha original ainda poder remover linhas e depois simular a numerao original com #line Linha. A #line hidden diretiva oculta as linhas sucessivas do depurador, de modo que quando o desenvolvedor percorre o cdigo, todas as linhas entre prxima #line diretiva (supondo que ele esteja no outra #line hidden Diretiva) e #line hidden o ser steppeds sobre ser. Esta opo tambm pode ser usada para permitir ASP.NET para diferenciar entre cdigo definido pelo usurio e mquina gerado. Embora ASP.NET seja o consumidor primrio a esse recurso, provvel que mais origem geradores tornar usar dele. Uma #line hidden diretiva no afeta nomes ou nmeros de linha no relatrio de erros. Isto , se um erro encontrado em um bloco oculto, o compilador reportar o nome e linha nmero o erro de arquivo. A #line filename diretiva especifica o nome de arquivo voc deseja que aparea na sada do compilador. Por padro, o nome do arquivo de cdigo de origem real usado. O nome de arquivo deve ser entre aspas duplas () ". " Um arquivo cdigo fonte pode ter qualquer nmero de #line diretivas. Exemplo 1

Visual C# Consolidado

259

O Exemplo a seguir mostra como o depurador ignora as linhas ocultas no cdigo. Quando voc executar o exemplo, ela exibir trs linhas de texto. No entanto, quando voc define um ponto de interrupo, como mostrado no exemplo, e visitas F10 para passar pelo cdigo, voc notar que o depurador ignora a linha oculta. Observe tambm que mesmo que voc defina um ponto de interrupo na linha oculta, o depurador ir ignor-la ainda. // preprocessor_linehidden.cs using System; class MainClass { static void Main() { Console.WriteLine("Normal line #1."); // Set break point here. #line hidden Console.WriteLine("Hidden line."); #line default Console.WriteLine("Normal line #2."); } }

#Region (referncia C#)


Permite que #region voc especifique um bloco de cdigo que voc pode expandir ou recolher quando usar o Estrutura de tpicos recurso do Editor de Cdigo Visual Studio. Por exemplo: #region MyClass definition public class MyClass { static void Main() { } } #endregion Comentrios Um #region bloco deve ser terminado com uma #endregion diretiva. Um #region bloco no pode se sobrepor a um #IF bloco. No entanto, um #region bloco pode ser aninhado em um #if bloco, e um #if bloco pode ser aninhado em um #region bloco.

#endregion (referncia C#)


Marca #endregion o final de um #Region bloco. Por exemplo: #region MyClass definition class MyClass { static void Main() { } } #endregion

# pragma (referncia C#)


#pragma usado para fornecer as instrues especiais para a compilao do arquivo em que ele aparece do compilador #pragma pragma-name pragma-arguments Parmetros pragma-name O nome de um pragma reconhecido. pragma-arguments Argumentos especficos Pragma-.

Aviso # pragma (referncia C#)


Pode #pragma warning ser usado para ativar ou desativar determinados avisos. #pragma warning disable warning-list #pragma warning restore warning-list Parmetros warning-list

Visual C# Consolidado

260

Uma lista de nmeros de aviso separted vrgulas. Digite os nmeros sozinho, sem o prefixo " CS ". Quando nenhum nmero aviso so especificados, disable Desativa todos os avisos e restore permite que todos os avisos. Exemplo // pragma_warning.cs using System; #pragma warning disable 414, 3021 [CLSCompliant(false)] public class C { int i = 1; static void Main() { } } #pragma warning restore 3021 [CLSCompliant(false)] // CS3021 public class D { int i = 1; public static void F() { } }

Soma de verificao # pragma (referncia C#)


Pode ser usado para gerar somas de verificao para arquivos de origem para ajudar com depurao ASP.NET Pginas. #pragma checksum "filename" "{guid}" "checksum bytes" Parmetros "filename" O nome do arquivo que requer o monitoramento de alteraes ou atualizaes. "{guid}" O Global Unique Identifier (GUID) para o arquivo. "checksum_bytes" A seqncia de dgitos hexadecimais representando os bytes da soma de verificao. Deve ser um nmero par de dgitos hexadecimais. Um nmero de dgitos resulta em um aviso em tempo de compilao, e a diretiva mpar ento ser ignorado. Comentrios O depurador Visual Studio usa uma soma de verificao para garantir que ele sempre encontrar a origem direita. O compilador calcula a soma de verificao para um arquivo de origem, e ento emite a sada para arquivo de banco de dados (pdb) de programa. O depurador usa o PDB para comparar contra a soma de verificao que ele calcula para o arquivo de origem. Esta soluo no funciona para ASP.NET projetos, pois a soma de comprovao calculada para o arquivo de origem gerado, em vez do arquivo.aspx. Para resolver esse problema, #pragma checksum Fornece suporte checksum para ASP.NET Pginas. Quando voc cria um ASP.NET projeto no Visual C#, o arquivo de origem gerado contm uma soma de verificao para o arquivo.aspx, do qual a fonte gerada. O compilador grava essas informaes para o arquivo PDB. Se o compilador encontrar nenhuma #pragma checksum Diretiva no arquivo, ele calcula a soma de verificao e grava o valor para o arquivo PDB. Exemplo class TestClass { static int Main() { #pragma checksum "file.cs" "{3673e4ca-6098-4ec1-890f8fceb2a794a2}" "{012345678AB}" // New checksum } }

Visual C# Consolidado

261

OPES DO COMPILADOR C#
O compilador produz arquivos executvel (.exe), bibliotecas de vnculo dinmico (.dll), ou mdulos de cdigo (.netmodule). Cada opo de compilador est disponvel de duas formas: -option e /option. A documentao s mostra o /option formulrio.

Criando de linha de comando


Voc pode chamar o compilador C# simplesmente digitando o nome do seu arquivo executvel (csc.exe) na linha de comando. Se voc usar o prompt de comando Studio visual (disponvel como um atalho no menu Iniciar no Visual Studio Tools), todas as variveis de ambiente necessrias sero definidas para voc. Caso contrrio, voc talvez precise ajustar o caminho para poder chamar csc.exe para ser chamado de qualquer subpasta em seu computador. Se voc no usar o prompt de comando Studio visual, necessrio para executar vsvars32.bat para definir as variveis de ambiente apropriada para oferecer suporte compilaes linha de comando. Para obter mais informaes sobre vsvars32.bat, consulte Como construir a partir da linha de comando:. Se voc estiver trabalhando em um computador que s tem o SDK do .NET Framework, voc pode usar o compilador C# na linha de comando se voc usar que est disponvel na Microsoft .NET Framework SDK opo de menu. o SDK Command Prompt, Para criar a partir do ambiente de desenvolvimento, consulte Preparar e gerenciando Builds. The csc.exe executable is usually located in the Microsoft.NET\Framework\<version> folder under the system directory. O local pode variar dependendo a configurao exata em qualquer computador individual. Vrias verses deste executvel ser estar presentes na mquina se mais de uma verso do .NET Framework instalado na mquina. Para obter mais informaes sobre essas instalaes, consulte Instalando vrias verses do .NET Framework. Este tpico aborda o seguinte: Regras de sintaxe de linha de comando Linhas de comando de exemplo Diferenas entre compilador C# e C++ Sada do compilador Regras de sintaxe de linha de comando O compilador C# usa as regras a seguir ao interpretar argumentos fornecidos na linha de comando sistema operacional:

Argumentos so delimitados por espao em branco, que um espao ou uma guia. O caractere de interpolao (^) no reconhecido como um caractere de escape ou delimitador. O caractere tratado completamente pelo analisador de linha de comando com o sistema operacional antes est sendo transmitido para a matriz argv no programa. Uma seqncia rodeada por aspas duplas (" seqncia ") interpretada como um argumento nico, independentemente de espao em branco contida. Uma seqncia entre aspas pode ser incorporada em um argumento. Precedido de aspas duplas por uma barra invertida (. \ " interpretado como um caractere literal aspas duplas (")) Backslashes so interpretados literalmente, a menos que esteja imediatamente antes de aspas duplas.

Visual C# Consolidado

262

Se um nmero par de barras invertidas for seguido de aspas duplas, uma barra invertida colocada na matriz argv para cada par de barras invertidas, e as aspas duplas interpretada como um delimitador de seqncia de caracteres. Se um nmero mpar de barras invertidas for seguido de aspas duplas, uma barra invertida colocada na matriz argv para cada par de barras invertidas, e as aspas duplas " escaped ", a barra invertida restante, causando de aspas duplas (") para ser colocado em argv literal. Linhas de comando de exemplo Compila File.cs produzir File.exe: csc File.cs Compila File.cs produzir File.dll: csc /target:library File.cs Compila File.cs e cria My.exe: csc /out:My.exe File.cs Compila todos os arquivos na pasta atual, com otimizaes C# no e define o smbolo Debug. A sada FILE2.exe: csc /define:DEBUG /optimize /out:File2.exe *.cs Compila todos os arquivos na pasta atual produzir uma verso de depurao do FILE2.DLL C#. Nenhum logotipo e sem avisos so exibidos: csc /target:library /out:File2.dll /warn:0 /nologo /debug *.cs Compila todos os arquivos na pasta atual para Something.xyz (uma DLL) C#: csc /target:library /out:Something.xyz *.cs Diferenas entre compilador C# e C++ Sada do compilador No h nenhum arquivo de objeto (.obj), criados como resultado de chamar o compilador C#; arquivos de sada so criados diretamente. Como um consequence a isso, o compilador C# no precisa um vinculador.

Como construir a partir da linha de comando:


O arquivo vsvars32.bat define as variveis de ambiente apropriados para ativar builds.For linha de comando mais informaes sobre vsvars32.bat, consulte o seguinte artigo Base de Conhecimento:

Vcvars32.bat Generates fora da mensagem de ambiente Q248802: Se a verso atual do Visual Studio estiver instalada em um computador que tambm possui uma verso anterior do Visual Studio, voc no deve executar vsvars32.bat ou vcvars32.bat de verses diferentes na mesma janela de comando. Para executar VSVARS32.BAT 1. 2. No prompt de comando, mude para a subpasta Common7\Tools da instalao. Executar VSVARS32.bat digitando VSVARS32.

Cuidado VSVARS32.bat pode variar de mquina para mquina. No substituir um arquivo VSVARS32.bat ausente ou danificado com um VSVARS32.bat do outro computador. Execute novamente a instalao para substituir o arquivo ausente.

Visual C# Consolidado

263

IMPLANTAO DE APLICATIVOS C#
Aps a concluso criar seu aplicativo C#, a prxima etapa para distribu-lo. C# uma linguagem .NET; portanto, distribuir qualquer executveis C# para outras mquinas requer o .NET Framework para ser instalado em cada mquina de execuo (e possivelmente outras dependncias especficas para seu aplicativo). Voc tem uma variedade de opes disponveis para distribuir o .NET Framework. Para obter uma viso geral, consulte Redistribuindo o .NET Framework. Mover concludos aplicativos para outros computadores chamado geralmente de implantao. Ambiente de desenvolvimento da Microsoft fornece mecanismos para implantao; para obter mais informaes, consulte Implantando aplicativos e componentes. Se voc criar e distribuir principalmente na linha de comando, voc talvez precise considerar outros mtodos de implantao e redistribuindo dependncias.

Opes do compilador C# listadas por categoria


As seguintes opes do compilador so classificadas por categoria. Para obter uma lista alfabtica, consulte Opes do compilador C# listadas Alphabetically.

Otimizao
Opo /filealign / Otimizar Propsito Especifica o tamanho das sees no arquivo de sada. Ativa / desativa otimizaes.

Arquivos de sada
Opo /Doc / Fora /PDB /target Propsito Especifica um arquivo XML onde os comentrios documentao processados so a serem gravados. Especifica o arquivo de sada. Especifica o nome de arquivo e local do arquivo.pdb. Especifica o formato do arquivo de sada usando uma das quatro opes: /Target:exe/Target:Library/Target:Module/Target:winexe

/platform Especificar a plataforma de sada.

Conjuntos .NET Framework


Opo /addmodule /delaysign Propsito Especifica um ou mais mdulos que faa parte deste conjunto de mdulos (assembly). Instrui o compilador para adicionar a chave pblica mas para deixar o conjunto no assinado. Especifica o nome do arquivo que contm a chave criptogrfica. Especifica o local de conjuntos referenciado por meio de /Reference.

/keycontainer Especifica o nome do recipiente de chave de criptografia. /KeyFile /lib

Visual C# Consolidado

264

/nostdlib /Reference

Instrui o compilador No para importar a biblioteca padro (mscorlib.dll). Importa metadados de um arquivo que contm um conjunto.

Erros Debugging / verificao


Opo /bugreport / selecionada /Debug /errorreport /fullpaths /nowarn / Avisar Propsito Cria um arquivo que contm informaes que torna fcil a relatar um erro. Especifica se far com que uma exceo em tempo de execuo inteiro aritmtico que estoura os limites do tipo de dados. Instrua o compilador para emitir informaes de depurao. Define relatrio comportamento erros. Especifica o caminho absoluto para o arquivo na sada do compilador. Suprime o compilador na gerao de avisos especificados. Define o nvel de aviso.

/warnaserror Promove avisos a erros.

Preprocessor
Opo / Define Propsito Define smbolos de pr-processamento.

Recursos
Opo /linkresource /Resource /win32icon /win32res Propsito Cria um vnculo a um recurso gerenciado. Incorpora um recurso do .NET Framework no arquivo de sada. Especifica um arquivo.ico para inserir no arquivo de sada. Especifica um recurso do Win32 para inserir no arquivo de sada.

Diversos
Opo @ /? /Codepage /help /langversion / Principal /noconfig /nologo Evita /recurse Propsito Especifica um arquivo de resposta. Lista opes do compilador para STDOUT. Especifica a pgina de cdigos a ser usado para todos os arquivos de cdigo de fonte a compilao. Lista opes do compilador para STDOUT. Especifica qual verso do idioma a ser usado. Especifica o local do mtodo Main. Instrui o compilador no para compilar com CSC.RSP. Suprime as informaes de faixa do compilador. Procura subdiretrios para arquivos de origem para compilar.

/BaseAddress Especifica o endereo base preferido no qual se carregar um DLL.

Visual C# Consolidado

265

/ unsafe /utf8output

Permite compilao do cdigo que usa a No seguro palavra-chave. Exibe compilador sada usando a codificao UTF-8.

Obsoleto opes /incremental Permite compilao incremental.

Opes do compilador C# listadas Alfabeticamente


As seguintes opes do compilador so classificadas em ordem alfabtica. Para obter uma lista categorical, consulte Opes do compilador C# listadas por categoria. Opo @ /? /addmodule /bugreport Propsito L um arquivo de resposta para obter mais opes. Exibe uma mensagem de uso para STDOUT. Vincula os mdulos especificados para este conjunto de mdulos (assembly) Cria um arquivo ' Relatrio de erros '. Este arquivo ser enviado junto com qualquer informao de falha se usado com /errorreport:prompt ou /errorreport:Send. Especifica a pgina de cdigo a ser utilizado quando abrir arquivos de origem. Emite as informaes de depurao. Define smbolos de compilao condicional. Signs atraso-o conjunto usando somente a parte pblica da chave do nome de alta segurana. Especifica um arquivo de documentao XML para gerar. Especifica como lidar com erros de compilador interno: prompt, envio, ou nenhum. O padro Nenhum. Especifica o alinhamento usado para sees de arquivo de sada. Faz o compilador para gerar caminhos totalmente qualificados. Exibe uma mensagem de uso para STDOUT.

/BaseAddress Especifica o endereo base para a biblioteca a ser criado.

/ selecionada Faz o compilador para gerar verificaes de estouro. /Codepage /Debug / Define /delaysign /Doc /errorreport /filealign /fullpaths /help

/incremental Permite compilao incremental [obsoleta]. /keycontainer Especifica um recipiente de chave de nome de alta segurana. /KeyFile /langversion /lib /linkresource / Principal /noconfig /nologo Evita Especifica um arquivo de chave de nome de alta segurana. Especifica modos de verso de idioma: ISO-1 ou padro. Especificar diretrios adicionais para procurar por referncias em. Vincula o recurso especificado a este conjunto. Especifica o tipo que contm o ponto de entrada (Ignorar todos os outros pontos de entrada possveis). Instrui o compilador no para automaticamente incluir arquivo CSC.RSP. Suprime mensagem de direitos autorais do compilador.

Visual C# Consolidado

266

/nostdlib /nowarn / Otimizar / Fora /PDB /platform /recurse /Reference /Resource /target / unsafe /utf8output / Avisar /warnaserror /win32icon /win32res

Instrui o compilador no referncia biblioteca padro (mscorlib.dll). Desativa especfico mensagens de aviso Ativa / desativa otimizaes. Especifica o nome do arquivo de sada (padro:). base Nome do arquivo com classe principal ou primeiro arquivo Especifica o nome de arquivo e local do arquivo.pdb. Limites que plataformas esse cdigo pode executado em: x 86, Itanium, x 64, ou anycpu. O padro anycpu. Inclui todos os arquivos no diretrio atual e subdiretrios de acordo com as especificaes curinga. Metadados referncias a partir dos arquivos conjunto especificado. Incorpora o recurso especificado. Especifica o formato do arquivo de sada usando uma das quatro opes: /Target:exe/Target:Library/Target:Module/Target:winexe Permite que No seguro o cdigo. Sadas Mensagens do compilador em codificao UTF-8. Define o nvel de aviso (0-4). Relatrios especficos avisos como erros. Usa este cone para a sada. Especifica o arquivo de recurso do Win32 (. res).

Como localizar ajuda para erros do compilador:


Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings (Importar e Exportar Configuraes) no menu Tools (Ferramentas). Para obter mais informaes, consulte Configuraes do Visual Studio. Todos os Erros de compilador C# ter correspondentes tpicos que explique por que um erro gerado, e em alguns casos, como corrigir o erro. Para obter ajuda sobre uma mensagem de erro especfica, tente um destes procedimentos: Procedimento

Para encontrar Ajuda para um erro

Clique no nmero de erro no e pressione F1. o Janela Output, OuDigite o nmero do erro na caixa Look for no ndice. OuDigite o nmero de erro na pgina Search.

Visual C# Consolidado

267

EXEMPLOS DO VISUAL C#
Voc pode acessar cdigo de exemplo, procurando resumos de Exemplo nesta seo. Cada abstrato contm um link para abrir ou copiar o Exemplo na arquivos. Alm disso, o SDK do .NET Framework inclui tecnologia e aplicativo Exemplos e tutoriais QuickStart que demonstram recursos .NET Framework e cdigo Visual C#. Os tutoriais QuickStart so a maneira mais rpida para entender o que a tecnologia .NET Framework oferece desenvolvedores lder-borda. Os QuickStarts so uma srie de exemplos e suporte documentao projetadas para rapidamente acquaint voc com a sintaxe, arquitetura, e poder do Visual Studio e o .NET Framework. Do ASP.NET Os tutoriais QuickStart inclui exemplos na e aplicativos Windows Forms, alm de muitos aplicativos instruo que abrangem os recursos da tecnologia .NET Framework mais atraentes. Para acessar o QuickStarts, clique em Start, aponte para Programs, aponte para Microsoft .NET Framework SDK v2.0, e clique em QuickStart Tutorials. Uma pgina da Web do aplicativo " tutoriais QuickStart SDK Microsoft .NET Framework " exibida. Para executar o QuickStarts, siga as instrues na pgina, que configura o banco de dados amostras e conclui a instalao. Para obter mais informaes, consulte Amostras e QuickStarts. Exemplos de introduo Annimo Exemplo representantes Exemplo matrizes Coleo Exemplo classes Exemplo generics (C#) Demonstra o uso de representantes para reduzir a complexidade de aplicativos sem nome. Mostra como usar matrizes. Mostra como fazer classes coleo Generic no-que podem ser usados com a foreach instruo. Mostra como fazer classes a coleo genrica que podem ser usados com a foreach instruo.

Exemplo de parmetros Demonstra simples processamento de linha de comando e matriz da linha de comando indexao. Exemplo dos Mtodos condicional Demonstra condicionais mtodos, que fornecem um poderoso mecanismo pelo qual chamadas para mtodos podem ser includos ou omitido dependendo se um smbolo definido.

Exemplo representantes Mostra como representantes so declaradas, mapeado, e combinados. Exemplo eventos Exemplo de implementao de interface explcita Exemplo World de saudao Exemplo indexadores Indexado Exemplo propriedades Mostra como usar eventos em C#. Demonstra como explicitamente implementar membros de interface.

Um aplicativo hello world. Mostra como usar notao de matriz para acessar um objeto. Mostra como a implementar uma classe que usa propriedades indexadas. Propriedades indexadas permitem que voc para usar uma classe que representa uma coleo de vrios tipos diferentes de itens semelhantes matriz-. Mostra como propriedades so declaradas e usados; tambm demonstra propriedades abstratas.

Exemplo propriedades

Visual C# Consolidado

268

Exemplo Structs Exemplo Overloading do operador Exemplo Conversions definidas pelo usurio Exemplo de verso Produzir exemplo

Mostra como usar structs em C#. Mostra como definido pelo usurio classes poder sobrecarregar operadores. Mostra como definir converses de e para tipos definidos pelo usurio. Do override demonstra verso em C# atravs do uso de e new palavras-chave. Demonstra a palavra-chave rendimento para filtrar itens em uma coleo.

Exemplos intermedirio e Avanado Exemplo atributos Exemplo parte 1 Interop COM Exemplo parte 2 Interop COM Exemplo bibliotecas Mostra como criar classes de atributo personalizado, us-los em cdigo, e consult-los atravs de reflexo. Mostra como usar C# para interoperar com objetos COM. Mostra como um servidor use um C# com um cliente com C++. Mostra como usar opes do compilador para criar uma DLL de vrios arquivos de origem; alm disso, como usar a biblioteca em outros programas. Demonstra tipos de valores que podem ser definidos como nulo. Demonstra como usar um banco de dados do Microsoft Access do C#. Ele mostra como voc pode criar um DataSet e adicionar tabelas a ela a partir de um banco de dados.

Exemplo anulvel Exemplo BD OLE

Exemplo tipos parcial Demonstra como classes e estruturas podem ser definidas em vrios arquivos cdigo fonte-C#. Plataforma Invoke exemplo Exemplo de segurana Segmentao de exemplo Exemplo de cdigo no seguros Exemplo de documentao XML Mostra como chamar exportadas funes DLL do C#. Discute a segurana do .NET Framework e mostra duas maneiras de modificar as permisses de segurana em C#: Usando classes de permisso e atributos de permisso. Demonstra vrias atividades do segmento, como criando e executando um segmento, sincronizando segmentos, interagir entre segmentos, e usando um pool de segmentos. Mostra como usar ponteiros. Mostra como a documentar cdigo usando XML.

Exemplo World de saudao


Download sample Este Exemplo mostra vrias verses de um programa hello world em C#. Observao de segurana

Visual C# Consolidado

269

Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir os arquivos de Exemplo no Solution Explorer 1. 2. 3. 4. Clique em Download Sample. A caixa de mensagem Download de arquivo ser exibida. Clique em Open e, na coluna esquerda da pasta CEP, clique em Extract all files. O Extraction Wizard abre. Clique em Next. Voc pode mudar a pasta os arquivos sero extrados para, ou clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo esteja marcada e clique em Finish.

Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz a soluo do projeto no confivel. Clique OK para continuar. Para criar e executar os exemplos hello world no Visual Studio 1. 2. 3. 4. 5. 6. 7. 8. 9. Abra a soluo (HelloWorld.sln). No Solution Explorer, clique com o projeto HelloWorld1, e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Pressione qualquer tecla para fechar HelloWorld1. No Solution Explorer, clique com o projeto HelloWorld2, e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Pressione qualquer tecla para fechar HelloWorld2. No Solution Explorer, clique com o projeto HelloWorld3, e clique em Set as StartUp Project. No Solution Explorer, clique com o projeto HelloWorld3, e clique em Properties.

10. Abra a Configuration Properties pasta, e clique em Debug. 11. Na Command Line Arguments propriedade, tipo A B C D e clique em OK. 12. No menu Debug, clique em Start Without Debugging. 13. Pressione qualquer tecla para fechar HelloWorld3. 14. No Solution Explorer, clique com o projeto HelloWorld4, e clique em Set as StartUp Project. 15. No menu Debug, clique em Start Without Debugging. 16. Pressione qualquer tecla para fechar HelloWorld4. Para criar e executar os exemplos hello world a partir da linha de comando 1. 2. Use o Change Directory comando para alterar para o diretrio HelloWorld. Digite o seguinte:

Visual C# Consolidado

270

cd HelloWorld1 csc Hello1.cs Hello1 3. 4. 5. Digite o seguinte: cd ..\HelloWorld2 csc Hello2.cs Hello2 Digite o seguinte: cd ..\HelloWorld3 csc Hello3.cs Hello3 A B C D Digite o seguinte: cd ..\HelloWorld4 csc Hello4.cs Hello4 Consulte tambm

Exemplo de parmetros da linha de comando


Download sample Este Exemplo mostra como a linha de comando pode ser acessada e duas maneiras de acessar a matriz de parmetros de linha de comando. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos parmetros de linha de comando no Visual Studio 1. 2. 3. 4. 5. 6. No Solution Explorer, clique com o projeto CmdLine1, e clique em Set as StartUp Project. No Solution Explorer, clique com o projeto, e clique em Properties. Abra a Configuration Properties pasta, e clique em Debug. Na propriedade Command Line Arguments, digite os parmetros da linha de comando, e clique em OK. (Consulte o tutorial para obter um exemplo.) No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para CmdLine2.

Para criar e executar os exemplos parmetros de linha de comando a partir da linha de comando

Visual C# Consolidado

271

1. 2. 3. 4.

Use o Change Directory comando para alterar para o diretrio CmdLine1. Digite o seguinte: csc cmdline1.cs cmdline1 A B C Use o Change Directory comando para alterar para o diretrio CmdLine2. Digite o seguinte: csc cmdline2.cs cmdline2 John Paul Mary

Exemplo matrizes
Download sample Este Exemplo descreve e mostra como matrizes funcionam em C#. Para obter mais informaes, consulte Matrizes (Guia de programao do C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo matrizes no Visual Studio

No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc arrays.cs arrays

Para criar e executar o Exemplo matrizes a partir da linha de comando

Exemplo propriedades
Download sample Este Exemplo mostra como propriedades so uma parte integral da C# linguagem de programao. Ele demonstra como propriedades so declaradas e usados. Consulte Propriedades Para obter mais informaes. Observao de segurana

Visual C# Consolidado

272

Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos propriedades no Visual Studio 1. 2. 3. 1. 2. 3. 4. No Solution Explorer, clique com o projeto pessoa e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para shapetest. Use o Change Directory comando para alterar para o diretrio pessoa. Digite o seguinte: csc person.cs person Use o Change Directory comando para alterar para o diretrio shapetest. Digite o seguinte: csc abstractshape.cs shapes.cs shapetest.cs shapetest

Para criar e executar os exemplos Propriedades a partir da linha de comando

Exemplo bibliotecas
Download sample Este Exemplo mostra como criar e usar uma DLL em C#. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. Clique em Download Sample. A File Download caixa de mensagem ser exibida.

Visual C# Consolidado

273

2.

Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish.

3.

Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo bibliotecas no Visual Studio 1. 2. 3. 4. 5. 6. No Solution Explorer, clique com o projeto FunctionTest, e clique em Set as StartUp Project. No Solution Explorer, clique com o projeto FunctionTest, e clique em Properties. Abra a Configuration Properties pasta e clique em Debug. Na propriedade Command Line Arguments, insira 3 5 10. Clique em OK. No menu Debug, clique em Start Without Debugging. Isso automaticamente criar a biblioteca em funes e executar o programa. Use o Change Directory comando para alterar para o diretrio funes. Digite o seguinte: csc /target:library /out:Functions.dll Factorial.cs DigitCounter.cs 3. 4. Use o Change Directory comando para alterar para o diretrio FunctionTest. Digite o seguinte: copy ..\Functions\Functions.dll . csc /out:FunctionTest.exe /R:Functions.DLL FunctionClient.cs FunctionTest 3 5 10

Para criar e executar o Exemplo bibliotecas a partir da linha de comando 1. 2.

Exemplo de verso
Download sample Este Exemplo demonstra verso em C# atravs do uso de e new palavras-chave. o override Verso ajuda manter a compatibilidade entre classes base e derivados como eles evoluir. Para obter informaes adicionais, consulte Verso com o substituio e palavras-chave new (guia de programao C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer

Visual C# Consolidado

274

1. 2.

Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish.

3.

Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo verso no Visual Studio

No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc versioning.cs versioning

Para criar e executar o Exemplo verso a partir da linha de comando

Coleo Exemplo classes


Download sample Este Exemplo mostra como a implementar uma classe coleo que pode ser usado com a foreach instruo. Para obter mais informaes, consulte Classes coleo (guia de programao C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln.

Visual C# Consolidado

275

A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos classes coleo no Visual Studio 1. 2. 3. 1. 2. 3. 4. No Solution Explorer, clique com o projeto CollectionClasses1 e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para CollectionClasses2. Use o Change Directory comando para alterar para o diretrio CollectionClasses1. Digite o seguinte: csc tokens.cs tokens Use o Change Directory comando para alterar para o diretrio CollectionClasses2. Digite o seguinte: csc tokens2.cs tokens2

Para criar e executar os exemplos classes coleo a partir da linha de comando

Exemplo Structs
Download sample Este Exemplo apresenta a sintaxe e uso de estruturas. Ele tambm aborda as diferenas importantes entre classes e estruturas. Consulte Objetos, classes e Structs (guia de programao C#) Para obter mais informaes. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Structs no Visual Studio

Visual C# Consolidado

276

1. 2. 3. 1. 2. 3. 4.

No Solution Explorer, clique com o projeto Struct1 e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Struct2. Use o Change Directory comando para alterar para o diretrio Struct1. Digite o seguinte: csc struct1.cs struct1 Use o Change Directory comando para alterar para o diretrio Struct2. Digite o seguinte: csc struct2.cs struct2

Para criar e executar os exemplos Structs a partir da linha de comando

Exemplo indexadores
Download sample Este Exemplo mostra como classes C# podem declarar indexadores para fornecer acesso semelhante matriz-s classes. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo Indexers no Visual Studio 1. 2. 3. 4. No Solution Explorer, clique com o projeto indexadores, e clique em Properties. Abra a Configuration Properties pasta, e clique em Debug. Na propriedade Command Line Arguments, insira ..\..\Test.txt. Clique em OK.

Visual C# Consolidado

277

5. 1.

No menu Debug, clique em Start Without Debugging. Para compilar o programa de exemplo, digite o seguinte no prompt de comando: csc indexer.cs

Para criar e executar o Exemplo Indexers a partir da linha de comando

O programa de Exemplo inverte os bytes em um arquivo fornecido como um argumento da linha de comando. Por exemplo, para reverter os bytes em Test.txt e ver o resultado, emitir os seguintes comandos: indexers Test.txt type Test.txt 2. Para alterar o arquivo revertido para Normal, execute o programa no mesmo arquivo novamente.

Indexado Exemplo propriedades


Download sample Este Exemplo mostra como classes C# podem declarar indexadas propriedades para representa uma coleo de tipos diferentes de itens semelhantes matriz-. Para obter mais informaes, consulte Propriedades (Guia de programao do C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo indexado propriedades no Visual Studio

No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc indexedproperty.cs indexedproperty

Para criar e executar o Exemplo indexado Propriedades a partir da linha de comando

Visual C# Consolidado

278

Exemplo Conversions definidas pelo usurio


Download sample Este Exemplo mostra como definir converses de ou para classes ou estruturas, e como essas converses so usados. Consulte Operadores de converso (guia de programao C#) Para obter mais informaes. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Conversions pelo usurio no Visual Studio 1. 2. 3. 1. 2. 3. 4. No Solution Explorer, clique com o projeto Conversion1 e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Conversion2. Use o Change Directory comando para alterar para o diretrio Conversion1. Digite o seguinte: csc conversion.cs conversion Use o Change Directory comando para alterar para o diretrio Conversion2. Digite o seguinte: csc structconversion.cs structconversion

Para criar e executar os exemplos Conversions pelo usurio a partir da linha de comando

Exemplo generics (C#)


Download sample Este Exemplo mostra como criar uma classe personalizada lista genrico com um parmetro nico tipo, e como implement IEnumerable<T> Para ativar foreach iterao atravs do contedo

Visual C# Consolidado

279

da lista. O Exemplo tambm mostra como cdigo de cliente cria uma instncia da classe, especificando um argumento Tipo, e como restries sobre o parmetro type ativar operaes adicionais a serem executadas sobre os argumentos Tipo. Para obter um Exemplo de uma classe a coleo genrica que implementa um bloco do iterador, consulte COMO: Criar um bloco iterador para uma lista genrica (Guia de programao C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo Generics no Visual Studio

No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc generics.cs generics

Para criar e executar o Exemplo Generics a partir da linha de comando

Comentrios Este Exemplo fornecido para fins de demonstrao e no se destina a ser usado sem modificaes no cdigo de produo. Para cdigo de qualidade de produo, ele recomendvel que voc usar as classes coleo no espao para nome System.Collections.Generic sempre que possvel.

Exemplo Overloading
Download sample

do operador

Este Exemplo demonstra classes definidas pelo usurio como poder sobrecarregar operadores. Consulte Operadores C# Para obter mais informaes. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos

Visual C# Consolidado

280

ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Overloading operador no Visual Studio 1. 2. 3. 1. 2. 3. 4. No Solution Explorer, clique com o projeto complexo e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Dbbool. Use o Change Directory comando para alterar para o diretrio complexo. Digite o seguinte: csc complex.cs complex Use o Change Directory comando para alterar para o diretrio Dbbool. Digite o seguinte: csc dbbool.cs dbbool

Para criar e executar os exemplos operador Overloading a partir da linha de comando

Exemplo representantes
Download sample Este Exemplo demonstra os tipos de representante. Ele mostra como para mapear delegados para estticos e mtodos da instncia, e como combin-las para criar representantes de difuso seletiva. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer

Visual C# Consolidado

281

1. 2.

Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish.

3.

Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos representantes no Visual Studio 1. 2. 3. 1. 2. 3. 4. No Solution Explorer, clique com o projeto Delegates1, e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Delegates2. Use o Change Directory comando para alterar para o diretrio Delegates1. Digite o seguinte: csc bookstore.cs bookstore Use o Change Directory comando para alterar para o diretrio Delegates2. Digite o seguinte: csc compose.cs compose

Para criar e executar os exemplos representantes a partir da linha de comando

Exemplo eventos
Download sample Este Exemplo mostra como a declarar, chamar, e configurar eventos em C#. Para obter mais informaes, consulte Eventos (Guia de programao do C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files.

Visual C# Consolidado

282

O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos eventos no Visual Studio 1. 2. 3. 1. 2. 3. 4. No Solution Explorer, clique com o projeto Events1, e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Events2. Use o Change Directory comando para alterar para o diretrio Events1. Digite o seguinte: csc events1.cs events1 Use o Change Directory comando para alterar para o diretrio Events2. Digite o seguinte: csc events2.cs events2

Para criar e executar os exemplos eventos a partir da linha de comando

Exemplo de implementao de interface explcita


Download sample Este Exemplo demonstra como explicitamente implementar membros de interface e como acessar esses participantes a partir de ocorrncias interface. Para informaes de plano de fundo, consulte Interfaces (guia de programao C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente.

Visual C# Consolidado

283

Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Explicit implementao interface no Visual Studio 1. 2. 3. 1. 2. 3. 4. No Solution Explorer, clique com o projeto ExplicitInterface1 e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para ExplicitInterface2. Use o Change Directory comando para alterar para o diretrio ExplicitInterface1. Digite o seguinte: csc explicit1.cs explicit1 Use o Change Directory comando para alterar para o diretrio ExplicitInterface2. Digite o seguinte: csc explicit2.cs explicit2

Para criar e executar os exemplos Explicit implementao interface a partir da linha de comando

Exemplo dos Mtodos condicional


Download sample Este Exemplo demonstra condicionais mtodos, que fornecem um poderoso mecanismo pelo qual chamadas para mtodos podem ser includos ou omitido dependendo se um smbolo definido. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar.

Visual C# Consolidado

284

Para criar e executar o Exemplo mtodos condicional no Visual Studio 1. 2. 3. 4. 5. 6.

No Solution Explorer, clique com o projeto e clique em Properties. Abra a pasta Propriedades de configurao, e clique em Debug. Defina a Command Line Arguments propriedade para A B C. Na pasta Propriedades de configurao, clique em Build. Modificar a Conditional Compilation Constants propriedade. Por exemplo, adicionar ou excluir Debug. Clique em OK. No menu Debug, clique em Start Without Debugging.

Para criar e executar o Exemplo mtodos condicional a partir da linha de comando Para incluir o mtodo condicional, compilar e execute o programa de exemplo, digitando o seguinte no prompt de comando: csc CondMethod.cs tracetest.cs /d:DEBUG tracetest A B C

Exemplo de documentao XML


Download sample Este Exemplo mostra como usar XML ao documento cdigo. Consulte Comentrios de documentao XML (Guia de programao C#) Para obter informaes adicionais. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar o Exemplo documentao XML no Visual Studio 1. 2. 3. No Solution Explorer, clique com o projeto e clique em Properties. Abra a pasta Propriedades de configurao e clique em Build. Defina a propriedade arquivo documentao XML como XMLsample.xml.

Visual C# Consolidado

285

4.

No menu Build, clique em Build. O arquivo de sada XML poder ser no diretrio de depurao. Para gerar a documentao XML de exemplo, digite o seguinte no prompt de comando: csc XMLsample.cs /doc:XMLsample.xml Para ver o XML gerado, emita o seguinte comando: type XMLsample.xml

Para criar o Exemplo documentao XML a partir da linha de comando 1. 2.

Plataforma Invoke Exemplo


Download sample Este Exemplo demonstra como chamar plataforma chama (funes exportadas DLL) do C#. Consulte Interoperabilidade (guia de programao C#) Para obter mais informaes. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Platform Invoke no Visual Studio 1. 2. 3. 1. 2. 3. No Solution Explorer, clique com o projeto PinvokeTest e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Marshal e PInvoke. Use o Change Directory comando para alterar para o diretrio PinvokeTest. Digite o seguinte: csc PinvokeTest.cs PinvokeTest Use o Change Directory comando para alterar para o diretrio Marshal.

Para criar e executar os exemplos Platform Invoke a partir da linha de comando

Visual C# Consolidado

286

4. 5. 6.

Digite o seguinte: csc Marshal.cs Marshal Use o Change Directory comando para alterar para o diretrio PInvoke. Digite o seguinte: csc logfont.cs pinvoke.cs pinvoke

Exemplo parte 1 Interop COM


Download sample Este Exemplo demonstra como um programa C# pode interoperar com um componente COM no gerenciado. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos com Interop parte 1 no Visual Studio 1. 2. 3. 4. 5. 6. 7. 1. No Solution Explorer, clique com o projeto Interop1, e clique em Set as StartUp Project. No Solution Explorer, clique com o projeto Interop1, e clique em Properties. Abra a Configuration Properties pasta, e clique em Debug. Na propriedade argumentos de linha de comando, digite um arquivo AVI como c:\winnt\clock.avi. Clique em OK. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Interop2. No Solution Explorer, abrir References para Interop1.

Se o QuartzTypeLib.dll includo com Interop1 est desatualizado

Visual C# Consolidado

287

2. 3. 4. 5. 6.

Clique com o boto direito do mouse QuartzTypeLib e, clique em Remove. Clique com o boto direito do mouse References e, clique em Add Reference. Na guia COM, selecione o componente denominado, " biblioteca Tipo de Controle ActiveMovie ". Clique em Select e, clique em OK. Recrie Interop1.

Observao Adicionando uma referncia para o componente faz a mesma coisa que chamar TLBIMP na linha de comando para criar QuartzTypeLib.dll (como mostrado abaixo). Para criar e executar os exemplos com Interop Parte 1 a partir da linha de comando 1. 2. Use o Change Directory comando para alterar para o diretrio Interop1. Digite o seguinte: tlbimp %windir%\system32\quartz.dll /out:QuartzTypeLib.dll csc /r:QuartzTypeLib.dll interop1.cs interop1 %windir%\clock.avi 3. 4. Use o Change Directory comando para alterar para o diretrio Interop2. Digite o seguinte: csc interop2.cs interop2 %windir%\clock.avi

Exemplo parte 2 Interop COM


Download sample Este Exemplo demonstra usando um servidor C# com um cliente com C++. Observao preciso instalar para compilar Este Exemplo Visual C++. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente.

Visual C# Consolidado

288

Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo 2 Part Interop COM no Visual Studio 1. 2. 3. 4. 5. 1. 2. 3. 4. No Solution Explorer, clique com o projeto COMClient, e clique em Properties. Abra a Configuration Properties pasta, e clique em Debug. Na propriedade Command Line Arguments, digite um nome. Clique em OK. No menu Debug, clique em Start Without Debugging. Use o Change Directory comando para alterar para o diretrio COMInteropPart2\COMClient. Copie o cdigo do servidor C# para o diretrio COMClient: copy ..\CSharpServer\CSharpServer.cs Compilar o servidor: csc /target:library CSharpServer.cs regasm CSharpServer.dll /tlb:CSharpServer.tlb Compilar o cliente (verifique se as variveis Caminho e ambiente so definidas corretamente com vcvars32.bat):: cl COMClient.cpp 5. Execute o cliente: COMClient friend

Para criar e executar o Exemplo 2 Part Interop COM a partir da linha de comando

Exemplo atributos
Download sample Este Exemplo demonstra como criar classes de atributo personalizado, us-los em cdigo, e consult-los atravs de reflexo. Para obter mais informaes sobre atributos, consulte Atributos (guia de programao C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre.

Visual C# Consolidado

289

3.

Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish.

Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo atributos no Visual Studio

No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc AttributesTutorial.cs AttributesTutorial

Para criar e executar o Exemplo atributos a partir da linha de comando

Exemplo de segurana
Download sample Este Exemplo demonstra como modificar as permisses de segurana atravs de classes de permisso e atributos de permisso. Para obter informaes adicionais, consulte Segurana (guia de programao C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos de segurana no Visual Studio 1. 2. No Solution Explorer, clique com o projeto Security1 e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging.

Visual C# Consolidado

290

3. 1. 2. 3. 4. 5. 6.

Repita as etapas anteriores para Security2 e Security3. Use o Change Directory comando para alterar para o diretrio Security1. Digite o seguinte: csc ImperativeSecurity.cs ImperativeSecurity Use o Change Directory comando para alterar para o diretrio Security2. Digite o seguinte: csc DeclarativeSecurity.cs DeclarativeSecurity Use o Change Directory comando para alterar para o diretrio Security3. Digite o seguinte: csc SuppressSecurity.cs SuppressSecurity

Para criar e executar os exemplos de segurana a partir da linha de comando

Segmentao de Exemplo
Download sample Este Exemplo demonstra as seguintes tcnicas segmentao. Consulte Segmentao (guia de programao C#) Para obter mais informaes.

Criar, iniciar, e Finalizando um segmento Usando um pool de segmentos Segmento Sincronizao e interao Observao de segurana

Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Threading no Visual Studio

Visual C# Consolidado

291

1. 2. 3. 1. 2. 3. 4.

No Solution Explorer, clique com o projeto ThreadStartStop e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para ThreadPool, e ThreadSync. Use o Change Directory comando para alterar para o diretrio segmentos. Digite o seguinte: cd ThreadStartStop csc ThreadStartStop.cs ThreadStartStop Digite o seguinte: cd ..\ThreadPool csc ThreadPool.cs ThreadPool Digite o seguinte: cd ..\ThreadSync csc ThreadSync.cs ThreadSync

Para criar e executar os exemplos Threading a partir da linha de comando

Exemplo de cdigo no seguros


Download sample Este Exemplo demonstra como usar cdigo no gerenciado (cdigo usando ponteiros) no C#. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos UNSAFE cdigo no Visual Studio 1. 2. No Solution Explorer, clique com o projeto FastCopy, e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging.

Visual C# Consolidado

292

3. 4. 5. 6. 7. 8. 9.

No Solution Explorer, clique com o projeto ReadFile, e clique em Set as StartUp Project. No Solution Explorer, clique com o projeto ReadFile, e clique em Properties. Abra a pasta Propriedades de configurao, e clique em Debug. Na propriedade argumentos da linha de comando, insira ..\..\ReadFile.cs. Clique em OK. No menu Debug, clique em Start Without Debugging. No Solution Explorer, clique com o projeto PrintVersion, e clique em Set as StartUp Project.

10. No menu Debug, clique em Start Without Debugging. Para criar e executar os exemplos de cdigo UNSAFE a partir da linha de comando 1. 2. 3. 4. Use o Change Directory comando para alterar para o diretrio UNSAFE. Digite o seguinte: cd FastCopy csc FastCopy.cs /unsafe FastCopy Digite o seguinte: cd ..\ReadFile csc ReadFile.cs /unsafe ReadFile ReadFile.cs Digite o seguinte: cd ..\PrintVersion csc PrintVersion.cs /unsafe PrintVersion

Exemplo BD OLE
Download sample Este Exemplo demonstra como usar um banco de dados do Microsoft Access do C#. Ele mostra como voc pode criar um DataSet e adicionar tabelas a ela a partir de um banco de dados. O banco de dados BugTypes.MDB usado no programa de Exemplo um arquivo.mdb do Microsoft Access 2000. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish.

Visual C# Consolidado

293

Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo de banco de dados OLE no Visual Studio

No menu Debug, clique em Start Without Debugging. Observao Se voc estiver criando a soluo no modo Release, copie BugTypes.mdb para a pasta \bin\release.

Para criar e executar o Exemplo OLE DB a partir da linha de comando

Digite o seguinte no prompt de comando: csc oledbsample.cs oledbsample

Produzir Exemplo
Download sample Este Exemplo mostra como criar uma classe lista que implementa IEnumerable<int> e palavra-chave yield Para ativar foreach iterao atravs do contedo da lista. Duas propriedades so definidas, um retornar os nmeros mpares, o outro retornar os nmeros pares. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo YIELD cdigo no Visual Studio

No menu Debug, clique em Start Without Debugging.

Para criar e executar o Exemplo YIELD cdigo a partir da linha de comando

Visual C# Consolidado

294

1. 2.

Use o Change Directory (cd) comando para alterar para o Yield Diretrio. Digite o seguinte: csc Yield.cs Yield

Annimo Exemplo representantes


Download sample Este Exemplo demonstra usar um representante annimo para calcular um bnus do salrio de um funcionrio. Usar um representante annimo simplifica o programa porque no necessrio para definir um mtodo separado. Os dados para cada funcionrio so armazenados em um objeto que contm detalhes pessoais, bem como um representante que referencia o algoritmo necessrio para calcular o bnus. Definindo o algoritmo por meio de um representante, o mesmo mtodo pode ser usado para executar o clculo do bnus, independentemente de como ele realmente calculado. De anotao, uma varivel local, multiplicador, tambm se torna uma varivel externo capturado porque ele mencionado em um clculo delegado. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo de cdigo AnonymousDelegates no Visual Studio

No menu Debug, clique em Start Without Debugging. 1. 2. Use o Change Directory (cd) comando para alterar para o diretrio AnonymousDelegates. Digite o seguinte: csc AnonymousDelegates.cs AnonymousDelegates

Para criar e executar o Exemplo de cdigo AnonymousDelegates a partir da linha de comando

Visual C# Consolidado

295

Exemplo tipos parcial


Download sample Este Exemplo demonstra o uso de tipos parciais que permitem class ou struct para ser definidos em dois ou mais arquivos C#. Isso permite que vrios programadores para trabalhar em partes diferentes de uma classe em paralela, e para aspectos diferentes de uma classe complexo a serem mantidos em arquivos separados. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo de cdigo PartialTypes no Visual Studio

No menu Debug, clique em Start Without Debugging. 1. 2. Use o Change Directory (cd) comando para alterar para o PartialTypes Diretrio. Digite o seguinte: csc PartialTypes.cs PartialTypes

Para criar e executar o Exemplo de cdigo PartialTypes a partir da linha de comando

Exemplo anulvel
Download sample Este Exemplo demonstra o uso de tipos anulveis. Esse recurso permite que tipos de valores para que um estado no inicializada, ou vazio, semelhante a como tipos de referncia podem ser definidos como null. Este Observao de segurana cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada

Visual C# Consolidado

296

Para abrir o arquivo de Exemplo no Solution Explorer 1. 2. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 3. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo Nullable cdigo no Visual Studio 1. 2. 1. 2. Abra Nullable.sln, o arquivo de soluo, o clicando duas vezes no arquivo no Windows Explorer, ou clicando Open no menu File. No menu Debug, clique em Start Without Debugging. Use o Change Directory (cd) comando para alterar para o diretrio Nullable. Digite o seguinte: csc Nullable.cs Nullable

Para criar e executar o Exemplo de cdigo Nullable a partir da linha de comando

Visual C# Consolidado

297

TERMINOLOGIA C#
Modificador de acesso Uma palavra-chave, como Particular, Protegido ou Pblica, que restringe o acesso a um tipo ou membro Tipo., interno Para obter mais informaes, consulte Modificadores de acesso. Membro acessvel Um membro que pode ser acessado por um tipo determinado. Um membro acessvel para um tipo no est necessariamente acessvel para um outro tipo. Para obter mais informaes, consulte Modificadores de acesso e Conjuntos de amigo. Assessor Um mtodo que Define ou recupera o valor de um valor que est associado a uma propriedade membro dados particulares. Propriedades de leitura-gravao e set ter get assessores. Propriedades que so somente leitura tm apenas um get acessador. Para obter mais informaes, consulte Propriedades. Mtodo annimo Um mtodo annimo um bloco de cdigo que passado como um parmetro para um Delegar. Para obter mais informaes, consulte Mtodos annimo. Classe base Uma Classe que herdado por outra classe ' derivado '. Para obter mais informaes, consulte Herana. Chamar pilha A srie de mtodo chama esquerda do incio do programa para a instruo atualmente sendo executado em tempo de execuo. Classe Um tipo de dados que descreve um objeto. Classes conter dados, e os mtodos para agir sobre os dados. Para obter mais informaes, consulte Classes. Construtor Um mtodo especial em class ou struct que inicializa os objetos do mesmo tipo. Para obter mais informaes, consulte Construtores. Delegar Um representante um tipo que referencia um mtodo. Depois que um representante atribudo um mtodo, ele funciona exatamente como esse mtodo. Para obter mais informaes, consulte Representantes. Classe derivada Um Classe que usa herana para obter, aumentar, ou modificar o comportamento e dados de outra classe ' base '. Para obter mais informaes, consulte Herana. destruidor Um mtodo especial em ou struct que prepara a instncia para Destruio pelo sistema. um Classe Para obter mais informaes, consulte Destructors. Evento Um membro da OU struct que envia notificaes de alterao. um Classe Para obter mais informaes, consulte Eventos.

Visual C# Consolidado

298

Campo Um membro de dados ou struct que acessado diretamente. um Classe generics Generics permitir que voc a definir e ou mtodo que so definidas com um parmetro de tipo. um Classe Quando cdigo cliente instancia o tipo, ele especifica um tipo especfico como um argumento. Para obter mais informaes, consulte Generics. IDE Ambiente de desenvolvimento integrado. O aplicativo que fornece a interface do usurio unificada para as ferramentas de desenvolvimento vrios incluindo o compilador, depurador, editor de cdigo, e designers. Tipo imutvel Um tipo cujos dados de instncia, campos e propriedades, no altera depois a instncia for criada. A maioria dos tipos valor so imutveis. Membro inacessvel Um membro que no pode ser acessado por um tipo determinado. Um membro inacessvel para um tipo no necessariamente inacessvel para outro tipo. Para obter mais informaes, consulte Modificadores de acesso. Herana C# herana oferece suporte, para uma Classe que deriva de outra classe, conhecido como a classe base, herda os mesmos mtodos e propriedades. Herana envolve classes base e classes derivadas. Para obter mais informaes, consulte Herana. Interface Um tipo que contm somente as assinaturas de mtodos pblicos, eventos e representantes. Um objeto que herda a interface deve implementar todos os mtodos e eventos definidos na interface. Classes ou estruturas podem herdar qualquer nmero de interfaces. Para obter mais informaes, consulte Interfaces iterador Um iterador um mtodo que permite que os consumidores de uma Classe que contm uma coleo ou matriz para usar foreach, na referncia (C#) para percorrer essa coleo ou matriz. Membro Um campo, propriedade, mtodo, ou evento declarado no ou struct. um Classe Mtodo Um bloco de cdigos nomeado que fornece comportamento para ou struct. um Classe Tipo mutveis Um tipo cujos dados de instncia, campos e propriedades, podem ser alteradas aps a ocorrncia criada. A maioria Tipos de referncia est mutveis. tipo aninhado Um tipo declarado na declarao de outro tipo. object Uma instncia de um Classe. Um objeto existe na memria, e tem dados e mtodos que atuam sobre os dados. Para obter mais informaes, consulte Objetos, classes, e Structs. Propriedade

Visual C# Consolidado

299

Um membro de dados acessado por meio de um acessador. Para obter mais informaes, consulte Propriedades. refatorao Reutilizando anteriormente digitado cdigo. Visual Express Editor cdigo C# inteligentemente pode reformatar cdigo para, por exemplo, transformar um bloco de cdigo de realce em um mtodo. Para obter mais informaes, consulte Refatorao. Tipo de referncia Um tipo de dados. Uma varivel declarada como um ponto Tipo de referncia para um local em que os dados so armazenados. Para obter mais informaes, consulte Tipos de referncia. static Existe uma classe ou mtodo declarado como esttico sem primeiro sendo instanciado usando a palavra-chave new. Main() um mtodo esttico. Para obter mais informaes, consulte Classes estticas e membros de classe estticos. struct Um tipo composto dados que normalmente usado para conter algumas variveis que tm alguma relao lgica. Structs tambm podem conter mtodos e eventos. Structs no oferecerem suporte herana mas eles fazer suporte interfaces. uma estrutura a Tipo de valor,. enquanto um Classe um Tipo de referncia Para obter mais informaes, consulte Structs. Tipo de valor Um tipo de valor um tipo de dados que est alocado na pilha, em um tipo de referncia que alocado em pilha vez. Incluindo o Tipos internas, os tipos numricos, bem como o tipo estrutura e o tipo anulvel, so todos os tipos valor. O Classe tipo e Seqncia Tipo so Tipos de referncia. Para obter mais informaes, consulte Tipos valor (referncia C#).

Visual C# Consolidado

300

EXEMPLOS DO VISUAL C#
Voc pode acessar cdigo de exemplo, procurando resumos de Exemplo nesta seo. Cada abstrato contm um link para abrir ou copiar o Exemplo na arquivos. Alm disso, o SDK do .NET Framework inclui tecnologia e aplicativo Exemplos e tutoriais QuickStart que demonstram recursos .NET Framework e cdigo Visual C#. Os tutoriais QuickStart so a maneira mais rpida para entender o que a tecnologia .NET Framework oferece desenvolvedores lder-borda. Os QuickStarts so uma srie de exemplos e suporte documentao projetadas para rapidamente acquaint voc com a sintaxe, arquitetura, e poder do Visual Studio e o .NET Framework. Do ASP.NET Os tutoriais QuickStart inclui exemplos na e aplicativos Windows Forms, alm de muitos aplicativos instruo que abrangem os recursos da tecnologia .NET Framework mais atraentes. Para acessar o QuickStarts, clique em Start, aponte para Programs, aponte para Microsoft .NET Framework SDK v2.0, e clique em QuickStart Tutorials. Uma pgina da Web do aplicativo " tutoriais QuickStart SDK Microsoft .NET Framework " exibida. Para executar o QuickStarts, siga as instrues na pgina, que configura o banco de dados amostras e conclui a instalao. Para obter mais informaes, consulte Amostras e QuickStarts. Nesta seo Exemplos de introduo Annimo Exemplo representantes Exemplo matrizes Coleo Exemplo classes Exemplo generics (C#) Demonstra o uso de representantes para reduzir a complexidade de aplicativos sem nome. Mostra como usar matrizes. Mostra como fazer classes coleo Generic no-que podem ser usados com a foreach instruo. Mostra como fazer classes a coleo genrica que podem ser usados com a foreach instruo.

Exemplo de parmetros Demonstra simples processamento de linha de comando e matriz da linha de comando indexao. Exemplo dos Mtodos condicional Demonstra condicionais mtodos, que fornecem um poderoso mecanismo pelo qual chamadas para mtodos podem ser includos ou omitido dependendo se um smbolo definido.

Exemplo representantes Mostra como representantes so declaradas, mapeado, e combinados. Exemplo eventos Exemplo de implementao de interface explcita Mostra como usar eventos em C#. Demonstra como explicitamente implementar membros de interface.

Visual C# Consolidado

301

Exemplo World de saudao Exemplo indexadores Indexado Exemplo propriedades

Um aplicativo hello world.

Mostra como usar notao de matriz para acessar um objeto. Mostra como a implementar uma classe que usa propriedades indexadas. Propriedades indexadas permitem que voc para usar uma classe que representa uma coleo de vrios tipos diferentes de itens semelhantes matriz-. Mostra como propriedades so declaradas e usados; tambm demonstra propriedades abstratas. Mostra como usar structs em C#. Mostra como definido pelo usurio classes poder sobrecarregar operadores. Mostra como definir converses de e para tipos definidos pelo usurio.

Exemplo propriedades

Exemplo Structs Exemplo Overloading do operador Exemplo Conversions definidas pelo usurio Exemplo de verso

Do override demonstra verso em C# atravs do uso de e new palavras-chave. Demonstra a palavra-chave rendimento para filtrar itens em uma coleo.

Produzir exemplo

Exemplos intermedirio e Avanado Exemplo atributos Mostra como criar classes de atributo personalizado, us-los em cdigo, e consult-los atravs de reflexo. Mostra como usar C# para interoperar com objetos COM.

Exemplo parte 1 Interop COM Exemplo parte 2 Interop COM Exemplo bibliotecas

Mostra como um servidor use um C# com um cliente com C++.

Mostra como usar opes do compilador para criar uma DLL de vrios arquivos de origem; alm disso, como usar a biblioteca em outros programas. Demonstra tipos de valores que podem ser definidos como nulo. Demonstra como usar um banco de dados do Microsoft Access do C#. Ele mostra como voc pode criar um DataSet e adicionar tabelas a ela a partir de um banco de dados.

Exemplo anulvel Exemplo BD OLE

Visual C# Consolidado

302

Exemplo tipos parcial Demonstra como classes e estruturas podem ser definidas em vrios arquivos cdigo fonte-C#. Plataforma Invoke exemplo Exemplo de segurana Mostra como chamar exportadas funes DLL do C#.

Discute a segurana do .NET Framework e mostra duas maneiras de modificar as permisses de segurana em C#: Usando classes de permisso e atributos de permisso. Demonstra vrias atividades do segmento, como criando e executando um segmento, sincronizando segmentos, interagir entre segmentos, e usando um pool de segmentos. Mostra como usar ponteiros.

Segmentao de exemplo

Exemplo de cdigo no seguros Exemplo de documentao XML

Mostra como a documentar cdigo usando XML.

Exemplo World de saudao


Download sample Este Exemplo mostra vrias verses de um programa hello world em C#. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir os arquivos de Exemplo no Solution Explorer 5. 6. 7. 8. Clique em Download Sample. A caixa de mensagem Download de arquivo ser exibida. Clique em Open e, na coluna esquerda da pasta CEP, clique em Extract all files. O Extraction Wizard abre. Clique em Next. Voc pode mudar a pasta os arquivos sero extrados para, ou clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo esteja marcada e clique em Finish.

Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz a soluo do projeto no confivel. Clique OK para continuar. Para criar e executar os exemplos hello world no Visual Studio

Visual C# Consolidado

303

17. Abra a soluo (HelloWorld.sln). 18. No Solution Explorer, clique com o projeto HelloWorld1, e clique em Set as StartUp Project. 19. No menu Debug, clique em Start Without Debugging. 20. Pressione qualquer tecla para fechar HelloWorld1. 21. No Solution Explorer, clique com o projeto HelloWorld2, e clique em Set as StartUp Project. 22. No menu Debug, clique em Start Without Debugging. 23. Pressione qualquer tecla para fechar HelloWorld2. 24. No Solution Explorer, clique com o projeto HelloWorld3, e clique em Set as StartUp Project. 25. No Solution Explorer, clique com o projeto HelloWorld3, e clique em Properties. 26. Abra a Configuration Properties pasta, e clique em Debug. 27. Na Command Line Arguments propriedade, tipo A B C D e clique em OK. 28. No menu Debug, clique em Start Without Debugging. 29. Pressione qualquer tecla para fechar HelloWorld3. 30. No Solution Explorer, clique com o projeto HelloWorld4, e clique em Set as StartUp Project. 31. No menu Debug, clique em Start Without Debugging. 32. Pressione qualquer tecla para fechar HelloWorld4. Para criar e executar os exemplos hello world a partir da linha de comando 6. 7. 8. 9. Use o Change Directory comando para alterar para o diretrio HelloWorld. Digite o seguinte: cd HelloWorld1 csc Hello1.cs Hello1 Digite o seguinte: cd ..\HelloWorld2 csc Hello2.cs Hello2 Digite o seguinte: cd ..\HelloWorld3 csc Hello3.cs Hello3 A B C D 10. Digite o seguinte: cd ..\HelloWorld4 csc Hello4.cs Hello4

Exemplo de parmetros da linha de comando


Download sample Este Exemplo mostra como a linha de comando pode ser acessada e duas maneiras de acessar a matriz de parmetros de linha de comando. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o

Visual C# Consolidado

304

cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos parmetros de linha de comando no Visual Studio 7. 8. 9. No Solution Explorer, clique com o projeto CmdLine1, e clique em Set as StartUp Project. No Solution Explorer, clique com o projeto, e clique em Properties. Abra a Configuration Properties pasta, e clique em Debug.

10. Na propriedade Command Line Arguments, digite os parmetros da linha de comando, e clique em OK. (Consulte o tutorial para obter um exemplo.) 11. No menu Debug, clique em Start Without Debugging. 12. Repita as etapas anteriores para CmdLine2. Para criar e executar os exemplos parmetros de linha de comando a partir da linha de comando 5. 6. 7. 8. Use o Change Directory comando para alterar para o diretrio CmdLine1. Digite o seguinte: csc cmdline1.cs cmdline1 A B C Use o Change Directory comando para alterar para o diretrio CmdLine2. Digite o seguinte: csc cmdline2.cs cmdline2 John Paul Mary

Exemplo matrizes
Download sample Este Exemplo descreve e mostra como matrizes funcionam em C#. Para obter mais informaes, consulte Matrizes (Guia de programao do C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o

Visual C# Consolidado

305

cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo matrizes no Visual Studio

No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc arrays.cs arrays

Para criar e executar o Exemplo matrizes a partir da linha de comando

Exemplo propriedades
Download sample Este Exemplo mostra como propriedades so uma parte integral da C# linguagem de programao. Ele demonstra como propriedades so declaradas e usados. Consulte Propriedades Para obter mais informaes. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente.

Visual C# Consolidado

306

Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos propriedades no Visual Studio 4. 5. 6. 5. 6. 7. 8. No Solution Explorer, clique com o projeto pessoa e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para shapetest. Use o Change Directory comando para alterar para o diretrio pessoa. Digite o seguinte: csc person.cs person Use o Change Directory comando para alterar para o diretrio shapetest. Digite o seguinte: csc abstractshape.cs shapes.cs shapetest.cs shapetest

Para criar e executar os exemplos Propriedades a partir da linha de comando

Exemplo bibliotecas
Download sample Este Exemplo mostra como criar e usar uma DLL em C#. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo bibliotecas no Visual Studio

Visual C# Consolidado

307

7. 8. 9.

No Solution Explorer, clique com o projeto FunctionTest, e clique em Set as StartUp Project. No Solution Explorer, clique com o projeto FunctionTest, e clique em Properties. Abra a Configuration Properties pasta e clique em Debug.

10. Na propriedade Command Line Arguments, insira 3 5 10. 11. Clique em OK. 12. No menu Debug, clique em Start Without Debugging. Isso automaticamente criar a biblioteca em funes e executar o programa. Para criar e executar o Exemplo bibliotecas a partir da linha de comando 5. 6. 7. 8. Use o Change Directory comando para alterar para o diretrio funes. Digite o seguinte: csc /target:library /out:Functions.dll Factorial.cs DigitCounter.cs Use o Change Directory comando para alterar para o diretrio FunctionTest. Digite o seguinte: copy ..\Functions\Functions.dll . csc /out:FunctionTest.exe /R:Functions.DLL FunctionClient.cs FunctionTest 3 5 10

Exemplo de verso
Download sample Este Exemplo demonstra verso em C# atravs do uso de e new palavras-chave. o override Verso ajuda manter a compatibilidade entre classes base e derivados como eles evoluir. Para obter informaes adicionais, consulte Verso com o substituio e palavras-chave new (guia de programao C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln.

Visual C# Consolidado

308

A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo verso no Visual Studio

No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc versioning.cs versioning

Para criar e executar o Exemplo verso a partir da linha de comando

Coleo Exemplo classes


Download sample Este Exemplo mostra como a implementar uma classe coleo que pode ser usado com a foreach instruo. Para obter mais informaes, consulte Classes coleo (guia de programao C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos classes coleo no Visual Studio 4. 5. 6. 5. 6. No Solution Explorer, clique com o projeto CollectionClasses1 e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para CollectionClasses2. Use o Change Directory comando para alterar para o diretrio CollectionClasses1. Digite o seguinte: csc tokens.cs tokens

Para criar e executar os exemplos classes coleo a partir da linha de comando

Visual C# Consolidado

309

7. 8.

Use o Change Directory comando para alterar para o diretrio CollectionClasses2. Digite o seguinte: csc tokens2.cs tokens2

Exemplo Structs
Download sample Este Exemplo apresenta a sintaxe e uso de estruturas. Ele tambm aborda as diferenas importantes entre classes e estruturas. Consulte Objetos, classes e Structs (guia de programao C#) Para obter mais informaes. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Structs no Visual Studio 4. 5. 6. 5. 6. 7. 8. No Solution Explorer, clique com o projeto Struct1 e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Struct2. Use o Change Directory comando para alterar para o diretrio Struct1. Digite o seguinte: csc struct1.cs struct1 Use o Change Directory comando para alterar para o diretrio Struct2. Digite o seguinte: csc struct2.cs struct2

Para criar e executar os exemplos Structs a partir da linha de comando

Visual C# Consolidado

310

Exemplo indexadores
Download sample Este Exemplo mostra como classes C# podem declarar indexadores para fornecer acesso semelhante matriz-s classes. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo Indexers no Visual Studio 6. 7. 8. 9. No Solution Explorer, clique com o projeto indexadores, e clique em Properties. Abra a Configuration Properties pasta, e clique em Debug. Na propriedade Command Line Arguments, insira ..\..\Test.txt. Clique em OK.

10. No menu Debug, clique em Start Without Debugging. Para criar e executar o Exemplo Indexers a partir da linha de comando 3. Para compilar o programa de exemplo, digite o seguinte no prompt de comando: csc indexer.cs O programa de Exemplo inverte os bytes em um arquivo fornecido como um argumento da linha de comando. Por exemplo, para reverter os bytes em Test.txt e ver o resultado, emitir os seguintes comandos: indexers Test.txt type Test.txt 4. Para alterar o arquivo revertido para Normal, execute o programa no mesmo arquivo novamente.

Indexado Exemplo propriedades


Download sample

Visual C# Consolidado

311

Este Exemplo mostra como classes C# podem declarar indexadas propriedades para representa uma coleo de tipos diferentes de itens semelhantes matriz-. Para obter mais informaes, consulte Propriedades (Guia de programao do C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo indexado propriedades no Visual Studio

No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc indexedproperty.cs indexedproperty

Para criar e executar o Exemplo indexado Propriedades a partir da linha de comando

Exemplo Conversions definidas pelo usurio


Download sample Este Exemplo mostra como definir converses de ou para classes ou estruturas, e como essas converses so usados. Consulte Operadores de converso (guia de programao C#) Para obter mais informaes. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. Clique em Download Sample.

Visual C# Consolidado

312

A File Download caixa de mensagem ser exibida. 5. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Conversions pelo usurio no Visual Studio 4. 5. 6. 5. 6. 7. 8. No Solution Explorer, clique com o projeto Conversion1 e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Conversion2. Use o Change Directory comando para alterar para o diretrio Conversion1. Digite o seguinte: csc conversion.cs conversion Use o Change Directory comando para alterar para o diretrio Conversion2. Digite o seguinte: csc structconversion.cs structconversion

Para criar e executar os exemplos Conversions pelo usurio a partir da linha de comando

Exemplo generics (C#)


Download sample (http://download.microsoft.com/download/9/A/6/9A639BEE-F7B0423D-BFFD-4356299205D8/Generics.zip.exe) Este Exemplo mostra como criar uma classe personalizada lista genrico com um parmetro nico tipo, e como implement IEnumerable<T> Para ativar foreach iterao atravs do contedo da lista. O Exemplo tambm mostra como cdigo de cliente cria uma instncia da classe, especificando um argumento Tipo, e como restries sobre o parmetro type ativar operaes adicionais a serem executadas sobre os argumentos Tipo. Para obter um Exemplo de uma classe a coleo genrica que implementa um bloco do iterador, consulte COMO: Criar um bloco iterador para uma lista genrica (Guia de programao C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. Clique em Download Sample.

Visual C# Consolidado

313

A File Download caixa de mensagem ser exibida. 5. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo Generics no Visual Studio

No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando: csc generics.cs generics

Para criar e executar o Exemplo Generics a partir da linha de comando

Comentrios Este Exemplo fornecido para fins de demonstrao e no se destina a ser usado sem modificaes no cdigo de produo. Para cdigo de qualidade de produo, ele recomendvel que voc usar as classes coleo no espao para nome System.Collections.Generic sempre que possvel.

Exemplo Overloading do operador


Download sample Este Exemplo demonstra classes definidas pelo usurio como poder sobrecarregar operadores. Consulte Operadores C# Para obter mais informaes. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish.

Visual C# Consolidado

314

Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Overloading operador no Visual Studio 4. 5. 6. 5. 6. 7. 8. No Solution Explorer, clique com o projeto complexo e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Dbbool. Use o Change Directory comando para alterar para o diretrio complexo. Digite o seguinte: csc complex.cs complex Use o Change Directory comando para alterar para o diretrio Dbbool. Digite o seguinte: csc dbbool.cs dbbool

Para criar e executar os exemplos operador Overloading a partir da linha de comando

Exemplo representantes
Download sample Este Exemplo demonstra os tipos de representante. Ele mostra como para mapear delegados para estticos e mtodos da instncia, e como combin-las para criar representantes de difuso seletiva. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos representantes no Visual Studio

Visual C# Consolidado

315

4. 5. 6. 5. 6. 7. 8.

No Solution Explorer, clique com o projeto Delegates1, e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Delegates2. Use o Change Directory comando para alterar para o diretrio Delegates1. Digite o seguinte: csc bookstore.cs bookstore Use o Change Directory comando para alterar para o diretrio Delegates2. Digite o seguinte: csc compose.cs compose

Para criar e executar os exemplos representantes a partir da linha de comando

Exemplo eventos
Download sample Este Exemplo mostra como a declarar, chamar, e configurar eventos em C#. Para obter mais informaes, consulte Eventos (Guia de programao do C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos eventos no Visual Studio 4. 5. 6. No Solution Explorer, clique com o projeto Events1, e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Events2.

Para criar e executar os exemplos eventos a partir da linha de comando

Visual C# Consolidado

316

5. 6. 7. 8.

Use o Change Directory comando para alterar para o diretrio Events1. Digite o seguinte: csc events1.cs events1 Use o Change Directory comando para alterar para o diretrio Events2. Digite o seguinte: csc events2.cs events2

Exemplo de implementao de interface explcita


Download sample Este Exemplo demonstra como explicitamente implementar membros de interface e como acessar esses participantes a partir de ocorrncias interface. Para informaes de plano de fundo, consulte Interfaces (guia de programao C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Explicit implementao interface no Visual Studio 4. 5. 6. 5. 6. 7. No Solution Explorer, clique com o projeto ExplicitInterface1 e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para ExplicitInterface2. Use o Change Directory comando para alterar para o diretrio ExplicitInterface1. Digite o seguinte: csc explicit1.cs explicit1 Use o Change Directory comando para alterar para o diretrio ExplicitInterface2.

Para criar e executar os exemplos Explicit implementao interface a partir da linha de comando

Visual C# Consolidado

317

8.

Digite o seguinte: csc explicit2.cs explicit2

Exemplo dos Mtodos condicional


Download sample Este Exemplo demonstra condicionais mtodos, que fornecem um poderoso mecanismo pelo qual chamadas para mtodos podem ser includos ou omitido dependendo se um smbolo definido. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo mtodos condicional no Visual Studio 7. 8. 9. No Solution Explorer, clique com o projeto e clique em Properties. Abra a pasta Propriedades de configurao, e clique em Debug. Defina a Command Line Arguments propriedade para A B C.

10. Na pasta Propriedades de configurao, clique em Build. 11. Modificar a Conditional Compilation Constants propriedade. Por exemplo, adicionar ou excluir Debug. Clique em OK. 12. No menu Debug, clique em Start Without Debugging. Para criar e executar o Exemplo mtodos condicional a partir da linha de comando

Para incluir o mtodo condicional, compilar e execute o programa de exemplo, digitando o seguinte no prompt de comando: csc CondMethod.cs tracetest.cs /d:DEBUG tracetest A B C

Exemplo de documentao XML


Download sample

Visual C# Consolidado

318

Este Exemplo mostra como usar XML ao documento cdigo. Consulte Comentrios de documentao XML (Guia de programao C#) Para obter informaes adicionais. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar o Exemplo documentao XML no Visual Studio 5. 6. 7. 8. No Solution Explorer, clique com o projeto e clique em Properties. Abra a pasta Propriedades de configurao e clique em Build. Defina a propriedade arquivo documentao XML como XMLsample.xml. No menu Build, clique em Build. O arquivo de sada XML poder ser no diretrio de depurao. Para gerar a documentao XML de exemplo, digite o seguinte no prompt de comando: csc XMLsample.cs /doc:XMLsample.xml 4. Para ver o XML gerado, emita o seguinte comando: type XMLsample.xml

Para criar o Exemplo documentao XML a partir da linha de comando 3.

Plataforma Invoke Exemplo


Download sample Este Exemplo demonstra como chamar plataforma chama (funes exportadas DLL) do C#. Consulte Interoperabilidade (guia de programao C#) Para obter mais informaes. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe

Visual C# Consolidado

319

que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Platform Invoke no Visual Studio 4. 5. 6. 7. 8. 9. No Solution Explorer, clique com o projeto PinvokeTest e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Marshal e PInvoke. Use o Change Directory comando para alterar para o diretrio PinvokeTest. Digite o seguinte: csc PinvokeTest.cs PinvokeTest Use o Change Directory comando para alterar para o diretrio Marshal. csc Marshal.cs Marshal 11. Use o Change Directory comando para alterar para o diretrio PInvoke. 12. Digite o seguinte: csc logfont.cs pinvoke.cs pinvoke 10. Digite o seguinte:

Para criar e executar os exemplos Platform Invoke a partir da linha de comando

Exemplo parte 1 Interop COM


Download sample Este Exemplo demonstra como um programa C# pode interoperar com um componente COM no gerenciado. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o

Visual C# Consolidado

320

cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos com Interop parte 1 no Visual Studio 8. 9. No Solution Explorer, clique com o projeto Interop1, e clique em Set as StartUp Project. No Solution Explorer, clique com o projeto Interop1, e clique em Properties.

10. Abra a Configuration Properties pasta, e clique em Debug. 11. Na propriedade argumentos de linha de comando, digite um arquivo AVI como c:\winnt\clock.avi. 12. Clique em OK. 13. No menu Debug, clique em Start Without Debugging. 14. Repita as etapas anteriores para Interop2. Se o QuartzTypeLib.dll includo com Interop1 est desatualizado 7. 8. 9. No Solution Explorer, abrir References para Interop1. Clique com o boto direito do mouse QuartzTypeLib e, clique em Remove. Clique com o boto direito do mouse References e, clique em Add Reference.

10. Na guia COM, selecione o componente denominado, " biblioteca Tipo de Controle ActiveMovie ". 11. Clique em Select e, clique em OK. 12. Recrie Interop1. Observao Adicionando uma referncia para o componente faz a mesma coisa que chamar TLBIMP na linha de comando para criar QuartzTypeLib.dll (como mostrado abaixo). Para criar e executar os exemplos com Interop Parte 1 a partir da linha de comando 5. Use o Change Directory comando para alterar para o diretrio Interop1.

Visual C# Consolidado

321

6.

Digite o seguinte: tlbimp %windir%\system32\quartz.dll /out:QuartzTypeLib.dll csc /r:QuartzTypeLib.dll interop1.cs interop1 %windir%\clock.avi

7. 8.

Use o Change Directory comando para alterar para o diretrio Interop2. Digite o seguinte: csc interop2.cs interop2 %windir%\clock.avi

Exemplo parte 2 Interop COM


Download sample Este Exemplo demonstra usando um servidor C# com um cliente com C++. Observao preciso instalar para compilar Este Exemplo Visual C++.

Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo 2 Part Interop COM no Visual Studio 6. 7. 8. 9. No Solution Explorer, clique com o projeto COMClient, e clique em Properties. Abra a Configuration Properties pasta, e clique em Debug. Na propriedade Command Line Arguments, digite um nome. Clique em OK.

10. No menu Debug, clique em Start Without Debugging.

Visual C# Consolidado

322

Para criar e executar o Exemplo 2 Part Interop COM a partir da linha de comando 6. 7. 8. 9. Use o Change Directory comando para alterar para o diretrio COMInteropPart2\COMClient. Copie o cdigo do servidor C# para o diretrio COMClient: copy ..\CSharpServer\CSharpServer.cs Compilar o servidor: csc /target:library CSharpServer.cs regasm CSharpServer.dll /tlb:CSharpServer.tlb Compilar o cliente (verifique se as variveis Caminho e ambiente so definidas corretamente com vcvars32.bat):: cl COMClient.cpp 10. Execute o cliente: COMClient friend

Exemplo atributos
Download sample Este Exemplo demonstra como criar classes de atributo personalizado, us-los em cdigo, e consult-los atravs de reflexo. Para obter mais informaes sobre atributos, consulte Atributos (guia de programao C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo atributos no Visual Studio

No menu Debug, clique em Start Without Debugging. Digite o seguinte no prompt de comando:

Para criar e executar o Exemplo atributos a partir da linha de comando

Visual C# Consolidado

323

csc AttributesTutorial.cs AttributesTutorial

Exemplo de segurana
Download sample Este Exemplo demonstra como modificar as permisses de segurana atravs de classes de permisso e atributos de permisso. Para obter informaes adicionais, consulte Segurana (guia de programao C#). Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos de segurana no Visual Studio 4. 5. 6. 7. 8. 9. No Solution Explorer, clique com o projeto Security1 e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para Security2 e Security3. Use o Change Directory comando para alterar para o diretrio Security1. Digite o seguinte: csc ImperativeSecurity.cs ImperativeSecurity Use o Change Directory comando para alterar para o diretrio Security2. csc DeclarativeSecurity.cs DeclarativeSecurity 11. Use o Change Directory comando para alterar para o diretrio Security3. 12. Digite o seguinte: csc SuppressSecurity.cs SuppressSecurity 10. Digite o seguinte:

Para criar e executar os exemplos de segurana a partir da linha de comando

Visual C# Consolidado

324

Segmentao de Exemplo
Download sample Este Exemplo demonstra as seguintes tcnicas segmentao. Consulte Segmentao (guia de programao C#) Para obter mais informaes.

Criar, iniciar, e Finalizando um segmento Usando um pool de segmentos Segmento Sincronizao e interao Observao de segurana

Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos Threading no Visual Studio 4. 5. 6. 5. 6. 7. 8. No Solution Explorer, clique com o projeto ThreadStartStop e clique em Set as StartUp Project. No menu Debug, clique em Start Without Debugging. Repita as etapas anteriores para ThreadPool, e ThreadSync. Use o Change Directory comando para alterar para o diretrio segmentos. Digite o seguinte: cd ThreadStartStop csc ThreadStartStop.cs ThreadStartStop Digite o seguinte: cd ..\ThreadPool csc ThreadPool.cs ThreadPool Digite o seguinte: cd ..\ThreadSync csc ThreadSync.cs ThreadSync

Para criar e executar os exemplos Threading a partir da linha de comando

Visual C# Consolidado

325

Exemplo de cdigo no seguros


Download sample Este Exemplo demonstra como usar cdigo no gerenciado (cdigo usando ponteiros) no C#. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar os exemplos UNSAFE cdigo no Visual Studio 11. No Solution Explorer, clique com o projeto FastCopy, e clique em Set as StartUp Project. 12. No menu Debug, clique em Start Without Debugging. 13. No Solution Explorer, clique com o projeto ReadFile, e clique em Set as StartUp Project. 14. No Solution Explorer, clique com o projeto ReadFile, e clique em Properties. 15. Abra a pasta Propriedades de configurao, e clique em Debug. 16. Na propriedade argumentos da linha de comando, insira ..\..\ReadFile.cs. 17. Clique em OK. 18. No menu Debug, clique em Start Without Debugging. 19. No Solution Explorer, clique com o projeto PrintVersion, e clique em Set as StartUp Project. 20. No menu Debug, clique em Start Without Debugging. Para criar e executar os exemplos de cdigo UNSAFE a partir da linha de comando 5. 6. Use o Change Directory comando para alterar para o diretrio UNSAFE. Digite o seguinte: cd FastCopy csc FastCopy.cs /unsafe FastCopy

Visual C# Consolidado

326

7. 8.

Digite o seguinte: cd ..\ReadFile csc ReadFile.cs /unsafe ReadFile ReadFile.cs Digite o seguinte: cd ..\PrintVersion csc PrintVersion.cs /unsafe PrintVersion

Exemplo BD OLE
Download sample Este Exemplo demonstra como usar um banco de dados do Microsoft Access do C#. Ele mostra como voc pode criar um DataSet e adicionar tabelas a ela a partir de um banco de dados. O banco de dados BugTypes.MDB usado no programa de Exemplo um arquivo.mdb do Microsoft Access 2000. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo de banco de dados OLE no Visual Studio

No menu Debug, clique em Start Without Debugging. Observao

Se voc estiver criando a soluo no modo Release, copie BugTypes.mdb para a pasta \bin\release. Para criar e executar o Exemplo OLE DB a partir da linha de comando

Digite o seguinte no prompt de comando: csc oledbsample.cs oledbsample

Visual C# Consolidado

327

Produzir Exemplo
Download sample Este Exemplo mostra como criar uma classe lista que implementa IEnumerable<int> e palavra-chave yield Para ativar foreach iterao atravs do contedo da lista. Duas propriedades so definidas, um retornar os nmeros mpares, o outro retornar os nmeros pares. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo YIELD cdigo no Visual Studio

No menu Debug, clique em Start Without Debugging. 3. 4. Use o Change Directory (cd) comando para alterar para o Yield Diretrio. Digite o seguinte: csc Yield.cs Yield

Para criar e executar o Exemplo YIELD cdigo a partir da linha de comando

Annimo Exemplo representantes


Download sample Este Exemplo demonstra usar um representante annimo para calcular um bnus do salrio de um funcionrio. Usar um representante annimo simplifica o programa porque no necessrio para definir um mtodo separado. Os dados para cada funcionrio so armazenados em um objeto que contm detalhes pessoais, bem como um representante que referencia o algoritmo necessrio para calcular o bnus. Definindo o algoritmo por meio de um representante, o mesmo mtodo pode ser usado para executar o clculo do bnus, independentemente de como ele realmente calculado. De anotao, uma varivel local, multiplicador, tambm se torna uma varivel externo capturado porque ele mencionado em um clculo delegado.

Visual C# Consolidado

328

Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo de cdigo AnonymousDelegates no Visual Studio

No menu Debug, clique em Start Without Debugging. 3. 4. Use o Change Directory (cd) comando para alterar para o diretrio AnonymousDelegates. Digite o seguinte: csc AnonymousDelegates.cs AnonymousDelegates

Para criar e executar o Exemplo de cdigo AnonymousDelegates a partir da linha de comando

Exemplo tipos parcial


Download sample Este Exemplo demonstra o uso de tipos parciais que permitem class ou struct para ser definidos em dois ou mais arquivos C#. Isso permite que vrios programadores para trabalhar em partes diferentes de uma classe em paralela, e para aspectos diferentes de uma classe complexo a serem mantidos em arquivos separados. Observao de segurana Este cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. Clique em Download Sample.

Visual C# Consolidado

329

A File Download caixa de mensagem ser exibida. 5. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo de cdigo PartialTypes no Visual Studio

No menu Debug, clique em Start Without Debugging. 3. 4. Use o Change Directory (cd) comando para alterar para o PartialTypes Diretrio. Digite o seguinte: csc PartialTypes.cs PartialTypes

Para criar e executar o Exemplo de cdigo PartialTypes a partir da linha de comando

Exemplo anulvel
Download sample Este Exemplo demonstra o uso de tipos anulveis. Esse recurso permite que tipos de valores para que um estado no inicializada, ou vazio, semelhante a como tipos de referncia podem ser definidos como null. Este Observao de segurana cdigo de Exemplo fornecido para ilustrar um conceito e no deve ser usado em aplicativos ou sites da Web, como no-pode ilustrar as prticas de codificao mais segura. Microsoft supe que nenhum RESPONSABILIDADE POR DANOS INCIDENTAIS OU CONSEQENCIAIS o cdigo do Exemplo deve ser usado para fins diferente da maneira desejada Para abrir o arquivo de Exemplo no Solution Explorer 4. 5. Clique em Download Sample. A File Download caixa de mensagem ser exibida. Clique em Open e, na coluna esquerda da janela pasta CEP, clique em Extract all files. O Extraction Wizard abre. 6. Clique em Next. Voc pode mudar a pasta que os arquivos sero extrados para, e clique em Next novamente. Certifique-se de que a Show extracted files caixa de seleo est selecionada e clique em Finish. Clique duas vezes o Exemplo na Arquivo.sln. A soluo de Exemplo exibida no Solution Explorer. Voc pode receber um aviso de segurana que diz o local de soluo no confivel. Clique OK para continuar. Para criar e executar o Exemplo Nullable cdigo no Visual Studio

Visual C# Consolidado

330

3. 4. 3. 4.

Abra Nullable.sln, o arquivo de soluo, o clicando duas vezes no arquivo no Windows Explorer, ou clicando Open no menu File. No menu Debug, clique em Start Without Debugging. Use o Change Directory (cd) comando para alterar para o diretrio Nullable. Digite o seguinte: csc Nullable.cs Nullable

Para criar e executar o Exemplo de cdigo Nullable a partir da linha de comando

Visual C# Consolidado

331

Como Fazer em C#
http://msdnwiki.microsoft.com/pt-br/mtpswiki/ms186211.aspx
Como Fazer sua porta de entrada para tpicos-chave baseados em tarefas sobre programao e desenvolvimento de aplicativos em C#. As categorias essenciais sobre o que voc pode fazer com C# esto listadas neste tpico. Os links fornecem referncias para pginas de ajuda importantes baseadas em procedimento. A Linguagem C# Especificao da Linguagem C# ... Threading Genricos... Trechos de Cdigo Exemplos mais O Framework .NET Entrada e Sada em Arquivos Strings Colees Serializao Componentes Mdulos (assemblies) e Domnios de Aplicativo mais Aplicativos do Windows Criando Aplicativos do Windows ControlesWindows Forms Desenhando mais Pginas Web e Web Services Pages Web do ASP.NET XML Web Services mais Depurao Usando o Depurador VS Classe Trace .Framework NET Depurao de Transaes SQL mais Accesso a Dados Conectando a Fontes de Dados O SQL Server... Vinculao de Dados mais Criando Classes Class Designer... Trabalhando com Classes e Outros Tipos... Criando e Modificando Membros-tipo... Linhas-mestras para a Criao de Bibliotecas de Classes mais Segurana Segurana no Acesso ao Cdigo Prticas Recomendadas de Poltica de Segurana Conjuntos de Permisses mais Programao do Office Programao do Office Controles Word Excel mais Dispositivos Inteligentes

Visual C# Consolidado

332

O que h de novo em Projetos para Dispositivos Inteligentes... Programao para Dispositivos Inteligentes... Depurao em Dispositivos Inteligentes... mais Implantao ClickOnce O Windows Installer

Visual C# Consolidado

333

Linguagem C# (como eu fao em C#)


Esta pgina possui links para ajud-lo com tarefas frequentemente executadas na linguagem C#. Para ver outras categorias de tarefas populares abordadas na ajuda, consulte Como eu fao em C#. A linguagem C# O que h de novo na linguagem e no compilador C# 2.0 Contm informaes sobre os novos recursos, incluindo classes genricas, iteradores, mtodos annimos e tipos parciais. Usando o Starter Kit para C# Explica como carregar e compilar um Starter Kit no Visual C#. Especificao da linguagem C# Ponteiros para a verso mais recente da especificao em formato Microsoft Word. Linha de comando Main() e argumentos de linha de comando (Guia de programao C#) Explica o mtodo Main, o ponto de entrada do seu programa, onde voc cria objetos e chama outros mtodos. S pode haver um ponto de entrada em um programa C#. COMO: Acessar argumentos de linha de comando usando foreach (Guia de programao C#) Fornece um exemplo de cdigo que mostra como acessar os parmetros da linha de comando. COMO: Exibir argumentos de linha de comando (Guia de programao C#) Explica como exibir argumentos de linha de comando atravs do vetor de seqncias args. Main() retorna valores (Guia de programao C#) Explica os possveis valores retornados pelo mtodo principal. Classes e herana Base (Referncia C#) Explica como especificar o construtor da classe base chamado ao criar instncias de uma classe derivada. COMO: Saber as diferenas entre passar uma estrutura e passar uma referncia de classe para um mtodo (Guia de programao C#) Contm um exemplo de cdigo que mostra que quando uma estrutura (struct) passada para um mtodo, uma cpia da estrutura passada, mas quando uma instncia de classe passada, uma referncia passada.

Visual C# Consolidado

334

Construtores de instncia (Guia de programao C#) Explica construtores de classe e herana. Propriedades COMO: Declarar e usar propriedades de leitura/escrita (Guia de programao C#) Contm um exemplo que mostra como declarar e usar propriedades de leitura/escrita. COMO: Definir propriedades abstratas (Guia de programao C#) Contm um exemplo de cdigo que mostra como definir propriedades abstratas. Eventos COMO: Criar um controle que responde a eventos (Guia de programao C#) Contm um exemplo de cdigo que mostra uma classe, ListWithChangedEvent, que semelhante classe padro ArrayList mas tambm chama um evento Changed sempre que o contedo da lista alterado. COMO: Criar eventos que estejam de acordo com as diretrizes do .NET Framework (Guia de programao C#) Contm um exemplo que cria um controle que responde a eventos, seguindo as orientaes das .NET Framework Guidelines. COMO: Declarar um evento em uma interface e implement-lo em uma classe (Guia de programao C#) Mostra que possvel declarar um evento em uma interface e implement-lo em uma classe. COMO: Usar um dicionrio para armazenar instncias de eventos (Guia de programao C#) Explica como usar uma tabela de hash para armazenar as instncias de eventos. COMO: Implementar duas interfaces que possuam um evento com o mesmo nome (Guia de programao C#) Explica a situao onde voc implementa duas interfaces, cada uma com um evento com o mesmo nome. Nesse caso, voc deve usar uma propriedade de evento explicitamente de implementao. COMO: Criar manipuladores de evento no Visual C# Code Editor (Guia de programao C#) Oferece uma maneira fcil para criar manipuladores de eventos para seus Windows Forms quando no modo de design. A alternativa exibir o cdigo fonte no modo de exibio Source e adicionar o manipulador de eventos no cdigo. Interfaces COMO: Implementar explicitamente membros de uma interface (Guia de programao C#) Mostra como declarar uma classe que explicitamente implementa uma interface e como acessar seus membros atravs da instncia da interface.

Visual C# Consolidado

335

COMO: Implementar explicitamente membros de uma interface com herana (Guia de programao C#) Fornece um exemplo que exibe as dimenses de uma caixa em unidades mtrica e do sistema ingls. Classes Genricas Uma introduo ao Generics C# Descreve como classes genricas permitem que voc defina classes de coleo que so fortemente tipadas (Type-Safe). Voc implementa a classe genrica somente uma vez, mas voc pode declar-la e us-la com qualquer tipo. Classes genricas no .NET Framework Explica os recursos e o uso do novo conjunto de colees genricas no espao de nomes System.Collections.Generic. A palavra-chave default em cdigo fonte "genrico" (Guia de programao C#) Fornece um exemplo de cdigo que demonstra como usar a palavra-chave default para tipo parmetros. Mtodos genricos (Guia de programao C#) Apresenta a sintaxe para declarar um mtodo genrico. E tambm mostra um exemplo de como usar mtodos genricos em um aplicativo. Restries em parmetros de tipo (Guia de programao C#) Mostra como restringir parmetros de tipo para permitir o acesso a mtodos e propriedades dos tipos usados para instanciar a classe genrica. Representantes genricos (Guia de programao C#) Contm a sintaxe para declarar representantes (delegates) genricos. E tambm inclui comentrios importantes sobre como instanciar e usar representantes genricos, assim como exemplos de cdigo. Espaos de nomes COMO: Usar o qualificador de espao de nomes Alias (Guia de programao C#) Discute a capacidade de acessar um membro no espao de nomes global quando o membro pode estar oculto por outra entidade com o mesmo nome. Iteradores COMO: Criar um bloco iterador para uma lista genrica (Guia de programao C#) Fornece um exemplo onde um vetor de inteiros usado para criar a lista SampleCollection. Um lao for itera atravs da coleo e produz o valor de cada item. Depois um lao foreach usado para exibir os itens da coleo. COMO: Criar um bloco iterador para uma lista genrica (Guia de programao C#)

Visual C# Consolidado

336

Fornece um exemplo onde uma classe genrica Stack<T> implementa uma interface genrica IEnumerator<T>. Um vetor de T tipo declarado e a ele so atribudos valores usando o mtodo Push. No mtodo GetEnumerator, os valores do vetor so retornados usando a instruo de retorno yield. Representantes (Delegates) COMO: Combinar representantes (Representantes Multicast) (Guia de programao C#) Fornece um exemplo que demonstra como compor representantes de difuso seletiva. COMO: Declarar, instanciar e usar um representante (Guia de programao C#) Fornece um exemplo que ilustra como declarar, criar e usar um representate (delegate). Sobrecarga de operador COMO: Usar sobrecarga de operador para criar uma classe para nmeros complexos (Guia de programao C#) Mostra como voc pode utilizar sobrecarga de operador para criar uma classe para nmeros complexos chamada Complex e que define adio de complexos. Interoperabilidade COMO: Usar interoperabilidade COM para verificar ortografia usando o Word (Guia de programao C#) Este exemplo ilustra como usar o verificador ortogrfico do Word em um aplicativo C#. COMO: Usar interoperabilidade COM para criar uma planilha do Excel (Guia de programao C#) Este exemplo ilustra como abrir uma planilha j existente do Excel em C# usando funcionalidades de interoperabilidade COM no .NET Framework. COMO: Usar cdigo gerenciado como um suplemento de automao para o Excel (Guia de programao C#) Este exemplo ilustra como criar um suplemento C# para calcular taxa de imposto de renda em uma clula em uma planilha do Excel. COMO: Usar servios de chamada da plataforma para reproduzir um arquivo WAVE (Guia de programao C#) Este exemplo ilustra como usar servios de chamada da plataforma para reproduzir um arquivo de som wave na plataforma Windows. Cdigo no gerenciado COMO: Usar ponteiros para copiar um vetor de bytes (Guia de programao C#) Mostra como usar ponteiros para copiar bytes de um vetor para outro, usando ponteiros. COMO: Usar a funo ReadFile do Windows (Guia de programao C#) Mostra como chamar a funo ReadFile do Windows, que requer o uso de um contexto no gerenciado pois o buffer de leitura requer um ponteiro como parmetro.

Visual C# Consolidado

337

Lidando com threads Usando segmentos e Threading Fornece uma lista de tpicos que abordam a criao e o gerenciamento de threads gerenciados e como evitar conseqncias no intencionais. COMO: Criar e terminar threads (Guia de programao C#) Fornece um exemplo que demonstra como criar e iniciar uma thread e mostra a interao entre duas threads em execuo simultnea dentro do mesmo processo. COMO: Sincronizar uma thread Produtor e uma thread Consumidor (Guia de programao C#) Fornece um exemplo que mostra como sincronizao pode ser feita usando a palavrachave lock de C# e o mtodo Pulse do objeto Monitor. COMO: Usar um pool de threads (Guia de programao C#) Explica um exemplo que mostra como usar um pool de threads. Seqncias de caracteres COMO: Pesquisar em seqncias de caracteres utilizando expresses regulares (Guia de programao C#) Explica como a classe Regex pode ser usada para procurar em seqncias. Essas pesquisas podem variar em complexidade de muito simples a fazer uso total de expresses regulares. COMO: Unir vrias seqncias de caracteres (Guia de programao C#) Contm um exemplo que demonstra como unir vrias seqncias de caracteres. COMO: Pesquisar em seqncias de caracteres utilizando mtodos de String (Guia de programao C#) Contm um exemplo de cdigo que demonstra como usar mtodos de String para procurar em uma seqncia. COMO: Analisar seqncias usando o mtodo Split (Guia de programao C#) Contm um exemplo de cdigo que demonstra como uma seqncia pode ser analisada usando o mtodo System.String.Split. Atributos COMO: Criar uma unio C/C++ usando atributos (Guia de programao C#) Contm um exemplo que usa o atributo serializable para aplicar uma caracterstica especfica a uma classe. Trabalhando com DLLs COMO: Criar e usar DLLs em C# (Guia de programao C#) Demonstra a criao e o uso de uma DLL, usando um cenrio de exemplo.

Visual C# Consolidado

338

Mdulos (assemblies) COMO: Determinar se um arquivo um mdulo (assembly) (Guia de programao C#) Contm um exemplo que testa uma DLL para verificar se ela um mdulo (assembly). COMO: Carregar e descarregar mdulos (assemblies) (Guia de programao C#) Explica como possvel carregar mdulos (assemblies) especficos no domnio de aplicao atual em tempo de execuo. COMO: Compartilhar um mdulo (assembly) com outros aplicativos (Guia de programao C#) Explica como compartilhar um assembly com outros aplicativos. Domnios de aplicao Executar cdigo em outro domnio de aplicao (Guia de programao C#) Mostra como executar um assembly que tenha sido carregado de outro domnio de aplicao. COMO: Criar e usar um domnio de aplicao (Guia de programao C#) Mostra como a sobrecarga de operador pode ser usada para implementar um tipo lgico tri-valorado. Amostras Exemplos no Visual C# Contm links para abrir ou copiar arquivos dos exemplos que vo de Exemplo de Hello World at Exemplo de classes genricas (C#).

Visual C# Consolidado

339

O que h de novo na C# 2.0 idioma e Compiler


Com o lanamento do Visual Studio 2005, a linguagem C# foi atualizada para verso 2.0, que oferece suporte os seguintes recursos novos: O compilador C# apresenta os seguintes adies e alteraes para esta verso: Opo /errorreport Pode ser usado para relatar erros de compilador interno Microsoft atravs da Internet. Opo /incremental Foi removido. e /keycontainer/KeyFile Opes Oferecer suporte especificao chaves criptogrficas. Opo /langversion Pode ser usado para especificar compatibilidade com uma verso especfica do idioma. Opo /linkresource Contm opes adicionais. Opo /moduleassemblyname Permite que voc se criar um.netmodule tipos de arquivo e acesso no-pblicos em um conjunto existente. Opo /PDB Especifica o nome e local do arquivo.pdb. Opo /Platform Permite que voc para arquiteturas Family (IPF) Itanium e x 64 de destino. Aviso # pragma Usado para desativar e ativar individuais avisos no cdigo.

Usando Starter Kits C#


Um Starter Kit um aplicativo completo e independente pronto para voc carregar e compilar. Um Starter Kit vem com sua prpria documentao, incluindo descries de tcnicas de programao, e sugestes para como ele pode ser personalizado. Starter Kit uma maneira excelente de ver um aplicativo C# que funciona em ao. Para carregar e compilar um Starter Kit Visual C# 1. No menu File, clique em New Project.

Visual C# Consolidado

340

A caixa de dilogo New Project ser exibida. Esta caixa de dilogo lista os diferentes tipos de aplicativos padro que Visual C# pode criar. 2. 3. Selecione um tipo de aplicativo Starter Kit, e clique em OK. O Starter Kit carregado no Visual C#. Para compilar e iniciar o projeto Starter Kit, pressione F5.

Especificao da Linguagem C#
As verses 1.2 e 2.0 das especificaes da linguagem C# so a fonte autorizada de gramtica e sintaxe C#. Elas contm informaes detalhadas sobre todos os aspectos da linguagem, incluindo muitos pontos no abordados na documentao do produto Visual C#. A especificao 1.2 discute recursos que foram adicionados para a linguagem antes do Visual C# 2005 e a especificao 2.0 discute recursos que foram adicionados para o Visual C# 2005. As especificaes da linguagem C# esto disponveis no formato Microsoft Word nos seguintes locais:

No MSDN Online em http://msdn.microsoft.com/vcsharp/Programming/Language/default.aspx No Visual Studio, na pasta VC#\Specifications\1033\ sob o diretrio de instalao do seu Microsoft Visual Studio 2005 .

Se voc no tiver o Microsoft Word instalado em seu computador, voc pode visualizar, copiar e imprimir a verso do Word da especificao com o gratuito Palavra visualizador 2003. A especificao da linguagem C# tambm est disponvel como um livro publicado pelo Addison Wesley.

Main() e argumentos de linha de comando (Guia de programao C#)


O mtodo Main o ponto de entrada do seu programa, onde voc cria objetos e chama outros mtodos. S pode haver um nico ponto de entrada em um programa C#. CSharp
class TestClass { static void Main(string[] args) { // Display the number of command line arguments: System.Console.WriteLine(args.Length); } }

Viso Geral

O Main mtodo o ponto de entrada do seu programa, onde o controle de execuo do programa inicia e termina. Ele declarado dentro de uma classe ou estrutura. Ele deve ser esttico (static) e ele no deve ser pblico. (No exemplo acima, como no especificamos um modificador de acesso explicitamente, ele recebe o modificador de acesso padro, que (private) particular). Ou ele pode retornar void ou ento um tipo int. O mtodo Main pode ser declarado com ou sem parmetros. Parmetros podem ser lidos como argumentos de linha de comando indexados a partir do zero. Diferentemente C e C++, o nome do programa no tratado como o primeiro argumento de linha de comando.

Visual C# Consolidado

341

COMO: Acessar argumentos de linha de comando usando foreach (Guia de programao C#)
Outra abordagem para Iterando atravs da matriz a usar a foreach instruo conforme mostrado no exemplo. A foreach instruo pode ser usada para iterar por uma matriz, uma classe Coleo .NET Framework, ou qualquer classe ou estrutura que implementa a IEnumerable interface. Exemplo Este exemplo demonstra como imprimi-los os argumentos de linha de comando usando foreach. C#
// arguments: John Paul Mary

C#
class CommandLine2 { static void Main(string[] args) { System.Console.WriteLine("Number of command line parameters = {0}", args.Length); foreach (string s in args) { System.Console.WriteLine(s); } } }

Sada
Number of command line parameters = 3 John Paul Mary

COMO: Exibir argumentos de linha de comando (Guia de programao C#)


Argumentos fornecidos para um executvel na linha de comando so acessveis atravs um parmetro opcional para Main. Os argumentos so fornecidos na forma de uma matriz de seqncias. Cada elemento da matriz contm um argumento. Espao White-entre argumentos removido. Por exemplo, considere essas invocaes de linha de comando de um executvel fictcia: Entrada na linha de comando executable.exe a b c Matriz de seqncias de caracteres passado para principal "a" "b" "c" " um " " dois "

executable.exe one two

executable.exe one two three " dois " um " trs " Exemplo Este exemplo exibe os argumentos de linha de comando passados para um aplicativo de linha de comando. O resultado mostrado para a primeira entrada na tabela acima. C#
class CommandLine { static void Main(string[] args) { // The Length property provides the number of array elements System.Console.WriteLine("parameter count = {0}", args.Length); for (int i = 0; i < args.Length; i++) { System.Console.WriteLine("Arg[{0}] = [{1}]", i, args[i]); } } }

Sada
parameter count = 3 Arg[0] = [a] Arg[1] = [b] Arg[2] = [c]

Visual C# Consolidado

342

Main() retorna valores (Guia de programao C#)


O Main mtodo pode ser do tipo void: C#
static void Main() { //... }

Ele tambm pode retornar um int: C#


static int Main() { //... return 0; }

Se o valor de retorno da Main no deve ser usado, seguida, retornar void permite que cdigo ligeiramente mais simples. No entanto, retornar um inteiro permite que o programa para relacionar informaes de status para outros programas ou scripts que chamar o executvel. Um exemplo de usar o valor de retorno da Main mostrado no exemplo a seguir. Exemplo Um arquivo em lotes, neste exemplo usado para executar um programa e testar o valor a Main funo de retorno. Quando um programa executado no Windows, qualquer valor retornado da Main funo armazenado em uma varivel de ambiente chamada ERRORLEVEL. Ao inspecionar a ERRORLEVEL varivel, arquivos em lotes portanto podem determinar o resultado da execuo. Tradicionalmente, um valor de retorno de zero indica execuo com xito. Abaixo um programa muito simples que retorna zero da funo Main. C#
class MainReturnValTest { static int Main() { //... return 0; } }

Como este exemplo usa um arquivo em lotes, melhor para compilar esse cdigo a partir da linha de comando, conforme demonstrado no Como construir a partir da linha de comando:. Em seguida, um arquivo em lotes usado para chamar o executvel resultante do exemplo de cdigo anterior. Porque o cdigo retorna zero, o arquivo em lotes ir reportar xito, mas se o cdigo anterior alterado para retornar um valor diferente de zero, e ento re-Compiled, subseqente execuo do arquivo em lotes indicar falha.
rem test.bat @echo off MainReturnValueTest @if "%ERRORLEVEL%" == "0" goto good :fail echo Execution Failed echo return value = %ERRORLEVEL% goto end :good echo Execution Succeded echo return value = %ERRORLEVEL% goto end :end

Sada de exemplo
Execution Succeded return value = 0

base (Referncia do C#)


Palavra-chave base usada para acessar membros da classe base em uma classe derivada de:

Chamar um mtodo na classe base que tenha sido substitudo por outro mtodo.

Visual C# Consolidado

343

Especificar o construtor de classe base deve ser chamado ao criar instncias da classe derivada.

Um acesso classe base permitido somente em um construtor, um mtodo da instncia, ou um assessor propriedade da instncia. Ele um erro para usar a base palavra de dentro de um mtodo esttico. Exemplo Neste exemplo, dois a classe base, Person,. e a classe, Employee, tem um mtodo chamado Getinfo derivado Usando a base palavra-chave, possvel para chamar o Getinfo mtodo na classe base, de dentro da classe derivada.
// keywords_base.cs // Accessing base class members using System; public class Person { protected string ssn = "444-55-6666"; protected string name = "John L. Malgraine"; public virtual void GetInfo() { Console.WriteLine("Name: {0}", name); Console.WriteLine("SSN: {0}", ssn); } } class Employee : Person { public string id = "ABC567EFG"; public override void GetInfo() { // Calling the base class GetInfo method: base.GetInfo(); Console.WriteLine("Employee ID: {0}", id); } } class TestClass { static void Main() { Employee E = new Employee(); E.GetInfo(); } }

Este exemplo mostra como para especificar o construtor de classe base chamado quando criar instncias de uma classe derivada.
// keywords_base2.cs using System; public class BaseClass { int num; public BaseClass() { Console.WriteLine("in BaseClass()"); } public BaseClass(int i) { num = i; Console.WriteLine("in BaseClass(int i)"); } public int GetNum() { return num; } } public class DerivedClass : BaseClass { // This constructor will call BaseClass.BaseClass() public DerivedClass() : base() { } // This constructor will call BaseClass.BaseClass(int i) public DerivedClass(int i) : base(i) { } static void Main() { DerivedClass md = new DerivedClass(); DerivedClass md1 = new DerivedClass(1); } }

Sada
Name: John L. Malgraine SSN: 444-55-6666 Employee ID: ABC567EFG

Para obter exemplos adicionais, consulte Novo, virtual. e Substituir Sada


in BaseClass() in BaseClass(int i)

Especificao da Linguagem C# Para obter mais informaes, consulte as sees a seguir no Especificao da Linguagem C#:

Classes base 1.6.3 Acesso 7.5.8 base

COMO: Saber as diferenas entre passar uma estrutura e passar uma referncia de classe para um mtodo (Guia de programao C#) Este exemplo mostra que Quando. passado para um mtodo, uma cpia da estrutura passada, mas quando uma Classe instncia passada, uma referncia passada um struct

Visual C# Consolidado

344

A sada do exemplo a seguir mostra que somente o valor do campo de classe alterado quando a instncia de classe passada para o ClassTaker mtodo. O campo struct, no entanto, no altera, passando sua instncia para o StructTaker mtodo. Isso ocorre porque uma cpia da estrutura passada para o StructTaker mtodo, enquanto uma referncia para a classe passada para o ClassTaker mtodo. Exemplo C#
class TheClass { public string willIChange; } struct TheStruct { public string willIChange; } class TestClassAndStruct { static void ClassTaker(TheClass c) { c.willIChange = "Changed"; } static void StructTaker(TheStruct s) { s.willIChange = "Changed"; } static void Main() { TheClass testClass = new TheClass(); TheStruct testStruct = new TheStruct(); testClass.willIChange = "Not Changed"; testStruct.willIChange = "Not Changed"; ClassTaker(testClass); StructTaker(testStruct); System.Console.WriteLine("Class field = {0}", testClass.willIChange); System.Console.WriteLine("Struct field = {0}", testStruct.willIChange); } }

Sada
Class field = Changed Struct field = Not Changed

Construtores de instncia (Guia de programao C#)


Construtores Instncia so usados para criar e inicializar instncias. O construtor de classe invocado quando voc criar um novo objeto, por exemplo: C#
class CoOrds { public int x, y; // constructor public CoOrds() { x = 0; y = 0; } }

Observao Para maior clareza, essa classe contm membros de dados pblica. Essa uma prtica de programao no recomendada porque ela permite que qualquer mtodo em qualquer lugar em um programa irrestrito e unverified acesso ao funcionamento interno do objeto. Membros de dados geralmente deve ser particular, e devem ser acessados apenas por classe mtodos e propriedades. Esse construtor chamada sempre que um objeto baseado na classe CoOrds criado. Um construtor como esta ocorrncia, que tem sem argumentos, chamada um construtor padro. No entanto, geralmente til para fornecer construtores adicionais. Por exemplo, que pode adicionar um construtor para a CoOrds classe que permite que ns para especificar os valores iniciais para os membros de dados: C#
// A constructor with two arguments: public CoOrds(int x, int y) { this.x = x; this.y = y; }

Isso permite CoOrd objetos a ser criado com padro ou especficos valores iniciais, como este: C#
CoOrds p1 = new CoOrds(); CoOrds p2 = new CoOrds(5, 3);

Visual C# Consolidado

345

Se uma classe no tem um construtor padro, um gerado automaticamente e valores padro sero usados para inicializar os campos de objeto, por exemplo, inicializada com 0. um Int Para obter mais informaes sobre valores padro, consulte Tabela de valores padro (referncia C#). Portanto, porque o CoOrds Construtor padro de classe inicializa todos os membros de dados como zero, ele pode ser removido totalmente sem alterar como a classe funciona. Um exemplo completo usando vrios construtores fornecido no Exemplo 1 posteriormente contidas neste tpico, e um exemplo de um construtor gerado automaticamente fornecido no Exemplo 2. Construtores instncia podem ser usados para chamar as construtores da instncia de classes base. O construtor de classe pode chamar o construtor da classe base atravs do Inicializador, da seguinte maneira: C#
class Circle : Shape { public Circle(double radius) : base(radius, 0) { } }

Neste exemplo, os Circle valores passagens de classe representando raio e altura para o construtor fornecidos por Shape do que Circle derivado. A concluir exemplo usando Shape e Circle aparece neste tpico como Exemplo 3. Exemplo 1 O exemplo a seguir demonstra uma classe com construtores dois classe, uma sem argumentos e outra com dois argumentos. C#
class CoOrds { public int x, y; // Default constructor: public CoOrds() { x = 0; y = 0; } // A constructor with two arguments: public CoOrds(int x, int y) { this.x = x; this.y = y; } // Override the ToString method: public override string ToString() { return (System.String.Format("({0},{1})", x, y)); } } class MainClass { static void Main() { CoOrds p1 = new CoOrds(); CoOrds p2 = new CoOrds(5, 3); // Display the results using the overriden ToString method: System.Console.WriteLine("CoOrds #1 at {0}", p1); System.Console.WriteLine("CoOrds #2 at {0}", p2); } }

Sada
CoOrds #1 at (0,0) CoOrds #2 at (5,3)

Exemplo 2 Neste exemplo, a classe Person no tem qualquer construtores, nesse caso, um construtor padro automaticamente fornecida e os campos so inicializados para seus valores padro. C#
public class Person { public int age; public string name; } class TestPerson { static void Main() { Person p = new Person(); System.Console.Write("Name: {0}, Age: {1}", p.name, p.age); } }

Sada
Name: , Age: 0

Visual C# Consolidado

346

Observe que 0 o valor padro de age e o valor padro de name null. Para obter mais informaes sobre valores padro, consulte Tabela de valores padro (referncia C#). Exemplo 3 O exemplo a seguir demonstra usando o inicializador de classe base. A Circle classe derivada da classe Shape geral, e a Cylinder classe derivada de classe Circle. O construtor em cada classe derivada est usando o inicializador de classe base. C#
abstract class Shape { public const double pi = System.Math.PI; protected double x, y; public Shape(double x, double y) { this.x = x; this.y = y; } public abstract double Area(); } class Circle : Shape { public Circle(double radius) : base(radius, 0) { } public override double Area() { return pi * x * x; } } class Cylinder : Circle { public Cylinder(double radius, double height) : base(radius) { y = height; } public override double Area() { return (2 * base.Area()) + (2 * pi * x * y); } } class TestShapes { static void Main() { double radius = 2.5; double height = 3.0; Circle ring = new Circle(radius); Cylinder tube = new Cylinder(radius, height); System.Console.WriteLine("Area of the circle = {0:F2}", ring.Area()); System.Console.WriteLine("Area of the cylinder = {0:F2}", tube.Area()); } }

Sada
Area of the circle = 19.63 Area of the cylinder = 86.39

Para obter mais exemplos em chamar os construtores de classe base, consulte (referncia C#) virtual, Substituir (referncia C#). e base (Referncia do C#) COMO: Declarar e usar propriedades de leitura/escrita (Guia de programao C#) Propriedades fornecem a praticidade de membros de dados pblica sem os riscos que vm com Acesso desprotegido, no controlada, e no-verificados aos dados de um objeto. Isso feito atravs de assessores: especiais mtodos que atribuir e recuperar valores do membro de dados subjacente. O Definir acessador permite que membros de dados a ser atribudo, e o Obter acessador recupera valores Membro de dados. Este exemplo mostra uma Person classe que tenha duas propriedades: Name. (Seqncia) e Age (int) Ambas as propriedades fornecem get e set assessores, so considerados para leitura / gravao propriedades. Exemplo C#
class Person { private string m_name = "N/A"; private int m_Age = 0; // Declare a Name property of type string: public string Name { get { return m_name; } set { m_name = value; } } // Declare an Age property of type int: public int Age { get { return m_Age; } set { m_Age = value; } } public override string ToString() { return "Name = " + Name + ", Age = " + Age; } } class TestPerson { static void Main() { // Create a new Person object: Person person = new Person(); // Print out the name and the age associated with the person: System.Console.WriteLine("Person details - {0}", person); // Set some values on the person object: person.Name = "Joe"; person.Age = 99; System.Console.WriteLine("Person details - {0}", person); // Increment the Age property: person.Age += 1; System.Console.WriteLine("Person details - {0}", person); } }

Sada

Visual C# Consolidado

347

Person details - Name = N/A, Age = 0 Person details - Name = Joe, Age = 99 Person details - Name = Joe, Age = 100

Programao robusta No exemplo anterior, e Age propriedades so Pblica e incluir um get e um set acessador. o Name Isso permite que qualquer objeto para ler e gravar essas propriedades. s vezes desejvel, entretanto, para excluir uma das assessores. Por exemplo, omitir o set acessador, faz a propriedade somente leitura: C#
public string Name { get { return m_name; } }

Como alternativa, voc pode expor um acessador publicamente mas tornar a outros particular ou protegido. Para obter mais informaes, consulte Acessibilidade Accessor assimtrica. Depois que as propriedades so declaradas, eles podem ser usados como se fossem campos de classe. Isso permite para uma sintaxe muito natural quando tanto obtendo e definindo o valor de uma propriedade, como nas instrues a seguir: C#
person.Name = "Joe"; person.Age = 99;

Observe que, um mtodo propriedade set uma varivel Especial value est disponvel. Essa varivel contenha o valor que o usurio especificado, por exemplo: C#
m_name = value;

Observe a sintaxe limpa de incrementando a Age propriedade em um Person objeto: C#


person.Age += 1;

Se separado set e get mtodos foram usados para modelar propriedades, o cdigo equivalente pode parecer isso:
person.SetAge(person.GetAge() + 1);

O ToString mtodo for substitudo, neste exemplo: C#


public override string ToString() { return "Name = " + Name + ", Age = " + Age; }

Aviso que ToString no explicitamente usado no programa. Ele chamado por padro, as WriteLine chamadas. COMO: Definir propriedades abstratas (Guia de programao C#) O exemplo a seguir mostra como definir abstrato propriedades. Uma declarao de propriedade abstract no fornece uma implementao das assessores Propriedade--ele declara que a classe

Visual C# Consolidado

348

suporta propriedades, mas deixa a implementao do acessador para classes derivadas. O exemplo a seguir demonstra como implementar as propriedades herdadas da classe base abstratas. Este exemplo consiste trs arquivos, cada um deles so compilados individualmente e seu conjunto resultante referido pela compilao seguinte:

abstractshape.cs: a Shape classe que contm uma propriedade abstrata Area. Shapes.cs: Os subclasses da classe Shape. shapetest.cs:. - um programa de Teste para exibir as reas de alguns Shape derivado objetos

Para compilar exemplo, use o seguinte comando:


csc abstractshape.cs shapes.cs shapetest.cs

Isso criar a shapetest.exe arquivo executvel. Exemplo Este arquivo declara a Shape classe que contm a Area propriedade do tipo double. C#
// compile with: csc /target:library abstractshape.cs public abstract class Shape { private string m_id; public Shape(string s) { // calling the set accessor of the Id property. Id = s; } public string Id { get { return m_id; } set { m_id = value; } } // Area is a read-only property - only a get accessor is needed: public abstract double Area { get; } public override string ToString() { return Id + " Area = " + string.Format("{0:F2}", Area); } }

Modificadores sobre a propriedade so colocados na declarao Propriedade prprio. Por exemplo:


public abstract double Area

Quando declarar uma propriedade abstrata (tais como Area, neste exemplo), voc simplesmente indicar que assessores Propriedade esto disponveis, mas no fazer implement-las. Neste exemplo, apenas um Obter acessador est disponvel, portanto a propriedade somente leitura.

O cdigo a seguir mostra as trs subclasses da Shape e como elas substituiro a Area propriedade para fornecer seus prprios implementao. C#
// compile with: csc /target:library /reference:abstractshape.dll shapes.cs public class Square : Shape { private int m_side; public Square(int side, string id) : base(id) { m_side = side; } public override double Area { get { // Given the side, return the area of a square: return m_side * m_side; } } } public class Circle : Shape { private int m_radius; public Circle(int radius, string id) : base(id) { m_radius = radius; } public override double Area { get { // Given the radius, return the area of a circle: return m_radius * m_radius * System.Math.PI; } } } public class Rectangle : Shape { private int m_width; private int m_height; public Rectangle(int width, int height, string id) : base(id) { m_width = width; m_height = height; } public override double Area { get { // Given the width and height, return the area of a rectangle: return m_width * m_height; }}}

Visual C# Consolidado

349

O cdigo a seguir mostra um programa de teste que cria um nmero de Shape-derivado objetos e imprime suas reas. C#
// compile with: csc /reference:abstractshape.dll;shapes.dll shapetest.cs class TestClass { static void Main() { Shape[] shapes = { new Square(5, "Square #1"), new Circle(3, "Circle #1"), new Rectangle( 4, 5, "Rectangle #1") }; System.Console.WriteLine("Shapes Collection"); foreach (Shape s in shapes) { System.Console.WriteLine(s); } } }

Sada
Shapes Collection Square #1 Area = 25.00 Circle #1 Area = 28.27 Rectangle #1 Area = 20.00

COMO: Criar um controle que responde a eventos (Guia de programao C#) A Classe, ListWithChangedEvent, que mostra o exemplo simples a seguir o contedo da lista a alterao semelhante para a classe padro ArrayList mas tambm chama. sempre que um Changed Evento Tal uma classe de propsito geral pode ser usado de vrias maneiras em um programa grande. Por exemplo, um processador de texto pode manter uma lista dos documentos abertos. Sempre que esta alteraes da lista, muitos objetos diferentes no Processador de Texto talvez tenha que ser notificado para que a interface do usurio pode ser atualizada. Usando eventos, o cdigo que mantm a lista de documentos no precisa saber quem precisa ser notificado aps a lista de documentos alterada, o evento chamado automaticamente e cada objeto que precisa para ser notificado corretamente notificado. Usando eventos, a modularidade do programa aumentada. Quando criar um componente geral que pode ser usado como uma classe base para outros componentes, voc deve conta para o fato de que eventos, diferentemente de campos, s podem ser chamados de dentro da classe que declarado-los. Classes derivadas diretamente no possvel chamar eventos declarados na classe base. Embora esse seja o que for desejado, s vezes geralmente apropriado para dar a classe derivada liberdade para chamar o evento. Isso geralmente feito criando um mtodo protegido chamado para o evento. Ao chamar esse mtodo chamado, classes derivadas podem chamar o evento. Para obter ainda mais flexibilidade, o mtodo chamado geralmente declarado como virtual, que permite a classe derivada para substitu-lo. Isso permite que a classe derivada para interceptar os eventos que a classe base chamar, possivelmente fazendo seu prprio processamento de-los. No exemplo a seguir, isso foi feito com o OnChanged mtodo. Uma classe derivada chamar ou substituir esse mtodo se necessrio. Uma outra diferena entre eventos e campos que um evento pode ser colocado em uma interface enquanto no um campo. Ao implementar a interface, a classe implementao deve fornecer um evento correspondente na classe que implementa a interface. Exemplo C#
namespace TestCollections { // A delegate type for hooking up change notifications. public delegate void ChangedEventHandler(object sender, System.EventArgs e); // A class that works just like ArrayList, but sends event // notifications whenever the list changes. public class ListWithChangedEvent : System.Collections.ArrayList { // An event that clients can use to be notified whenever the // elements of the list change. public event ChangedEventHandler Changed; // Invoke the Changed event; called whenever list changes protected virtual void OnChanged(System.EventArgs e) { if (Changed != null) { Changed(this, e); } }

Visual C# Consolidado

350

// Override some of the methods that can change the list; // invoke event after each public override int Add(object value) { int i = base.Add(value); OnChanged(System.EventArgs.Empty); return i; } public override void Clear() { base.Clear(); OnChanged(System.EventArgs.Empty); } public override object this[int index] { set { base[index] = value; OnChanged(System.EventArgs.Empty); } } } } namespace TestEvents { using TestCollections; class EventListener { private ListWithChangedEvent m_list; public EventListener(ListWithChangedEvent list) { m_list = list; // Add "ListChanged" to the Changed event on m_list: m_list.Changed += new ChangedEventHandler(ListChanged); } // This will be called whenever the list changes. private void ListChanged(object sender, System.EventArgs e) { System.Console.WriteLine("This is called when the event fires."); } public void Detach() { // Detach the event and delete the list m_list.Changed -= new ChangedEventHandler(ListChanged); m_list = null; } } class Test { // Test the ListWithChangedEvent class. static void Main() { // Create a new list. ListWithChangedEvent list = new ListWithChangedEvent(); // Create a class that listens to the list's change event. EventListener listener = new EventListener(list); // Add and remove items from the list. list.Add("item 1"); list.Clear(); listener.Detach(); } }}

Sada
This is called when the event fires. This is called when the event fires.

Programao robusta

Declarar um evento Para declarar um evento dentro uma classe, primeiro um Delegar tipo para o evento deve ser declarado, se nenhum j est declarado. C#
public delegate void ChangedEventHandler(object sender, System.EventArgs e);

O tipo delegate define o conjunto de argumentos que so passados para o mtodo que manipula o evento. Vrios eventos podem compartilhar o mesmo tipo delegate, portanto, essa etapa s necessria se nenhum tipo delegate adequado j tiver sido declarado. Em seguida, o evento prprio est declarado. C#
public event ChangedEventHandler Changed;

Um evento declarado como um campo de um tipo delegate, exceto que precede a declarao de evento, seguindo os modificadores palavra-chave Evento. Eventos geralmente so declarados Pblica, mas qualquer modificador de acessibilidade permitido.

Chamar um evento Depois que uma classe tenha declarado um evento, ele pode tratar desse evento exatamente como um campo do tipo delegate indicado. O campo ou ser nulo, se nenhum cliente tiver conectado um representante para o evento, ou ento se refere a um representante que deve ser chamado quando o evento chamado. Assim, chamar um evento geralmente isso, primeiro verificando nulo e depois chamar o evento. C#
if (Changed != null) { Changed(this, e); }

Chamar um evento s pode ser feito de dentro da classe que declarado o evento.

Conectando backup a um evento

Visual C# Consolidado

351

De fora a classe que declarado-lo, um evento parece um campo, mas acesso a esse campo bastante restrito. Somente as coisas que podem ser causadas so Redigir novo representante para aquele campo, e removendo um representante de um campo (possivelmente composto). Isso feito com e -= operadores. o += Para comear a receber chamadas de eventos, cdigo de cliente primeiro cria um representante do tipo de evento que se refere ao mtodo que deve ser chamado a partir do evento. Depois ele composes esse representante para qualquer outros representantes que o evento pode estar conectado ao uso +=. C#
m_list.Changed += new ChangedEventHandler(ListChanged);

Quando o cdigo do cliente feito recebimento invocaes de eventos, ele remove seu representante a partir do evento usando operador -=. C#
m_list.Changed -= new ChangedEventHandler(ListChanged);

COMO: Criar eventos que estejam de acordo com as diretrizes do .NET Framework (Guia de programao C#) Permite a linguagem C# para usar qualquer Delegar Tipo, mas o .NET Framework tem mais estrita diretrizes para representantes e eventos. um Evento Caso voc pretenda para o componente a ser usado com o .NET Framework, voc provavelmente ser deseja siga estas diretrizes. As diretrizes .NET Framework indicar que o tipo delegate usado para um evento deve tomar dois parmetros: um Objeto de origem parmetro que indica a fonte de evento, e um parmetro eventos especficos que encapsula qualquer informao adicional sobre o evento. O parmetro eventos especficos deve derivar da classe EventArgs. Para eventos que no usam qualquer informao adicional, o .NET Framework fornece a EventHandler classe. O exemplo a seguir como o cdigo em COMO: Criar um controle que responde a eventos (Guia de programao C#), exceto que esta verso segue as diretrizes .NET Framework. Exemplo C#
namespace TestCollections { // A class that works just like ArrayList, but sends event // notifications whenever the list changes: public class ListWithChangedEvent : System.Collections.ArrayList { // An event that clients can use to be notified whenever the // elements of the list change: public event System.EventHandler Changed; // Invoke the Changed event; called whenever list changes: protected virtual void OnChanged(System.EventArgs e) { if (Changed != null) { Changed(this, e); } } // Override some of the methods that can change the list; // invoke event after each: public override int Add(object value) { int i = base.Add(value); OnChanged(System.EventArgs.Empty); return i; } public override void Clear() { base.Clear(); OnChanged(System.EventArgs.Empty); } public override object this[int index] { set { base[index] = value; OnChanged(System.EventArgs.Empty); } } } } namespace TestEvents { using TestCollections; class EventListener { private ListWithChangedEvent m_list; public EventListener(ListWithChangedEvent list) { m_list = list; // Add "ListChanged" to the Changed event on m_list: m_list.Changed += new System.EventHandler(ListChanged); } // This will be called whenever the list changes: private void ListChanged(object sender, System.EventArgs e) { System.Console.WriteLine("This is called when the event fires."); } public void Detach() { // Detach the event and delete the list: m_list.Changed -= new System.EventHandler(ListChanged); m_list = null; } } class Test { // Test the

Visual C# Consolidado

352

ListWithChangedEvent class: static void Main() { // Create a new list: ListWithChangedEvent list = new ListWithChangedEvent(); // Create a class that listens to the list's change event: EventListener listener = new EventListener(list); // Add and remove items from the list: list.Add("item 1"); list.Clear(); listener.Detach(); } } }

Sada
This is called when the event fires. This is called when the event fires.

COMO: Declarar um evento em uma interface e implement-lo em uma classe (Guia de programao C#) Este exemplo mostra que possvel para declarar um Evento. No e implement-lo em um Interface um Classe Exemplo C#
public delegate void TestDelegate(); // delegate declaration public interface ITestInterface { event TestDelegate TestEvent; void FireAway(); } public class TestClass : ITestInterface { public event TestDelegate TestEvent; public void FireAway() { if (TestEvent != null) { TestEvent(); } } } public class MainClass { static private void F() { System.Console.WriteLine("This is called when the event fires."); } static void Main() { ITestInterface i = new TestClass(); i.TestEvent += new TestDelegate(F); i.FireAway(); } }

COMO: Usar um dicionrio para armazenar instncias de eventos (Guia de programao C#) Um uso para accessor-declarations para expor um grande nmero de eventos sem alocando um campo para cada evento, mas em vez disso, usar um dicionrio para armazenar as instncias de eventos. S til se voc tiver um nmero muito grande de eventos, mas voc espera que a maioria dos eventos no ser implementada. Exemplo C#
public delegate void Delegate1(int i); public delegate void Delegate2(string s); public class PropertyEventsSample { private System.Collections.Generic.Dictionary<string, System.Delegate> eventTable; public PropertyEventsSample() { eventTable = new System.Collections.Generic.Dictionary<string, System.Delegate>(); eventTable.Add("Event1", null); eventTable.Add("Event2", null); } public event Delegate1 Event1 { add { eventTable["Event1"] = (Delegate1)eventTable["Event1"] + value; } remove { eventTable["Event1"] = (Delegate1)eventTable["Event1"] - value; } } public event Delegate2 Event2 { add { eventTable["Event2"] = (Delegate2)eventTable["Event2"] + value; } remove { eventTable["Event2"] = (Delegate2)eventTable["Event2"] - value; } } internal void FireEvent1(int i) { Delegate1 D; if (null != (D = (Delegate1)eventTable["Event1"])) { D(i); } } internal void FireEvent2(string s) { Delegate2 D; if (null != (D = (Delegate2)eventTable["Event2"])) { D(s); } } } public class TestClass { public static void Delegate1Method(int i) { System.Console.WriteLine(i); } public static void Delegate2Method(string s) { System.Console.WriteLine(s); } static void Main() { PropertyEventsSample p = new PropertyEventsSample(); p.Event1 += new Delegate1(TestClass.Delegate1Method); p.Event1 += new Delegate1(TestClass.Delegate1Method); p.Event1 -= new Delegate1(TestClass.Delegate1Method); p.FireEvent1(2); p.Event2 += new Delegate2(TestClass.Delegate2Method); p.Event2 += new

Visual C# Consolidado

353

Delegate2(TestClass.Delegate2Method); p.Event2 -= new Delegate2(TestClass.Delegate2Method); p.FireEvent2("TestString"); } }

Sada
2 TestString

COMO: Implementar duas interfaces que possuam um evento com o mesmo nome (Guia de programao C#) Outro uso para Evento Propriedades aborda a situao onde voc estiver implementando duas interfaces, cada um com um evento com o mesmo nome. Nesse caso, voc deve usar uma propriedade de evento explicitamente de implementao. No entanto, ao explicitamente implementar eventos na interface, voc precisar fornecer adicionar e remover mtodos. Exemplo C#
public delegate void Delegate1(); public delegate int Delegate2(string s); public interface I1 { event Delegate1 TestEvent; } public interface I2 { event Delegate2 TestEvent; } public class ExplicitEventsSample : I1, I2 { public event Delegate1 TestEvent; // normal implementation of I1.TestEvent. private Delegate2 TestEvent2Storage; // underlying storage for I2.TestEvent. event Delegate2 I2.TestEvent // explicit implementation of I2.TestEvent. { add { TestEvent2Storage += value; } remove { TestEvent2Storage -= value; } } private void FireEvents() { if (TestEvent != null) { TestEvent(); } if (TestEvent2Storage != null) { TestEvent2Storage("hello"); } } }

COMO: Criar manipuladores de evento no Visual C# Code Editor (Guia de programao C#) O Editor de Cdigo Visual C# oferece uma maneira fcil de criar manipuladores de eventos para o Windows Forms enquanto trabalha no modo Design. A alternativa exibir o cdigo fonte no modo de exibio Source e adicionar o manipulador de eventos no cdigo. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Visual Studio configuraes. Para criar um manipulador de eventos usando o Editor de Cdigo Visual C# 1. Se clique com o boto direito do mouse no formulrio ou controle para o qual voc deseja criar um manipulador de eventos, e selecione Properties. no estiver visvel, no modo Design, o Properties Window Na parte superior da Properties Window, clique no boto Events. Clique duas vezes no evento que voc deseja criar, por exemplo o evento Load. Visual C# Cria um mtodo do manipulador de evento vazio e adiciona-o para o seu cdigo. Como alternativa voc pode adicionar o cdigo em mos no modo de exibio de cdigo. Por exemplo as seguintes linhas de cdigo declarar um manipulador de eventos de carga para uma Form classe chamada Form1.

2. 3.

Visual C# Consolidado

354

C#
private void Form1_Load(object sender, System.EventArgs e) { // Add your form load event handling code here. }

COMO: Implementar explicitamente membros de uma interface (Guia de programao C#) Este exemplo declara um Interface, IDimensions, e uma classe, Box., explicitamente que implementa os membros getLength de interface e getWidth Os membros so acessados atravs a instncia dimensions interface. Exemplo C#
interface IDimensions { float getLength(); float getWidth(); } class Box : IDimensions { float lengthInches; float widthInches; Box(float length, float width) { lengthInches = length; widthInches = width; } // Explicit interface member implementation: float IDimensions.getLength() { return lengthInches; } // Explicit interface member implementation: float IDimensions.getWidth() { return widthInches; } static void Main() { // Declare a class instance box1: Box box1 = new Box(30.0f, 20.0f); // Declare an interface instance dimensions: IDimensions dimensions = (IDimensions)box1; // The following commented lines would produce compilation // errors because they try to access an explicitly implemented // interface member from a class instance: //System.Console.WriteLine("Length: {0}", box1.getlength()); //System.Console.WriteLine("Width: {0}", box1.getwidth()); // Print out the dimensions of the box by calling the methods // from an instance of the interface: System.Console.WriteLine("Length: {0}", dimensions.getLength()); System.Console.WriteLine("Width: {0}", dimensions.getWidth()); } }

Sada
Length: 30 Width: 20

Programao robusta

Observe que as seguintes linhas no mtodo Main, e so comentadas porque eles produziria erros de compilao. Um membro de interface que implementado explicitamente no pode ser acessado de uma Classe instncia: C#
//System.Console.WriteLine("Length: {0}", box1.getlength()); //System.Console.WriteLine("Width: {0}", box1.getwidth());

Observe tambm que as seguintes linhas no mtodo Main, e com xito imprima as dimenses da caixa porque os mtodos esto sendo chamados de uma instncia da interface: C#
System.Console.WriteLine("Length: {0}", dimensions.getLength()); System.Console.WriteLine("Width: {0}", dimensions.getWidth());

COMO: Implementar explicitamente membros de uma interface com herana (Guia de programao C#) Implementao explcita Interface tambm permite que o programador para implementar duas interfaces que tm os mesmos nomes membro e concedidos aos membros interface uma implementao separada. Este exemplo exibe as dimenses de uma caixa na mtrica e unidades em ingls. As Box Classe interfaces IEnglishDimensions implementa dois e IMetricDimensions, que

Visual C# Consolidado

355

representam os sistemas de medida diferente. As duas interfaces ter nomes idnticos membro, Length e Width. Exemplo C#
// Declare the English units interface: interface IEnglishDimensions { float Length(); float Width(); } // Declare the metric units interface: interface IMetricDimensions { float Length(); float Width(); } // Declare the Box class that implements the two interfaces: // IEnglishDimensions and IMetricDimensions: class Box : IEnglishDimensions, IMetricDimensions { float lengthInches; float widthInches; public Box(float length, float width) { lengthInches = length; widthInches = width; } // Explicitly implement the members of IEnglishDimensions: float IEnglishDimensions.Length() { return lengthInches; } float IEnglishDimensions.Width() { return widthInches; } // Explicitly implement the members of IMetricDimensions: float IMetricDimensions.Length() { return lengthInches * 2.54f; } float IMetricDimensions.Width() { return widthInches * 2.54f; } static void Main() { // Declare a class instance box1: Box box1 = new Box(30.0f, 20.0f); // Declare an instance of the English units interface: IEnglishDimensions eDimensions = (IEnglishDimensions)box1; // Declare an instance of the metric units interface: IMetricDimensions mDimensions = (IMetricDimensions)box1; // Print dimensions in English units: System.Console.WriteLine("Length(in): {0}", eDimensions.Length()); System.Console.WriteLine("Width (in): {0}", eDimensions.Width()); // Print dimensions in metric units: System.Console.WriteLine("Length(cm): {0}", mDimensions.Length()); System.Console.WriteLine("Width (cm): {0}", mDimensions.Width()); } }

Sada
Length(in): 30 Width (in): 20 Length(cm): 76.2 Width (cm): 50.8

Programao robusta Se voc desejar tornar as medidas padro em ingls unidades, implementar os mtodos Length e Width Normalmente, e explicitamente implementar os mtodos Comprimento e Largura da interface IMetricDimensions: C#
// Normal implementation: public float Length() { return lengthInches; } public float Width() { return widthInches; } // Explicit implementation: float IMetricDimensions.Length() { return lengthInches * 2.54f; } float IMetricDimensions.Width() { return widthInches * 2.54f; }

Nesse caso, voc pode acessar as unidades ingls da instncia de classe e acessar as unidades mtrica de interface a instncia: C#
public static void Test() { Box box1 = new Box(30.0f, 20.0f); IMetricDimensions mDimensions = (IMetricDimensions)box1; System.Console.WriteLine("Length(in): {0}", box1.Length()); System.Console.WriteLine("Width (in): {0}", box1.Width()); System.Console.WriteLine("Length(cm): {0}", mDimensions.Length()); System.Console.WriteLine("Width (cm): {0}", mDimensions.Width()); }

Visual C# Consolidado

356

Classes genricas no .NET Framework


Generics permitem que voc personalizar um mtodo, classe, estrutura ou interface para o tipo de dados precisa Ele age sobre. Por exemplo, em vez de usar a Hashtable classe, que permite chaves e valores sejam de qualquer tipo, voc pode usar a Dictionary classe genrico e especifique o tipo permitido para a chave e o tipo permitido para o valor. Entre os benefcios da generics esto cdigo maior segurana reutilizao e tipo. Do System.Collections.Generic um nmero de classes a coleo genrica fornecido no .NET Framework, no e System.Collections.ObjectModel espaos de nome. Genricos interfaces para implementar comparaes classificar e igualdade so fornecidos no espao para nome System, juntamente com tipos de representante genrico para manipuladores de eventos, converses e predicados da pesquisa. Suporte para generics foi adicionada ao System.Reflection para examinar tipos genricos e mtodos genricos para System.Reflection.Emit para emissor dinmico conjuntos que contm tipos genricos e mtodos, e para System.CodeDOM para gerar origem Graphs que incluem generics. Visual Basic, C#, e Visual C++ fornecem suporte completo para definir e usar tipos genricos. O Common Language Runtime fornece nova operao 8087 e prefixos para oferecer suporte aos tipos genricos no Microsoft (MSIL) linguagem intermediria.

Viso geral sobre Generics no .NET Framework


Este tpico fornece uma viso geral sobre os seguintes recursos de generics no .NET Framework e o Common Language Runtime:

Um resumo de tipos genricos e mtodos e a terminologia para falar sobre eles. Do System.Collections.Generic a coleo genrica classes no e System.Collections.ObjectModel espaos de nome. Outros tipos genricos. Genricos representantes de converses, predicados de pesquisa, e aes devem ser feitos em elementos de uma matriz ou coleo. Genricos interfaces para fornecer funcionalidade Common de famlias de tipos genricos.

O que so Generics, e como eles so usados e definido? Generics so classes, estruturas, interfaces, e mtodos que possuem espaos reservados (parmetros tipo) para uma ou mais dos tipos que armazenar ou usar. Uma classe a coleo genrica pode utilizar um parmetro tipo como espao reservado para o tipo de objetos que ele armazena; os parmetros tipo aparecem como os tipos de seus campos, e os tipos de parmetro de seus mtodos. Um mtodo genrico pode usar seu parmetro tipo como o tipo de seu valor de retorno, ou como o tipo de um dos seus parmetros formais. O cdigo a seguir ilustra uma definio de classe genrico simples. C#
public class Generic<T> { public T Field; }

Quando voc cria uma instncia de uma classe genrico, voc especificar os tipos reais para substituir para os parmetros tipo. Isso estabelece uma nova classe genrico, conhecido como uma classe genrico construdo, com seus tipos substitudos em todos os lugares que aparecem

Visual C# Consolidado

357

os parmetros tipo escolhidos. O resultado uma classe Safe tipo-adequado para sua escolha de tipos, como o cdigo a seguir ilustra. C#
Generic<string> g = new Generic<string>(); g.Field = "A string";

Os seguintes termos so usados para falar sobre generics no .NET Framework:

A Definio de tipo genrico uma classe, estrutura, ou declarao interface que funciona como um modelo, com espaos reservados para os tipos-pode conter ou usar. Por exemplo, a Dictionary classe pode conter dois tipos: chaves e valores. Porque ele apenas um modelo, voc no pode criar instncias de uma classe, estrutura ou interface que uma definio de tipo genrico. Parmetros tipo genrico ou Parmetros tipo, so espaos reservados em uma definio tipo ou mtodo genrico. O Dictionary tipo genrico tem dois parmetros Tipo, TKey e TValue, que representa os tipos de suas chaves e valores. A Construdo tipo genrico, ou Tipo construdo, o resultado da especificando tipos para os parmetros tipo genrico de uma definio de tipo genrico. A Argumento tipo genrico qualquer tipo que substitudo para um parmetro tipo genrico. O termo geral " tipo genrico " inclui os construdo tipos e definies tipo genrico. limites so Restries colocados em parmetros tipo genrico. Por exemplo, voc pode limitar um parmetro tipo para tipos que implementam a IComparer interface genrica, para garantir que instncias do tipo podem ser pedidas. Voc tambm pode restringir parmetros tipo para tipos que tenham uma classe base especfico, que tem um construtor padro, ou que so tipos de referncia ou tipos de valores. Usurios do tipo genrico no podem substituir argumentos tipo que no faa satisfazer as restries. A definio Mtodo genrico um mtodo com duas listas de parmetro: uma lista de parmetros tipo genrico, e uma lista de parmetros formais. Parmetros tipo podem aparecer como o tipo de retorno ou como os tipos de parmetros formais, como no cdigo a seguir. C#
T Generic<T>(T arg) { T temp = arg; ...}

Mtodos genricos podem aparecer em tipos genricos ou nongeneric. importante para Observe que um mtodo no genrico apenas porque ele pertence a um tipo genrico, ou mesmo porque tem parmetros formais cujos tipos so os parmetros do tipo delimitador genricos. Um mtodo somente se tiver sua prpria lista de parmetros tipo genrico. No cdigo a seguir, nico mtodo G genrico. C#
class A { T G<T>(T arg) {...} } class Generic<T> { T M(T arg) {...} }

Visual C++, C#, e Visual Basic todos os fornecem suporte completo para definir e consumindo generics. Para obter mais informaes, consulte Tipos genrics no Visual Basic, Introduo ao Generics (guia de programao C#). e Overview of Generics in C++ Tipos e Generics aninhadas Um tipo aninhado em um tipo genrico pode depender os parmetros os tipo de delimitador o tipo genrico, e esses tipos aninhados so considerados genricos pelo tempo de execuo de idioma comum, mesmo que eles no tenham parmetros tipo genrico de seus prprios. Quando voc

Visual C# Consolidado

358

cria uma instncia de um tipo aninhado, necessrio para especificar argumentos Tipo para todos os delimitador tipos genricos. Genricas colees no .NET Framework Do System.Collections.Generic um nmero de classes a coleo genrica fornecido na biblioteca de classe do .NET Framework, no e System.Collections.ObjectModel espaos de nome. Para obter mais informaes sobre essas classes, consulte Comumente usados tipos da coleo. System.Collections.Generic Muitos dos tipos a coleo genrica so diretas analogs dos tipos nongeneric. Dictionary uma verso genrica do Hashtable; ele utiliza a estrutura KeyValuePair genrica para enumerao, em vez de DictionaryEntry. List uma verso do ArrayList genrico. No h genrico Queue e Stack Classes correspondente s verses nongeneric. Existem verses genrico e nongeneric do SortedList, ambos os quais so hbridas entre um dicionrio e uma lista, e que tm caractersticas de desempenho semelhante. A SortedDictionary classe genrico um dicionrio que oferece caractersticas de desempenho diferente, e que possui nenhum contraparte nongeneric puro. A LinkedList classe genrico uma lista vinculada verdadeira. No tem nenhum contraparte nongeneric. System.Collections.ObjectModel A Collection classe genrico oferece uma classe base para derivar seus prprios tipos a coleo genrica. A ReadOnlyCollection classe fornece uma maneira fcil de produzir uma coleo somente leitura de qualquer tipo que implementa a IList interface genrico. A KeyedCollection classe genrica oferece uma maneira para armazenar objetos que contm suas prprias chaves. Outros tipos genrico A Nullable estrutura genrica, voc pode usar tipos valor como se eles pode ser atribudos null. Isso pode ser til ao trabalhar com consultas de banco de dados, onde campos que contm tipos de valor podem ser ausentes. O parmetro tipo genrico pode ser qualquer tipo de valor. Observao Em C# no necessrio para usar Nullable explicitamente, porque o idioma tem sintaxe para tipos anulveis. A ArraySegment estrutura genrica oferece uma maneira para delimitar um intervalo de elementos em uma matriz unidimensional, baseada em zero de qualquer tipo. O parmetro tipo genrico o tipo de elementos da matriz na. O EventHandler representante genrico elimina a necessidade para declarar um tipo delegate para manipular eventos se o evento segue o padro tratamento de eventos-usado pelo .NET Framework. Por exemplo, suponha que voc tiver criado uma MyEventArgs classe, derivado de

Visual C# Consolidado

359

EventArgs, para manter os dados para o evento. Ento voc pode declarar o evento da seguinte maneira: C#
public event EventHandler<MyEventArgs> MyEvent;

Representantes genricos para Manipulating matrizes e listas O Action representante genrico representa um mtodo que efetua alguma ao em um elemento do tipo especificado. Voc pode criar um mtodo que executa a ao desejada no elemento, criamos uma instncia do representante Action para representar esse mtodo, e depois passar a matriz e o representante para o System.Array.ForEach.Action{ mtodo esttico genrico O mtodo chamado para cada elemento da matriz. A List classe genrica tambm oferece um ForEach mtodo que usa o Action representante. Esse mtodo no genrico. Observao Isso torna um ponto interessante sobre tipos genricos e mtodos. O System.Array.ForEach.Action{ mtodo deve ser esttico (Shared. porque Array) e genrico no Visual Basic no um tipo genrico; o nico motivo voc pode especificar um tipo para System.Array.ForEach.Action{ para operar em que o mtodo possui sua prpria lista de Parmetro tipo Por outro lado, o mtodo nongeneric System.Collections.Generic.List.ForEach(System.Action{ pertence classe List genrico, para ele simplesmente utiliza o parmetro Tipo de sua classe. A classe altamente for digitada, portanto, o mtodo pode ser um mtodo de instncia. O Predicate representante genrico representa um mtodo que determina se um determinado elemento atende critrios voc definir. Poder us-lo com os seguintes mtodos estticos genricos de Array para procurar por um elemento ou um conjunto de elementos: Exists., FindLastFindIndex, FindAllFind, FindLastIndex e TrueForAll Tambm Predicate funciona com os mtodos correspondentes nongeneric da instncia da classe List genrico. O Comparison representante genrico permite que voc para fornecer uma ordem de classificao de matriz ou lista elementos que no tm uma ordem de classificao nativo, ou para substituir a ordem de classificao nativo. Criar um mtodo que executa a comparao, criar uma instncia do representante Comparison para representar o mtodo, e depois passar a matriz e o representante para o System.Array.Sort.Comparison{ mtodo genrico esttico. A List classe genrico oferece uma sobrecarga mtodo da instncia correspondente, System.Collections.Generic.List.Sort(System.Comparison{. O Converter representante genrico permite que voc para definir uma converso entre dois tipos, e para converter uma matriz de um tipo em uma matriz de outro, ou para converter uma lista de um tipo em uma lista do outro. Criar um mtodo que converte os elementos de lista existente para um novo tipo, criar uma instncia delegado para representar o mtodo, e use o System.Array.ConvertAll.Converter{ mtodo esttico genrico para produzir uma matriz do novo tipo da matriz original, ou o System.Collections.Generic.List.ConvertAll.Converter{ mtodo da instncia genrico para produzir uma lista do novo tipo a partir da lista original.

Visual C# Consolidado

360

O encadeamento representantes Muitos dos mtodos que usam esses representantes retornar uma matriz ou lista, que pode ser passada para outro mtodo. Por exemplo, se voc desejar selecionar determinados elementos de uma matriz, converter esses elementos para um novo tipo, e salv-las em uma nova matriz, voc pode passar a matriz retornada pelo mtodo FindAll genrico para o ConvertAll mtodo genrico. Se o novo tipo elemento possui uma ordem de classificao natural, voc poder passar a matriz retornada pelo mtodo ConvertAll genrico para o Sort mtodo genrico. Interfaces genrico Interfaces genricos fornecem contrapartes Safe tipo-a nongeneric interfaces para Ordem e igualdade comparaes e para funcionalidade compartilhado por tipos a coleo genrica. Igualdade e classificao Comparisons Do System.IComparable no espao para nome System, e System.IEquatable genricos interfaces, como suas contrapartes nongeneric, definir mtodos para ordenar comparaes e comparaes de igualdade, respectivamente. Tipos implementar essas interfaces para fornecer a capacidade de executar tais comparaes. No espao para nome System.Collections.Generic, ou System.IEquatable interface genrica e eles fornecem uma maneira para redefinir os relacionamentos de tipos que fazem. e IEqualityComparer Definir uma comparao ordenao ou igualdade para tipos que no implementam oferta interfaces genrico uma maneira o IComparer o System.IComparable Essas interfaces so usados por mtodos e construtores de muitas das classes a coleo genrica. Por exemplo, voc pode passar um genrica IComparer para o construtor da classe SortedDictionary para especificar uma ordem de classificao para um tipo que no implementa genrico System.IComparable. Existem overloads do System.Array.Sort mtodo esttico genrico e o System.Collections.Generic.List.Sort(System.Collections.Generic.IComparer{ mtodo da instncia para classificao matriz e lista usando implementaes genricas IComparer. O Comparer e tambm fornecem comparaes ordem e igualdade padro por seus respectivas System.Collections.Generic.Comparer.Default e System.Collections.Generic.EqualityComparer.Default Propriedades. e EqualityComparer Classes genricos fornecem classes bsicas para implementaes de e IEqualityComparer Interfaces genricos, o IComparer Funcionalidade coleo A ICollection interface genrica a interface para a coleo genrica tipos bsico. Fornece funcionalidade bsica para adicionar, remover, copiar, e enumerar elementos. Herda ICollection da genrico IEnumerable e nongeneric IEnumerable. A IList interface genrica estende a ICollection interface genrica com mtodos para recuperao indexado. A IDictionary interface genrica estende a ICollection interface genrica com mtodos para recuperao com chave. Tipos do Dicionrio genrico na biblioteca de classes base do .NET Framework tambm implementam a interface nongeneric IDictionary. A IEnumerable interface genrico oferece uma estrutura de enumerador genrico. A IEnumerator interface implementada por enumeradores genricos genrico herda a interface nongeneric IEnumerator, e MoveNext. e Reset membros, que no faa depender o parmetro T de tipo, aparecem apenas em uma interface nongeneric Isso significa que qualquer consumidor sobre a interface nongeneric tambm pode consumir a interface genrica.

Visual C# Consolidado

361

Limitaes de Generics A seguir esto algumas limitaes de generics no .NET Framework verso 2.0:

Tipos genricos podem ser derivados da maioria das classes base, como MarshalByRefObject (e restries podem ser usadas para exigir que parmetros tipo genrico derivar de classes base como MarshalByRefObject),. mas nesta verso no h suporte para tipos genricos vinculados contexto- Um tipo genrico pode ser derivado de ContextBoundObject, mas ao tentar criar uma instncia do que digitar causas. um TypeLoadException Enumeraes no podem ter parmetros tipo genrico. Uma enumerao pode ser genrica somente por acaso, por exemplo porque ele estiver aninhado em um tipo genrico definido com Visual Basic, C#, ou C++. Para obter mais informaes, consulte Enumeraes no CTS (Common Type System). Leve mtodos dinmicos no podem ser genricos. Para obter mais informaes sobre mtodos dinmicos, consulte Reflexo Emit dinmico cenrios mtodo. No Visual Basic, C# e C++ um tipo aninhado entre um tipo genrico no pode ser instanciado a menos que tipos tiverem sido atribudos aos parmetros os tipo de todos os tipos de incluso. Outra maneira de dizer isso que no reflexo, um tipo aninhado definido usando esses idiomas inclui os parmetros os tipo de todos os seus tipos delimitador. Isso permite que os parmetros os Tipo do colocando tipos a ser usado nas definies as membro de um tipo aninhado. Para obter mais informaes, consulte " Tipos Nested " no MakeGenericType. Observao Um tipo aninhado que definido pelo emissor cdigo em um conjunto dinmico ou usando parmetros do seu colocando tipos; entretanto, se no tiver depois os parmetros tipo so no no escopo na classe aninhada. No necessrio para incluir o tipo a Assembler MSIL (Ilasm.exe)

Para obter mais informaes, consulte " Tipos Nested " no MakeGenericType.

Vantagens de Generics
Permitindo que voc para especificar os tipos especficos acionados por uma classe genrico ou mtodo, o recurso generics desloca a sobrecarga de segurana de tipos de voc para o compilador. No necessrio ao gravar cdigo para teste para o tipo de dados correto, porque ele imposto em tempo de compilao. A necessidade de diretores tipo e a possibilidade de erros em tempo de execuo so reduzidas. Generics fornecem segurana tipo sem a sobrecarga de vrias implementaes. Por exemplo, crie uma lista vinculada de seqncias com a seguinte declarao de varivel: C#
LinkedList<string> llist = new LinkedList<string>();

No necessrio para herdar de um tipo base e substituem membros. A lista vinculada est pronta para uso imediato. Consulte System.Collections.Generic e System.Collections.ObjectModel para os tipos a coleo genrica fornecidos pelo .NET Framework. Alm de segurana de tipo, tipos a coleo genrica geralmente executar melhor para armazenar e manipular tipos valor porque no h h necessidade de caixa os tipos valor.

Visual C# Consolidado

362

Representantes genricos Ativar retornos de chamada Segurana tipo-sem a necessidade para criar representante vrias classes. Por exemplo, o Predicate representante genrico permite que voc a criar um mtodo que implementa seu prprio critrios para um tipo especfico e a usar o mtodo com mtodos do tipo Array, como Find, FindLast,. e FindAll Representantes genricos tambm podem ser usados no cdigo gerado dinamicamente sem exigir a gerao de um tipo delegate. Isso aumenta o nmero de cenrios em que voc pode usar Lightweight mtodos dinmicos em vez de gerar conjuntos todos. Para obter mais informaes, consulte Como Definir e Executar Mtodos Dinmicos e DynamicMethod. Em muitos casos, o Visual Basic, Visual C++ e compiladores C# so capazes de determinao do contexto os tipos usados por uma chamada de mtodo genrico, bastante simplificando a sintaxe para usar mtodos genricos. Por exemplo, o cdigo a seguir mostra os formulrios de chamar o BinarySearch mtodo para pesquisar uma matriz de seqncias genrico curto e longo. No formulrio curto, os compiladores inferir o parmetro tipo correto dos tipos de argumentos do mtodo. C#
int index = Array.BinarySearch(myArray, "test string"); int index = Array.BinarySearch<string>(myArray, "test string");

A palavra-chave default em cdigo fonte "genrico" (Guia de programao C#)


No genricos classes e mtodos, um problema que surge como atribuir um valor padro a um tipo parametrizado T quando voc no faa sabe o seguinte antecedncia:

Se T ser um tipo de referncia ou um tipo de valor. Se T for um tipo de valor, se ele ser um valor numrico ou uma estrutura.

Fornecido uma varivel t de um tipo parametrizado T, a instruo t =. Se T um tipo de referncia e t = trabalho somente ser 0 para tipos valor numrico mas no para estruturas nulo s vlido A soluo para usar a default palavra-chave, que retornar nula para tipos de referncia e zero para tipos valor numrico. Para estruturas, ele retornar cada membro da estrutura inicializada com zero ou nulo dependendo se eles so tipos valor ou referncia. O exemplo a partir da GenericList<T> classe a seguir mostra como usar a default palavra-chave. Para obter mais informaes, consulte Viso geral generics. C#
public class GenericList<T> { private class Node { //... public Node Next; public T Data; } private Node head; //... public T GetNext() { T temp = default(T); Node current = head; if (current != null) { temp = current.Data; current = current.Next; } return temp; } }

Mtodos genrico (Guia de programao C#)


Um mtodo genrico um mtodo que est declarado com parmetros Tipo, da seguinte maneira: C#
static void Swap<T>(ref T lhs, ref T rhs) { T temp; temp = lhs; lhs = rhs; rhs = temp; }

Visual C# Consolidado

363

O exemplo de cdigo a seguir mostra uma maneira de chamar o mtodo, usando Int para o argumento Tipo: C#
public static void TestSwap() { int a = 1; int b = 2; Swap<int>(ref a, ref b); System.Console.WriteLine(a + " " + b); }

Voc tambm pode omitir o argumento Tipo e o compilador deduzir-lo. A chamada para permutar a seguir equivalente como a chamada anterior: C#
Swap(ref a, ref b);

As mesmas regras para a inferncia tipo se aplicam a mtodos estticos, bem como mtodos da instncia. O compilador capaz de inferir os parmetros tipo com base em argumentos do mtodo voc passar na; ele no pode inferir os parmetros tipo somente de uma restrio ou retornar valor. Portanto, a inferncia tipo no funciona com os mtodos que possuem sem parmetros. Ocorre a inferncia tipo em tempo de compilao antes o compilador tenta se resolver nenhuma assinatura mtodo sobrecarregado. Se o compilador aplica lgica a inferncia tipo a todos os mtodos que compartilham o mesmo nome genricos. Na etapa de resoluo de sobrecarga, o compilador inclui apenas esses mtodos genricos no qual a inferncia tipo xito. Em uma classe genrico, mtodos no-Generic podem acessar os parmetros tipo nvel de classe, da seguinte maneira: C#
class SampleClass<T> { void Swap(ref T lhs, ref T rhs) { } }

Se voc definir um mtodo genrico que leva os mesmos parmetros tipo como a classe que contm o compilador ir gerar aviso CS0693 porque dentro do escopo mtodo, o argumento fornecido para o T interna ocultar o argumento fornecido para o T. externa Se voc exigir a flexibilidade de chamar um mtodo de classe genrico com argumentos Tipo diferente aquelas fornecidas quando a classe foi instanciada, considere fornecer outro identificador para do mtodo Parmetro tipo, como mostrado GenericList2<T> no exemplo a seguir. C#
class GenericList<T> { // CS0693 void SampleMethod<T>() { } } class GenericList2<T> { //No warning void SampleMethod<U>() { } }

Utilizar restries para ativar operaes mais especializadas em parmetros tipo nos mtodos. Esta verso do Swap<T>, agora chamado SwapIfGreater<T>, somente pode ser usada com argumentos Tipo que implementam IComparable<T>. C#
void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable<T> { T temp; if (lhs.CompareTo(rhs) > 0) { temp = lhs; lhs = rhs; rhs = temp; } }

Mtodos genricos podem ser sobrecarregados em um nmero de parmetros tipo. Por exemplo, os seguintes mtodos podem todos existir na mesma classe: C#

Visual C# Consolidado

364

void DoWork() { } void DoWork<T>() { } void DoWork<T, U>() { }

Especificao da Linguagem C# Para obter mais informaes, consulte as sees a seguir no Especificao da Linguagem C#:

A inferncia 20.6.4 de argumentos Tipo.

Restries em parmetros de tipo (Guia de programao C#)


Quando voc define uma classe genrico, voc pode aplicar restries para os tipos de tipos que cdigo de cliente pode usar para argumentos Tipo quando ele instancia sua classe. Se Cdigo do cliente tentar criar a classe com um tipo que no permitido por uma restrio, o resultado um erro em tempo de compilao. Essas restries so chamadas restries. Restries so especificadas usando a where palavra-chave contextual. A tabela a seguir lista os tipos de restries seis: Restrio Onde struct T: Descrio O argumento Tipo deve ser um tipo de valor. Qualquer tipo de valor exceto Nullable pode ser especificado. Consulte Usando tipos Nullable (C# programao guia) Para obter mais informaes. O argumento Tipo deve ser um tipo de referncia, incluindo qualquer classe, interface, representante, ou tipo de matriz. O argumento Tipo deve ter um construtor sem parmetros pblico. Quando usado em conjunto com outras restries, a new() restrio deve ser especificada pela ltima vez. O argumento Tipo deve ser ou derivar de classe base especificada. O argumento Tipo deve ser ou implementam a interface especificada. Vrias restries interface podem ser especificadas. A interface restries tambm pode ser genrica. O argumento Tipo fornecido para T deve ser ou derivar do argumento fornecido para u. Isso chamado uma restrio tipo naked.

Onde: classe T Onde: New() T

where T : <base class name> where T : <interface name> Onde: U T

Por que usar restries Se voc desejar examinar um item em uma lista genrica para determinar se ele vlido ou para compar-lo para algum outro item, o compilador deve ter alguns garante que o operador ou mtodo que ele precisa para chamar ter suporte por qualquer argumento tipo que pode ser especificado pelo cdigo do cliente. ESTA GARANTIA obtida ao aplicar uma ou mais restries para a definio de classe genrico. Por exemplo, a restrio classe base informa o compilador que somente objetos desse tipo ou derivado desse tipo ser usado como argumentos Tipo. Quando o compilador tem esta garantia, ela pode permitir que mtodos desse tipo a ser chamado dentro da classe genrico. Restries so aplicadas usando a palavra-chave where contextual. O exemplo de cdigo a seguir demonstra a funcionalidade que pode adicionar para a GenericList<T> classe (in Introduo ao Generics (guia de programao C#)), aplicando uma restrio classe base. C#
public class Employee { private string name; private int id; public Employee(string s, int i) { name = s; id = i; } public string Name { get { return name; } set { name = value; } } public int ID { get { return id; } set { id = value; } } } public class GenericList<T> where T : Employee { private class Node { private Node next; private

Visual C# Consolidado

365

T data; public Node(T t) { next = null; data = t; } public Node Next { get { return next; } set { next = value; } } public T Data { get { return data; } set { data = value; } } } private Node head; public GenericList() //constructor { head = null; } public void AddHead(T t) { Node n = new Node(t); n.Next = head; head = n; } public IEnumerator<T> GetEnumerator() { Node current = head; while (current != null) { yield return current.Data; current = current.Next; } } public T FindFirstOccurrence(string s) { Node current = head; T t = null; while (current != null) { //The constraint enables access to the Name property. if (current.Data.Name == s) { t = current.Data; break; } else { current = current.Next; } } return t; } }

A restrio permite que a classe genrica para utilizar a Employee.Name propriedade desde todos os itens do tipo T so garantidas como um Employee objeto ou um objeto herdeira de Employee. Vrias restries podem ser aplicadas para o mesmo parmetro, tipo e as restries prprios podem ser tipos genricos, da seguinte forma: C#
class EmployeeList<T> where T : Employee, IEmployee, System.IComparable<T>, new() { // ... }

Restringindo o parmetro de tipo, voc aumentar o nmero de operaes permitidas e chamadas de mtodo aos quais o tipo de restries e todos os tipos na sua hierarquia de herana. Portanto, ao criar classes genricos ou mtodos, se voc vai ser executando qualquer operao nos membros genricos alm atribuio simples ou chamar qualquer mtodo no ofeream suporte System.Object, voc precisar aplicar restries para o parmetro tipo. Ao aplicar a where T : class restrio, recomendvel que voc no faa use porque esses operadores testar para identidade de referncia apenas, no para igualdade VALOR. e != operadores sobre o parmetro tipo a == Esse o caso mesmo se esses operadores so sobrecarregados em um tipo usado como um argumento. O cdigo a seguir ilustra este ponto; a sada false, embora a String classe overloads o == operador. C#
public static void OpTest<T>(T s, T t) where T : class { System.Console.WriteLine(s == t); } static void Main() { string s1 = "foo"; System.Text.StringBuilder sb = new System.Text.StringBuilder("foo"); string s2 = sb.ToString(); OpTest<string>(s1, s2); }

A razo para esse comportamento que, ao tempo de compilao, o compilador somente sabe que T um tipo de referncia, e portanto deve utilizar os operadores padro que so vlidos para todos os tipos de referncia. Se voc precisar testar a igualdade valor, a maneira recomendada para tambm aplicar a where T : IComparable<T> restrio e implementar a interface em qualquer classe que ser usado para construir a classe genrica. Unbounded parmetros tipo Parmetros tipo que tm sem restries, como T na classe SampleClass<T>{} pblica, so chamados parmetros tipo unbounded. Parmetros tipo unbounded ter as seguintes regras:

O != e == operadores no podem ser usados porque no h nenhuma garantia que o argumento Tipo concreto oferecer suporte esses operadores. Eles podem ser convertidos de e para System.Object ou explicitamente convertido em qualquer tipo de interface. Voc pode comparar para Nulo. Se um parmetro unbounded comparado com null, a comparao sempre retornar FALSE se o argumento Tipo um tipo de valor.

Visual C# Consolidado

366

Naked restries tipo Quando um parmetro tipo genrico usado como uma restrio, ela chamada uma restrio tipo naked. Restries tipo naked so teis quando uma funo membro com seu prprio Parmetro tipo precisa restringir que parmetro para o parmetro tipo do tipo recipiente, como mostrado no exemplo a seguir: C#
class List<T> { void Add<U>(List<U> items) where U : T {/*...*/} }

No exemplo anterior, T uma restrio naked tipo em um contexto do Add mtodo, e um parmetro tipo unbounded em um contexto de classe List. Restries naked tipo podem ser usadas em definies de classe genrico. Observe que a restrio tipo naked deve tambm ter sido declarada dentro de colchetes angulares juntamente com outros parmetros tipo: C#
//naked type constraint public class SampleClass<T, U, V> where T : V { }

A utilidade de restries tipo naked com classes genricos muito limitada porque o compilador pode assumir nada sobre uma restrio tipo naked exceto que ela deriva de System.Object. Utilizar restries tipo naked em classes genricos em situaes em que voc deseja aplicar uma relao de herana entre dois parmetros tipo.

Representantes genricos (Guia de programao C#)


A Delegar pode definir seus prprios parmetros tipo. Cdigo que o representante genrico pode especificar o argumento Tipo para criar um tipo construdo fechado, assim como quando referncias instanciar uma classe genrico ou chamar um mtodo genrico, conforme mostrado no exemplo o seguir: C#
public delegate void Del<T>(T item); public static void Notify(int i) { } Del<int> m1 = new Del<int>(Notify);

C# 2.0 tem um novo recurso chamado mtodo converso de grupo, que se aplica aos tipos de representante concreto, bem como genrico, e permite que voc para gravar a linha anterior usando esta sintaxe simplificada: C#
Del<int> m2 = Notify;

Representantes definidos em uma classe genrico podem usar os parmetros tipo de classe genrico em da mesma maneira que faa mtodos de classe. C#
class Stack<T> { T[] items; int index; public delegate void StackDelegate(T[] items); }

Cdigo que referencia o representante deve especificar o argumento Tipo da classe que contm, da seguinte maneira: C#

Visual C# Consolidado

367

private static void DoWork(float[] items) { } public static void TestStack() { Stack<float> s = new Stack<float>(); Stack<float>.StackDelegate d = DoWork; }

Representantes genricos so especialmente teis para definir eventos com base no padro design tpica porque o argumento do remetente podem ser digitados altamente e no tem mais para ser convertido de e para Object. C#
delegate void StackEventHandler<T, U>(T sender, U eventArgs); class Stack<T> { public class StackEventArgs : System.EventArgs { } public event StackEventHandler<Stack<T>, StackEventArgs> stackEvent; protected virtual void OnStackChanged(StackEventArgs a) { stackEvent(this, a); } } class SampleClass { public void HandleStackChange<T>(Stack<T> stack, Stack<T>.StackEventArgs args) { } } public static void Test() { Stack<double> s = new Stack<double>(); SampleClass o = new SampleClass(); s.stackEvent += o.HandleStackChange; }

COMO: Criar um bloco iterador para uma lista genrica (Guia de programao C#) Neste exemplo a genrica Classe Stack<T> implementa o Interface IEnumerator<T> Genrico. Uma matriz de tipo T declarada e atribudo valores usando o mtodo Push. No mtodo GetEnumerator, os valores da matriz so retornados usando a yield return instruo. O no-genricos GetEnumerator tambm implementado, porque IEnumerable<T> herdado IEnumerable. Este exemplo mostra a implementao tpica, que para o mtodo no-generic para simplesmente encaminhar a chamada para o mtodo genrico. Exemplo C#
using System.Collections; using System.Collections.Generic; namespace GenericIteratorExample { public class Stack<T> : IEnumerable<T> { private T[] values = new T[100]; private int top = 0; public void Push(T t) { values[top++] = t; } public T Pop() { return values[--top]; } // These make Stack<T> implement IEnumerable<T> allowing // a stack to be used in a foreach statement. public IEnumerator<T> GetEnumerator() { for (int i = top; --i >= 0; ) { yield return values[i]; } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } // Iterate from top to bottom. public IEnumerable<T> TopToBottom { get { // Since we implement IEnumerable<T> // and the default iteration is top to bottom, // just return the object. return this; } } // Iterate from bottom to top. public IEnumerable<T> BottomToTop { get { for (int i = 0; i < top; i++) { yield return values[i]; } } } //A parameterized iterator that return n items from the top public IEnumerable<T> TopN(int n) { // in this example we return less than N if necessary int j = n >= top ? 0 : top - n; for (int i = top; --i >= j; ) { yield return values[i]; } } } //This code uses a stack and the TopToBottom and BottomToTop properties //to enumerate the elements of the stack. class Test { static void Main() { Stack<int> s = new Stack<int>(); for (int i = 0; i < 10; i++) { s.Push(i); } // Prints: 9 8 7 6 5 4 3 2 1 0 // Foreach legal since s implements IEnumerable<int> foreach (int n in s) { System.Console.Write("{0} ", n); } System.Console.WriteLine(); // Prints: 9 8 7 6 5 4 3 2 1 0 // Foreach legal since s.TopToBottom returns IEnumerable<int> foreach (int n in s.TopToBottom) { System.Console.Write("{0} ", n); } System.Console.WriteLine(); // Prints: 0 1 2 3 4 5 6 7 8 9 // Foreach legal since s.BottomToTop returns IEnumerable<int> foreach (int n in s.BottomToTop) { System.Console.Write("{0} ", n); } System.Console.WriteLine(); // Prints: 9 8 7 6 5 4 3 // Foreach legal since s.TopN returns IEnumerable<int> foreach (int n in s.TopN(7)) { System.Console.Write("{0} ", n); } System.Console.WriteLine(); } } }

Visual C# Consolidado

368

Sada
9876543210987654321001234567899876543

COMO: Combinar representantes (Representantes Multicast) (Guia de programao C#) Este exemplo demonstra como compor representantes de difuso seletiva. Uma propriedade de Delegar objetos til que eles podem ser atribudos a instncia um de representante para ser difuso seletiva usando o + operador. Um representante composto chama os representantes ele foi composto de dois. Somente representantes do mesmo tipo podem ser compostos. O - operador pode ser usado para remover um representante componente de um representante composto. Exemplo C#
delegate void Del(string s); class TestClass { static void Hello(string s) { System.Console.WriteLine(" Hello, {0}!", s); } static void Goodbye(string s) { System.Console.WriteLine(" Goodbye, {0}!", s); } static void Main() { Del a, b, c, d; // Create the delegate object a that references // the method Hello: a = Hello; // Create the delegate object b that references // the method Goodbye: b = Goodbye; // The two delegates, a and b, are composed to form c: c = a + b; // Remove a from the composed delegate, leaving d, // which calls only the method Goodbye: d = c - a; System.Console.WriteLine("Invoking delegate a:"); a("A"); System.Console.WriteLine("Invoking delegate b:"); b("B"); System.Console.WriteLine("Invoking delegate c:"); c("C"); System.Console.WriteLine("Invoking delegate d:"); d("D"); } }

Sada
Invoking delegate a: Hello, A! Invoking delegate b: Goodbye, B! Invoking delegate c: Hello, C! Goodbye, C! Invoking delegate d: Goodbye, D!

COMO: Declarar, instanciar e usar um representante (Guia de programao C#) Representantes so declarados como mostrado aqui: C#
public delegate void Del<T>(T item); public void Notify(int i) { }

C#
Del<int> d1 = new Del<int>(Notify);

Em C# 2.0, tambm possvel para declarar uma Delegar essa sintaxe simplificada usando: C#
Del<int> d2 = Notify;

O exemplo a seguir ilustra declarar, instanciar, e usando um representante. A BookDB classe encapsula um banco de dados livraria que mantm um banco de dados de livros. Ela expe um mtodo, ProcessPaperbackBooks,. que localiza todos os paperback livros no banco de dados e chama um representante para cada um O delegate tipo usado chamado ProcessBookDelegate. A Test classe usa esta classe para imprimi-los a ttulos e os livros paperback preo mdio.

Visual C# Consolidado

369

O uso de representantes promove boa separao de funcionalidade entre o banco de dados livraria e o cdigo do cliente. O cdigo do cliente no tem conhecimento de como os livros so armazenados ou como o cdigo livraria localiza livros paperback. O cdigo livraria no tem conhecimento de qual processamento feito nos livros paperback aps ele encontra-los. Exemplo C#
// A set of classes for handling a bookstore: namespace Bookstore { using System.Collections; // Describes a book in the book list: public struct Book { public string Title; // Title of the book. public string Author; // Author of the book. public decimal Price; // Price of the book. public bool Paperback; // Is it paperback? public Book(string title, string author, decimal price, bool paperBack) { Title = title; Author = author; Price = price; Paperback = paperBack; } } // Declare a delegate type for processing a book: public delegate void ProcessBookDelegate(Book book); // Maintains a book database. public class BookDB { // List of all books in the database: ArrayList list = new ArrayList(); // Add a book to the database: public void AddBook(string title, string author, decimal price, bool paperBack) { list.Add(new Book(title, author, price, paperBack)); } // Call a passed-in delegate on each paperback book to process it: public void ProcessPaperbackBooks(ProcessBookDelegate processBook) { foreach (Book b in list) { if (b.Paperback) // Calling the delegate: processBook(b); } } } } // Using the Bookstore classes: namespace BookTestClient { using Bookstore; // Class to total and average prices of books: class PriceTotaller { int countBooks = 0; decimal priceBooks = 0.0m; internal void AddBookToTotal(Book book) { countBooks += 1; priceBooks += book.Price; } internal decimal AveragePrice() { return priceBooks / countBooks; } } // Class to test the book database: class TestBookDB { // Print the title of the book. static void PrintTitle(Book b) { System.Console.WriteLine(" {0}", b.Title); } // Execution starts here. static void Main() { BookDB bookDB = new BookDB(); // Initialize the database with some books: AddBooks(bookDB); // Print all the titles of paperbacks: System.Console.WriteLine("Paperback Book Titles:"); // Create a new delegate object associated with the static // method Test.PrintTitle: bookDB.ProcessPaperbackBooks(PrintTitle); // Get the average price of a paperback by using // a PriceTotaller object: PriceTotaller totaller = new PriceTotaller(); // Create a new delegate object associated with the nonstatic // method AddBookToTotal on the object totaller: bookDB.ProcessPaperbackBooks(totaller.AddBookToTotal); System.Console.WriteLine("Average Paperback Book Price: ${0:#.##}", totaller.AveragePrice()); } // Initialize the book database with some test books: static void AddBooks(BookDB bookDB) { bookDB.AddBook("The C Programming Language", "Brian W. Kernighan and Dennis M. Ritchie", 19.95m, true); bookDB.AddBook("The Unicode Standard 2.0", "The Unicode Consortium", 39.95m, true); bookDB.AddBook("The MS-DOS Encyclopedia", "Ray Duncan", 129.95m, false); bookDB.AddBook("Dogbert's Clues for the Clueless", "Scott Adams", 12.00m, true); } } }

Sada
Paperback Book Titles: The C Programming Language The Unicode Standard 2.0 Dogbert's Clues for the Clueless Average Paperback Book Price: $23.97

Programao robusta

Declarar um representante. A instruo a seguir: C#


public delegate void ProcessBookDelegate(Book book);

declara um novo tipo delegate. Cada tipo delegate descreve o nmero e tipos dos argumentos, e o tipo do valor de retorno dos mtodos que ele pode encapsular. Sempre que um novo

Visual C# Consolidado

370

conjunto de tipos de argumento ou tipo de valor de retorno for necessrio, um novo tipo delegate deve ser declarado.

Instanciar um representante. Depois que um tipo delegate tiver sido declarado, um objeto de representante deve ser criado e associado com um mtodo especfico. No exemplo acima, isso feito, passando o PrintTitle mtodo para o ProcessPaperbackBooks mtodo, como este: C#
bookDB.ProcessPaperbackBooks(PrintTitle);

Isso cria um novo objeto de representante associado o Esttico mtodo Test.PrintTitle. Da mesma forma, passado como este: o mtodo AddBookToTotal no-esttico no objeto totaller C#
bookDB.ProcessPaperbackBooks(totaller.AddBookToTotal);

Em ambos os casos um novo objeto de representante passado para o ProcessPaperbackBooks mtodo. Depois que um representante for criada, o mtodo associado a alteraes nunca; objetos de representante so imutveis.

Chamar um representante. Depois que um objeto de representante for criado, o objeto de representante normalmente passado para outros cdigos que chamar o representante. Um objeto de representante chamado pelo usando o nome do objeto de representante, seguido pelos argumentos parenthesized a serem passados ao representante. Um exemplo de uma chamada de representante : C#
processBook(b);

Um representante ou pode ser chamado de forma sncrona, como, neste exemplo, ou assincronamente por usando BeginInvoke e EndInvoke mtodos. COMO: Usar sobrecarga de operador para criar uma classe para nmeros complexos (Guia de programao C#) Este exemplo mostra como voc pode usar operador sobrecarga para criar uma classe Complex nmero complexo que define adio complexa. O programa exibir o IMAGINARY e as partes dos nmeros e o resultado disso usando uma substituio do mtodo ToString reais. Exemplo C#
public struct Complex { public int real; public int imaginary; public Complex(int real, int imaginary) //constructor { this.real = real; this.imaginary = imaginary; } // Declare which operator to overload (+), // the types that can be added (two Complex objects), // and the return type (Complex): public static Complex operator +(Complex c1, Complex c2) { return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary); } // Override the ToString() method to display a complex number in the traditional format: public override string ToString() { return (System.String.Format("{0} + {1}i", real, imaginary)); } } class TestComplex { static void Main() { Complex num1 = new Complex(2, 3); Complex num2 = new Complex(3, 4); // Add two Complex objects through the overloaded plus operator: Complex sum = num1 + num2; // Print the numbers and the sum using the overriden ToString method: System.Console.WriteLine("First complex number: {0}",

Visual C# Consolidado

371

num1); System.Console.WriteLine("Second complex number: {0}", num2); System.Console.WriteLine("The sum of the two numbers: {0}", sum); } }

Sada
First complex number: 2 + 3i Second complex number: 3 + 4i The sum of the two numbers: 5 + 7i

COMO: Usar interoperabilidade COM para verificar ortografia usando o Word (Guia de programao C#) O exemplo de cdigo a seguir ilustra como usar interoperabilidade COM para usar recursos Spellverificao do Word em seu aplicativo Visual C#. Para obter mais informaes, consulte ProofreadingErrors e Objetos Microsoft Word. Exemplo Este exemplo ilustra como usar Verificador ortogrfico do Word a partir de um aplicativo C#. Cria um novo Word.application objeto usando interoperabilidade COM. Em seguida, utiliza a ProofreadingErrors coleo em um Range objeto e localiza as palavras incorretas no intervalo. C#
using System.Reflection; using Word = Microsoft.Office.Interop.Word; namespace WordSpell { public partial class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.Button button1; private System.Windows.Forms.Label label1; public Form1() //constructor { InitializeComponent(); } private void button1_Click(object sender, System.EventArgs e) { Word.Application app = new Word.Application(); int errors = 0; if (textBox1.Text.Length > 0) { app.Visible = false; // Setting these variables is comparable to passing null to the function. // This is necessary because the C# null cannot be passed by reference. object template = Missing.Value; object newTemplate = Missing.Value; object documentType = Missing.Value; object visible = true; Word._Document doc1 = app.Documents.Add(ref template, ref newTemplate, ref documentType, ref visible); doc1.Words.First.InsertBefore(textBox1.Text); Word.ProofreadingErrors spellErrorsColl = doc1.SpellingErrors; errors = spellErrorsColl.Count; object optional = Missing.Value; doc1.CheckSpelling( ref optional, ref optional, ref optional, ref optional, ref optional, ref optional, ref optional, ref optional, ref optional, ref optional, ref optional, ref optional); label1.Text = errors + " errors corrected "; object first = 0; object last = doc1.Characters.Count - 1; textBox1.Text = doc1.Range(ref first, ref last).Text; } object saveChanges = false; object originalFormat = Missing.Value; object routeDocument = Missing.Value; app.Quit(ref saveChanges, ref originalFormat, ref routeDocument); } } }

Compilando o cdigo Este exemplo requer Word para ser instalado em seu sistema e dependendo da verso do Office voc tiver instalado, o Word conjunto pode ser chamado Microsoft Office 10 Biblioteca de objetos ou biblioteca de objetos 11 Word. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio.

Visual C# Consolidado

372

Para compilar o cdigo


1. 2. 3. Criar um novo projeto aplicativo Windows C# no Visual Studio, e cham-lo WordSpell. Copie o cdigo acima, e col-lo sobre o contedo do arquivo Form1.cs. Copie o cdigo a seguir, e col-lo no Form1.Designer.cs arquivo, o InitializeComponent() mtodo, aps qualquer cdigo existente. C#
this.textBox1 = new System.Windows.Forms.TextBox(); this.button1 = new System.Windows.Forms.Button(); this.label1 = new System.Windows.Forms.Label(); this.SuspendLayout(); // // textBox1 // this.textBox1.Location = new System.Drawing.Point(40, 40); this.textBox1.Multiline = true; this.textBox1.Name = "textBox1"; this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; this.textBox1.Size = new System.Drawing.Size(344, 136); this.textBox1.TabIndex = 0; this.textBox1.Text = ""; // // button1 // this.button1.Location = new System.Drawing.Point(392, 40); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(96, 23); this.button1.TabIndex = 1; this.button1.Text = "Check Spelling"; this.button1.Click += new System.EventHandler(this.button1_Click); // // label1 // this.label1.Location = new System.Drawing.Point(40, 24); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(336, 16); this.label1.TabIndex = 2; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(5, 13); this.ClientSize = new System.Drawing.Size(496, 205); this.Controls.Add(this.label1); this.Controls.Add(this.button1); this.Controls.Add(this.textBox1); this.Name = "Form1"; this.Text = "SpellCheckDemo"; this.ResumeLayout(false);

4.

Incluir o Word conjunto como uma referncia para o projeto. Clique com o boto direito do mouse no projeto, clique em Add Reference, clique na COM guia da caixa Add Reference de dilogo. Clique duas vezes Microsoft Office 11 Object Library, e pressione OK. Observe que as caixas de dilogo e comandos de menu voc ver podem diferir dos descritos na Ajuda dependendo do seu ativos configuraes ou edio. Para alterar as configuraes, escolha Import and Export Settings (Importar e Exportar Configuraes) no menu Tools (Ferramentas). Para mais informaes, consulte Configuraes do Visual Studio.

Segurana Para usar interoperabilidade COM, voc deve ter permisses de segurana de usurio energia ou administrador. Para obter mais informaes, consulte Segurana do .NET Framework. COMO: Usar interoperabilidade COM para criar uma planilha do Excel (Guia de programao C#) O exemplo de cdigo a seguir ilustra como usar COM interop para criar uma Excel planilha. Para obter mais informaes sobre Excel, consulte Objetos do Microsoft Excel, e Mtodo Open Este exemplo ilustra como abrir uma planilha existente Excel no C# using Capacidade .NET Framework COM interop. O Excel conjunto usado para abrir e inserir dados em um intervalo de clulas na planilha Excel. Observao

Visual C# Consolidado

373

Voc deve ter Excel instalado em seu sistema para este cdigo seja executado corretamente. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Para criar uma planilha do Excel com interoperabilidade com 1. 2. 3. 4. Criar um novo aplicativo Console C# no Visual Studio e cham-la CreateExcelWorksheet. Incluir o conjunto Excel como uma referncia para o projeto Right-Click no projeto, selecione Add Reference.: Clique na COM guia da caixa Add Reference de dilogo, e Localizar Microsoft Excel 11 Object Library. Clique duas vezes em Microsoft Excel 11 Object Library, e pressione OK. Observao Dependendo da verso do Office instalada o conjunto Excel pode ser chamado Excel 10 Object Library ou Excel 11 Object Library.. ou Excel 11 Object Library 5. Copie o cdigo a seguir e cole sobre o contedo do arquivo Program.cs. C#
using System; using System.Reflection; using Microsoft.Office.Interop.Excel; public class CreateExcelWorksheet { static void Main() { Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); if (xlApp == null) { Console.WriteLine("EXCEL could not be started. Check that your office installation and project references are correct."); return; } xlApp.Visible = true; Workbook wb = xlApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet); Worksheet ws = (Worksheet)wb.Worksheets[1]; if (ws == null) { Console.WriteLine("Worksheet could not be created. Check that your office installation and project references are correct."); } // Select the Excel cells, in the range c1 to c7 in the worksheet. Range aRange = ws.get_Range("C1", "C7"); if (aRange == null) { Console.WriteLine("Could not get a range. Check to be sure you have the correct versions of the office DLLs."); } // Fill the cells in the C1 to C7 range of the worksheet with the number 6. Object[] args = new Object[1]; args[0] = 6; aRange.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, aRange, args); // Change the cells in the C1 to C7 range of the worksheet to the number 8. aRange.Value2 = 8; } }

Segurana Para usar COM interop, voc deve ter administrator ou Power User permisses de segurana. Para obter mais informaes sobre segurana, consulte Segurana do .NET Framework. COMO: Usar cdigo gerenciado como um suplemento de automao para o Excel (Guia de programao C#) Com os suplementos de automao para o Excel, voc pode usar uma funo pblica de sua biblioteca COM para ser chamado como uma frmula de clula. O exemplo a seguir ilustra como

Visual C# Consolidado

374

criar um suplemento do C# para clculo de imposto de renda TAXA em uma clula em uma planilha do Excel. Automaticamente ComRegisterFunctionAttribute registra as ferramentas add-in, e no adicionais so necessrias para registrar o cdigo gerenciado como um conjunto com. Para obter informaes adicionais, consulte Viso geral sobre de interoperabilidade (guia de programao C#). Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Calcular imposto de renda Uma tabela de imposto tpica permite para calcular o imposto fornecido receita anual de uma pessoa. Por exemplo, a seguir mostra uma tabela de imposto hipottico para indivduos. Uma tabela imposto exemplo 1. 2. 3. 4. 5. 6. Se renda em zero dlares e em $7,000, o imposto 10 por cento da quantidade. Se renda mais de r$ 100,00 7.000 e em $28,400, o imposto 15 por cento da quantidade sobre $7,000 mais $700.00. Se renda mais de r$ 100,00 28,400 e em $68,800, o imposto 25 por cento da quantidade sobre $28,400 mais 3,910.00. Se renda mais de r$ 100,00 68,800 e em $143,500, o imposto 28 por cento da quantidade sobre $68,800 mais $14,010.00. Se renda mais de r$ 100,00 143,500 e em $311,950, o imposto 33 por cento da quantidade sobre $143,500 mais $34,926.00. Se renda for sobre $311,950, o imposto ser 35 por cento da quantidade sobre $311,950 mais $90,514.50. Criar um novo projeto Visual C# Class Library chamado ExcelAddIn. Na janela Propriedades do projeto, abaixo Configuration Properties, Build, na caixa suspensa rotuladas Register for COM Interop selecione True. Configurao do projeto do Visual Studio da compilao dessa propriedade registra automaticamente seu conjunto para interoperabilidade COM. Cole o cdigo a seguir para o arquivo de classe. C#
using System.Runtime.InteropServices; namespace TaxTables { [ClassInterface(ClassInterfaceType.AutoDual)] public class TaxTables { public static double Tax(double income) { if (income > 0 && income <= 7000) {return (.10 * income);} if (income > 7000 && income <= 28400) {return 700.00 + (.15 * (income - 7000));} if (income > 28400 && income <= 68800) {return 3910.00 + (.25 * (income - 28400));} if (income > 68800 && income <= 143500) {return 14010.00 + (.28 * (income - 68800));} if (income > 143500 && income <= 311950) {return 34926.00 + (.33 * (income - 143500));} if (income > 311950) {return 90514.50 + (.35 * (income 311950));} return 0; } [ComRegisterFunctionAttribute] public static void RegisterFunction(System.Type t) { Microsoft.Win32.Registry.ClassesRoot.CreateSubKey ("CLSID\\{"

Criar um suplemento de automao para Excel usando o Visual Studio e cdigo gerenciado 1. 2.

3.

Visual C# Consolidado

375

+ t.GUID.ToString().ToUpper() + "}\\Programmable"); } [ComUnregisterFunctionAttribute] public static void UnregisterFunction(System.Type t) { Microsoft.Win32.Registry.ClassesRoot.DeleteSubKey ("CLSID\\{" + t.GUID.ToString().ToUpper() + "}\\Programmable"); } } }

Executando o cdigo Executar o suplemento do Excel


Criar o ExcelAddIn projeto, e pressione F5 para compil-lo. Abra uma nova pasta de trabalho no Excel. No menu Tools, clique em Add-Ins, e clique em Automation Na caixa de dilogo Servidores de automao, selecione ExcelAddIn na lista de suplementos, e clique em OK Em uma clula pasta de trabalho, digite =Tax(23500). A clula exibir 3175. Para registrar depois de mover o ExcelAddIn.dll para um diretrio diferente, execute regasm com /codebase. Voc pode receber um aviso indicando que o conjunto no assinado. Observe que as caixas de dilogo e comandos de menu voc ver podem diferir dos descritos na Ajuda dependendo do seu ativos configuraes ou edio. Para alterar as configuraes, escolha Import and Export Settings (Importar e Exportar Configuraes) no menu Tools (Ferramentas). Para mais informaes, consulte Configuraes do Visual Studio.

Segurana Para usar a interoperabilidade COM, voc deve ter permisses de segurana de usurio energia ou administrador. Para obter mais informaes, consulte Segurana do .NET Framework. COMO: Usar servios de chamada da plataforma para reproduzir um arquivo WAVE (Guia de programao C#) O exemplo de cdigo C# a seguir ilustra como usar plataforma invocar servios para reproduzir um arquivo de som wave na plataforma Windows. Exemplo Este cdigo de exemplo usa DllImport para ponto de entrada mtodo de importao winmm.dll na PlaySound como Form1 PlaySound(). O exemplo tem um Windows Form simples com um boto. Clicar no boto abre uma caixa de dilogo padro janelas OpenFileDialog para que voc possa abri um arquivo para executar. Quando um arquivo wave selecionado, ela disputada usando o PlaySound() mtodo do mtodo do conjunto winmm.DLL. Para obter mais informaes no mtodo winmm.DLL na PlaySound, consulte Usando. Procurar e selecione um arquivo com uma extenso.wav, e, em seguida clique em Open Para executar o arquivo wave usando plataforma chamar. Uma caixa de texto mostra o caminho completo do arquivo selecionado. Caixa Open Files de dilogo filtrada para mostrar somente arquivos com uma extenso.wav atravs das configuraes de filtro: C#
dialog1.Filter = "Wav Files (*.wav)|*.wav";

C#
using System.Windows.Forms; namespace WinSound { public partial class Form1 : Form { private TextBox textBox1; private Button button1; public Form1() //constructor { InitializeComponent(); }

Visual C# Consolidado

376

[System.Runtime.InteropServices.DllImport("winmm.DLL", EntryPoint = "PlaySound", SetLastError = true)] private static extern bool PlaySound(string szSound, System.IntPtr hMod, PlaySoundFlags flags); [System.Flags] public enum PlaySoundFlags : int { SND_SYNC = 0x0000, SND_ASYNC = 0x0001, SND_NODEFAULT = 0x0002, SND_LOOP = 0x0008, SND_NOSTOP = 0x0010, SND_NOWAIT = 0x00002000, SND_FILENAME = 0x00020000, SND_RESOURCE = 0x00040004 } private void button1_Click (object sender, System.EventArgs e) { OpenFileDialog dialog1 = new OpenFileDialog(); dialog1.Title = "Browse to find sound file to play"; dialog1.InitialDirectory = @"c:\"; dialog1.Filter = "Wav Files (*.wav)|*.wav"; dialog1.FilterIndex = 2; dialog1.RestoreDirectory = true; if(dialog1.ShowDialog() == DialogResult.OK) { textBox1.Text = dialog1.FileName; PlaySound (dialog1.FileName, new System.IntPtr(), PlaySoundFlags.SND_SYNC); } } } }

Compilando o cdigo

Para compilar o cdigo


1. 2. 3. Criar um novo projeto aplicativo Windows C# no Visual Studio e denomine-WinSound. Copie o cdigo acima, e col-lo sobre o contedo do arquivo Form1.cs. Copie o cdigo a seguir, e col-lo no Form1.Designer.cs arquivo, o InitializeComponent() mtodo, aps qualquer cdigo existente. C#
this.button1 = new System.Windows.Forms.Button(); this.textBox1 = new System.Windows.Forms.TextBox(); this.SuspendLayout(); // // button1 // this.button1.Location = new System.Drawing.Point(192, 40); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(88, 24); this.button1.TabIndex = 0; this.button1.Text = "Browse"; this.button1.Click += new System.EventHandler(this.button1_Click); // // textBox1 // this.textBox1.Location = new System.Drawing.Point(8, 40); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(168, 20); this.textBox1.TabIndex = 1; this.textBox1.Text = "FIle path"; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(5, 13); this.ClientSize = new System.Drawing.Size(292, 266); this.Controls.Add(this.textBox1); this.Controls.Add(this.button1); this.Name = "Form1"; this.Text = "Platform Invoke WinSound C#"; this.ResumeLayout(false); this.PerformLayout();

4.

Compile e executar o cdigo.

HOW TO: Use ponteiros para copiar uma matriz de bytes (guia de programao C#) O exemplo a seguir utiliza ponteiros para copiar bytes de uma matriz para outro usando ponteiros. Este exemplo usa a No seguro palavra-chave, que permite ponteiros a ser usado no mtodo Copy. A Fixo instruo usada para declarar ponteiros para as matrizes origem e destino. Isso Pinos o local da origem e destino matriz na memria para que eles no sero movidos por coleta de lixo. Esses blocos de memria ser unpinneds quando conclui o fixed Bloco. Porque a funo Copiar neste exemplo usa a unsafe palavra-chave, ele deve ser compilado com /unsafe Opo de compilador. Exemplo C#
// compile with: /unsafe

Visual C# Consolidado

377

C#
class TestCopy { // The unsafe keyword allows pointers to be used within the following method: static unsafe void Copy(byte[] src, int srcIndex, byte[] dst, int dstIndex, int count) { if (src == null || srcIndex < 0 || dst == null || dstIndex < 0 || count < 0) { throw new System.ArgumentException(); } int srcLen = src.Length; int dstLen = dst.Length; if (srcLen - srcIndex < count || dstLen - dstIndex < count) { throw new System.ArgumentException(); } // The following fixed statement pins the location of the src and dst objects // in memory so that they will not be moved by garbage collection. fixed (byte* pSrc = src, pDst = dst) { byte* ps = pSrc; byte* pd = pDst; // Loop over the count in blocks of 4 bytes, copying an integer (4 bytes) at a time: for (int i = 0 ; i < count / 4 ; i++) { *((int*)pd) = *((int*)ps); pd += 4; ps += 4; } // Complete the copy by moving any bytes that weren't moved in blocks of 4: for (int i = 0; i < count % 4 ; i++) { *pd = *ps; pd++; ps++; } } } static void Main() { byte[] a = new byte[100]; byte[] b = new byte[100]; for (int i = 0; i < 100; ++i) { a[i] = (byte)i; } Copy(a, 0, b, 0, 100); System.Console.WriteLine("The first 10 elements are:"); for (int i = 0; i < 10; ++i) { System.Console.Write(b[i] + " "); } System.Console.WriteLine("\n"); } }

Sada
The first 10 elements are: 0 1 2 3 4 5 6 7 8 9

COMO: Usar a funo ReadFile do Windows (Guia de programao C#) Este exemplo demonstra a funo do Windows ReadFile, ler e exibir um arquivo de texto. A ReadFile funo requer o uso de unsafe CDIGO porque ele requer um ponteiro como um parmetro. A matriz de bytes passada para a Read funo um tipo gerenciado. Isso significa que comuns o coletor de lixo Runtime (CLR) de idioma pode realocar a memria usada pela matriz em ser. Para evitar isso, Fixo usado para obter um apontador para a memria e marc-la assim ele no ser movido o coletor de lixo. No final do bloco fixed, a memria retorna automaticamente para sendo sujeitos a percorrendo coleta de lixo. Esse recurso conhecido como declarativa pinning. A parte boa sobre pinning que no h sobrecarga muito pouco a menos que uma coleta de lixo ocorre em bloco fixed, que pouco provvel. Exemplo C#
class FileReader { const uint GENERIC_READ = 0x80000000; const uint OPEN_EXISTING = 3; System.IntPtr handle; [System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true)] static extern unsafe System.IntPtr CreateFile ( string FileName, // file name uint DesiredAccess, // access mode uint ShareMode, // share mode uint SecurityAttributes, // Security Attributes uint CreationDisposition, // how to create uint FlagsAndAttributes, // file attributes int hTemplateFile // handle to template file ); [System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true)] static extern unsafe bool ReadFile ( System.IntPtr hFile, // handle to file void* pBuffer, // data buffer int NumberOfBytesToRead, // number of bytes to read int* pNumberOfBytesRead, // number of bytes read int Overlapped // overlapped buffer ); [System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true)] static extern unsafe bool CloseHandle ( System.IntPtr hObject // handle to object ); public bool Open(string FileName) { // open the existing file for reading handle = CreateFile ( FileName, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0 ); if (handle != System.IntPtr.Zero) { return true; } else { return false; } } public unsafe int Read(byte[] buffer, int index, int count) { int n = 0; fixed (byte* p = buffer) { if (!ReadFile(handle, p + index, count, &n, 0)) { return 0; } } return n; } public bool Close() { return CloseHandle(handle); } } class Test { static int

Visual C# Consolidado

378

Main(string[] args) { if (args.Length != 1) { System.Console.WriteLine("Usage : ReadFile <FileName>"); return 1; } if (!System.IO.File.Exists(args[0])) { System.Console.WriteLine("File " + args[0] + " not found."); return 1; } byte[] buffer = new byte[128]; FileReader fr = new FileReader(); if (fr.Open(args[0])) { // Assume that an ASCII file is being read. System.Text.ASCIIEncoding Encoding = new System.Text.ASCIIEncoding(); int bytesRead; do { bytesRead = fr.Read(buffer, 0, buffer.Length); string content = Encoding.GetString(buffer, 0, bytesRead); System.Console.Write("{0}", content); } while (bytesRead > 0); fr.Close(); return 0; } else { System.Console.WriteLine("Failed to open requested file"); return 1; } } }

COMO: Criar e terminar threads (Guia de programao C#) Este exemplo demonstra como um segmento auxiliar ou operador pode ser criados e usado para realizar processamento em paralelo com o segmento primrio. Tornando um segmento esperar por outro e normalmente Finalizando um segmento tambm so demonstrou. Para obter informaes detalhadas e Usando Threading (C# programao guia). em consulte Segmentao gerenciada Multi-Threading, O exemplo cria uma classe denominada Worker que contm o mtodo que o segmento de trabalho ser executado chamado DoWork. Isso basicamente a Main funo para o segmento de trabalho. O segmento de trabalho chamar esse mtodo, comece a execuo e finalizar automaticamente quando esse mtodo retorna. O DoWork mtodo tem a seguinte aparncia: C#
public void DoWork() { while (!_shouldStop) { Console.WriteLine("worker thread: working..."); } Console.WriteLine("worker thread: terminating gracefully."); }

A Worker classe contm um mtodo adicional que usado para indicar aos DoWork que ela deve retornar. Esse mtodo for chamado RequestStop, e tem a seguinte aparncia: C#
public void RequestStop() { _shouldStop = true; }

O RequestStop mtodo simplesmente atribui o _shouldStop membro dados para true. Porque esse membro de dados fica marcado como o DoWork mtodo, isso tem o efeito de causar DoWork para retornar, INDIRETO assim encerrando o segmento de trabalho. No entanto, importante observar que DoWork e RequestStop ser executado por diferentes segmentos. DoWork executado pelo segmento de trabalho, e RequestStop executado pelo segmento primrio, para o _shouldStop membro dos dados declarado volatile, como isso: C#
private volatile bool _shouldStop;

Palavra-chave volatile alerta o compilador vrios segmentos acessar o _shouldStop membro dos dados, e portanto ele no deve fazer suposies de otimizao sobre o estado deste membro. Para obter mais informaes, consulte voltil (referncia C#). O uso volatile com o _shouldStop Membro de dados permite que ns para com segurana acessar este membro de vrios segmentos sem o uso de segmento formal tcnicas de sincronizao, mas apenas porque _shouldStop . um bool Isso significa que operaes somente nico e atmicas so necessrias para modificar _shouldStop. Se, contudo, esse membro de dados eram uma classe, estrutura, ou matriz, acessando-de vrios segmentos, provavelmente resultam em corrupo de dados intermitentes. Considere um segmento que altera os valores em uma matriz. Windows regularmente interrompe segmentos para permitir que outros segmentos para executar,

Visual C# Consolidado

379

para este segmento pode ser interrompido aps atribuir alguns elementos da matriz, mas antes de atribuir outros. Isso significa a matriz agora tem um estado que o programador nunca pretendido, e outro segmento ler essa matriz pode falhar como resultado. Antes de realmente criar o segmento de trabalho, a Main funo cria uma instncia de Thread um Worker objeto e. O objeto do segmento est configurado para usar o Worker.DoWork mtodo como uma entrada ponto, passando uma referncia a esse mtodo para o Thread Construtor, como este: C#
Worker workerObject = new Worker(); Thread workerThread = new Thread(workerObject.DoWork);

Nesse ponto, embora o objeto do segmento de trabalho existir e estiver configurada, o segmento de trabalho real foi ainda criado. Isso no acontecer at Main Chamadas o Start mtodo: C#
workerThread.Start();

Neste ponto, o sistema inicia a execuo do segmento de trabalho, mas no to assincronamente para o segmento primrio. Isso significa que a Main funo continua a executar cdigo imediatamente enquanto o segmento de trabalho simultaneamente undergoes inicializao. Para garantir que a Main funo no tentar encerrar o segmento de trabalho antes ele tem a oportunidade de executar, a Main funo entrar em loop at o operador segmento definido obtm propriedade do objeto IsAlive como true: C#
while (!workerThread.IsAlive);

Em seguida, o segmento primrio interrompido brevemente com uma chamada para Sleep. Isso insures funo do segmento DoWork de trabalho que ser executado o loop dentro o DoWork Mtodo de iteraes de alguns antes a Main funo executa os comandos mais: C#
Thread.Sleep(1);

Aps o milissegundo 1 expirar, Main sinais para o objeto do segmento de trabalho que ele deve terminar usando o Worker.RequestStop mtodo apresentado anteriormente: C#
workerObject.RequestStop();

Tambm possvel para finalizar um segmento de outro segmento com uma chamada para Abort, mas isso fora termina o segmento afetado sem preocupao para se ele concluiu a tarefa e oferece nenhum Oportunidade para a limpeza de recursos. A tcnica mostrada nesse exemplo prefervel. Finalmente, a Main funo chama o Join mtodo para o objeto do segmento de trabalho. Este mtodo faz o segmento atual para bloquear, ou espera, at que o segmento que representa o objeto termina. Portanto, Join no retornar at o operador segmento retorna, assim encerrando prprio: C#

Visual C# Consolidado

380

workerThread.Join();

Neste ponto apenas o segmento primrio executando Main existe. Ele exibe uma mensagem final, e depois retorna, encerrando o segmento primrio, bem. O exemplo completo aparece abaixo. Exemplo C#
using System; using System.Threading; public class Worker { // This method will be called when the thread is started. public void DoWork() { while (!_shouldStop) { Console.WriteLine("worker thread: working..."); } Console.WriteLine("worker thread: terminating gracefully."); } public void RequestStop() { _shouldStop = true; } // Volatile is used as hint to the compiler that this data // member will be accessed by multiple threads. private volatile bool _shouldStop; } public class WorkerThreadExample { static void Main() { // Create the thread object. This does not start the thread. Worker workerObject = new Worker(); Thread workerThread = new Thread(workerObject.DoWork); // Start the worker thread. workerThread.Start(); Console.WriteLine("main thread: Starting worker thread..."); // Loop until worker thread activates. while (!workerThread.IsAlive); // Put the main thread to sleep for 1 millisecond to // allow the worker thread to do some work: Thread.Sleep(1); // Request that the worker thread stop itself: workerObject.RequestStop(); // Use the Join method to block the current thread // until the object's thread terminates. workerThread.Join(); Console.WriteLine("main thread: Worker thread has terminated."); } }

Sada de exemplo
main thread: starting worker thread... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: terminating gracefully... main thread: worker thread has terminated

Como sincronizar um Producer e um segmento do consumidor (guia de programao C#): Segmento sincronizao entre o segmento primrio e dois segmentos de trabalho usando a lock palavra-chave, o exemplo a seguir demonstra e AutoResetEvent. e ManualResetEvent Classes Para obter mais informaes, consulte Declarao lock (Referncia do C#). O exemplo cria duas auxiliares, ou segmentos de trabalho. Um segmento produz elementos e as armazena em uma fila genrica que No isenta de segmentos. Para obter mais informaes, consulte Queue.O outro segmento consome itens nessa fila. Alm disso, o segmento primrio periodicamente exibe o contedo da fila, para a fila acessada por trs segmentos. Palavra-chave lock usado para sincronizar o acesso para a fila para garantir que o estado da fila no est corrompido. Alm de simplesmente impedindo acesso simultneo com a lock palavra-chave, mais sincronizao fornecida por dois objetos de evento. Um usado para sinalizar a segmentos de trabalho para encerrar, e o outro usado pelo segmento Producer para sinalizar ao segmento do consumidor quando um novo item foi adicionado fila. Esses objetos dois de eventos so encapsulados em uma classe chamada SyncEvents. Isso permite que os eventos devem ser passados para os objetos que representam os segmentos consumidor e o Producer facilmente. A SyncEvents classe definida como este: C#

Visual C# Consolidado

381

public class SyncEvents { public SyncEvents() { _newItemEvent = new AutoResetEvent(false); _exitThreadEvent = new ManualResetEvent(false); _eventArray = new WaitHandle[2]; _eventArray[0] = _newItemEvent; _eventArray[1] = _exitThreadEvent; } public EventWaitHandle ExitThreadEvent { get { return _exitThreadEvent; } } public EventWaitHandle NewItemEvent { get { return _newItemEvent; } } public WaitHandle[] EventArray { get { return _eventArray; } } private EventWaitHandle _newItemEvent; private EventWaitHandle _exitThreadEvent; private WaitHandle[] _eventArray; }

A AutoResetEvent classe usada para o novo item " " evento porque voc deseja esse evento para redefinir automaticamente cada vez o responde do segmento do consumidor para este evento. Como alternativa, a ManualResetEvent classe usada para o evento " Sair " porque voc deseja vrios segmentos a responder quando esse evento sinalizado. O evento se voc usou AutoResetEvent Em vez disso, seria reverter para um estado no-signaled depois apenas um segmento respondeu ao evento. O outro segmento no pode responder, e, nesse caso, falhar encerrar. A SyncEvents classe cria os dois eventos e armazena-los de duas formas diferentes e ManualResetEvent,.: como EventWaitHandle, que a classe base para ambos AutoResetEvent e em uma matriz com base em WaitHandle Como voc ver na discusso do segmento do consumidor, essa matriz necessrio para que o segmento do consumidor pode responder a qualquer evento. Os segmentos consumidor e o Producer so representados pelas classes chamados Consumer e Producer, ambos os quais definir um mtodo chamado ThreadRun. Esses mtodos so usados como os pontos de entrada para a segmentos de trabalho que cria o Main mtodo. O ThreadRun mtodo definido pela classe Producer tem a seguinte aparncia: C#
// Producer.ThreadRun public void ThreadRun() { int count = 0; Random r = new Random(); while (!_syncEvents.ExitThreadEvent.WaitOne(0, false)) { lock (((ICollection)_queue).SyncRoot) { while (_queue.Count < 20) { _queue.Enqueue(r.Next(0,100)); _syncEvents.NewItemEvent.Set(); count++; } } } Console.WriteLine("Producer thread: produced {0} items", count); }

Esse mtodo entrar em loop at o evento " Sair segmento " torna-se sinalizado. O estado deste evento testado com o WaitOne mtodo, usando a ExitThreadEvent propriedade definida pela classe SyncEvents. Nesse caso o estado do evento verificado sem bloquear o segmento atual porque o primeiro argumento usado com WaitOne zero, indicando que o mtodo deve retornar imediatamente. Se WaitOne retorna true, e o evento em questo atualmente sinalizado. Se o ThreadRun mtodo retorna, ento, que tem o efeito de encerrando o segmento de trabalho executando esse mtodo. At que o evento " Sair segmento " indicado, o Producer.ThreadStart mtodo tenta manter itens 20 na fila. Um item simplesmente um inteiro entre 0 e 100. A coleo deve estar bloqueada antes de adicionar novos itens para impedir que o consumidor e segmentos primrio acessem a coleo simultaneamente. Isso feito com a lock palavra-chave. O argumento passado para lock o SyncRoot campo exposto por meio da interface ICollection. Este campo fornecido especificamente para sincronizam acesso do segmento. Exclusivo acesso para a coleo concedido para as instrues contidas no bloco de cdigo seguinte lock. Para cada novo item que adiciona o Producer para a fila, uma chamada evento feito para o Set mtodo no novo item " ". Isso informa o segmento do consumidor a surgir de seu estado suspenso para processar o novo item.

Visual C# Consolidado

382

O Consumer objeto tambm define um mtodo chamado ThreadRun. Como o Producer na verso do ThreadRun, esse mtodo executado por um segmento de trabalho criado pelo mtodo Main. No entanto, a verso do ThreadStart consumidor deve responder a dois eventos. O Consumer.ThreadRun mtodo tem a seguinte aparncia: C#
// Consumer.ThreadRun public void ThreadRun() { int count = 0; while (WaitHandle.WaitAny(_syncEvents.EventArray) != 1) { lock (((ICollection)_queue).SyncRoot) { int item = _queue.Dequeue(); } count++; } Console.WriteLine("Consumer Thread: consumed {0} items", count); }

Esse mtodo usa WaitAny para bloquear o segmento do consumidor at qualquer uma das alas de espera na matriz fornecido ficar sinalizada. Nesse caso, h duas alas em matriz, um para encerrando a segmentos de trabalho, e um para indicar que um novo item foi adicionado coleo. Retorna WaitAny o ndice do evento que se tornou sinalizado. O novo item " " evento o primeiro na matriz, para um ndice de zero indica um novo item. Nesse caso verificar um ndice de 1, que indica o evento " Sair segmento ", e isso usado para determinar se esse mtodo continua a consumir itens. Se evento foi sinalizado, obter acesso exclusivo para a coleo com lock e consumir o novo item. o novo item " " Porque este exemplo produz e consome milhares de itens, voc no exibir cada item consumida. Em vez disso use Main para periodicamente exibir o contedo da fila, conforme ir ser demonstrado. O Main mtodo comea com a criao a fila cujo contedo ser produzido e consumidos e uma instncia do SyncEvents, que voc pesquisado no anteriormente: C#
Queue<int> queue = new Queue<int>(); SyncEvents syncEvents = new SyncEvents();

Do Producer em seguida, Main configura e Consumer objetos para uso com segmentos de trabalho. Essa etapa no no, entretanto, criar ou iniciar a segmentos de trabalho real: C#
Producer producer = new Producer(queue, syncEvents); Consumer consumer = new Consumer(queue, syncEvents); Thread producerThread = new Thread(producer.ThreadRun); Thread consumerThread = new Thread(consumer.ThreadRun);

Observe que a fila e o objeto de evento de sincronizao so passados para dois e Producer segmentos como argumentos de construtor. o Consumer Isso fornece os dois objetos com os recursos compartilhados necessrios para executar suas tarefas respectivas. Dois objetos novos Thread depois so criados, usando o ThreadRun mtodo para cada objeto como um argumento. Cada segmento de trabalho, quando iniciado, utilizar esse argumento como o ponto de entrada para o segmento. Em seguida Main inicia a segmentos dois trabalho com uma chamada para o Start mtodo, como este: C#
producerThread.Start(); consumerThread.Start();

Nesse ponto, os dois segmentos de trabalho novo so criados e Iniciar Execuo assncrona, independente do segmento primrio que est em execuo o Main mtodo. Na verdade, a prxima coisa Main no suspender o segmento principal com uma chamada para o Sleep mtodo. O mtodo suspende o segmento atualmente em execuo para um determinado nmero

Visual C# Consolidado

383

de milissegundos. Depois que esse intervalo expirar, Main reativado, em que ponto ele exibe o contedo da fila. Repete Main esta para quatro iteraes, como este: C#
for (int i=0; i<4; i++) { Thread.Sleep(2500); ShowQueueContents(queue); }

Finalmente, Main sinaliza a segmentos de trabalho para encerrar, chamar o Set mtodo do evento " do segmento de sada ", e chama o Join mtodo em cada segmento de trabalho para bloquear o segmento primrio at que cada segmento do operador responder ao evento e termina. No um exemplo final da sincronizao do segmento: o ShowQueueContents mtodo. Esse mtodo, como os segmentos consumidor e o Producer, usa lock para obter acesso exclusivo para a fila. Nesse caso, entretanto, acesso exclusivo particularmente importante, porque ShowQueueContents. enumera em toda a coleo Enumerando sobre uma coleo uma operao que est especialmente propensa a corrupo de dados por operaes assncronas porque ela envolve atravessando o contedo de toda a coleo. O ShowQueueContents mtodo tem a seguinte aparncia: C#
syncEvents.ExitThreadEvent.Set(); producerThread.Join(); consumerThread.Join();

Finalmente, observe que ShowQueueContents, porque ela chamada por Main, executado pelo segmento primrio. Isso significa que esse mtodo, quando ele obtm acesso exclusivo fila item, na verdade est bloqueando os dois segmentos Producer e pelo consumidor de acessar a fila. Bloqueia ShowQueueContents a fila e enumera o contedo: C#
private static void ShowQueueContents(Queue<int> q) { lock (((ICollection)q).SyncRoot) { foreach (int item in q) { Console.Write("{0} ", item); } } Console.WriteLine(); }

O exemplo completo segue. Exemplo C#


using System; using System.Threading; using System.Collections; using System.Collections.Generic; public class SyncEvents { public SyncEvents() { _newItemEvent = new AutoResetEvent(false); _exitThreadEvent = new ManualResetEvent(false); _eventArray = new WaitHandle[2]; _eventArray[0] = _newItemEvent; _eventArray[1] = _exitThreadEvent; } public EventWaitHandle ExitThreadEvent { get { return _exitThreadEvent; } } public EventWaitHandle NewItemEvent { get { return _newItemEvent; } } public WaitHandle[] EventArray { get { return _eventArray; } } private EventWaitHandle _newItemEvent; private EventWaitHandle _exitThreadEvent; private WaitHandle[] _eventArray; } public class Producer { public Producer(Queue<int> q, SyncEvents e) { _queue = q; _syncEvents = e; } // Producer.ThreadRun public void ThreadRun() { int count = 0; Random r = new Random(); while (!_syncEvents.ExitThreadEvent.WaitOne(0, false)) { lock (((ICollection)_queue).SyncRoot) { while (_queue.Count < 20) { _queue.Enqueue(r.Next(0,100)); _syncEvents.NewItemEvent.Set(); count++; } } } Console.WriteLine("Producer thread: produced {0} items", count); } private Queue<int> _queue; private SyncEvents _syncEvents; } public class Consumer { public Consumer(Queue<int> q, SyncEvents e) { _queue = q; _syncEvents = e; } // Consumer.ThreadRun public void ThreadRun() { int count = 0; while (WaitHandle.WaitAny(_syncEvents.EventArray) != 1) { lock (((ICollection)_queue).SyncRoot) { int item =

Visual C# Consolidado

384

_queue.Dequeue(); } count++; } Console.WriteLine("Consumer Thread: consumed {0} items", count); } private Queue<int> _queue; private SyncEvents _syncEvents; } public class ThreadSyncSample { private static void ShowQueueContents(Queue<int> q) { lock (((ICollection)q).SyncRoot) { foreach (int item in q) { Console.Write("{0} ", item); } } Console.WriteLine(); } static void Main() { Queue<int> queue = new Queue<int>(); SyncEvents syncEvents = new SyncEvents(); Console.WriteLine("Configuring worker threads..."); Producer producer = new Producer(queue, syncEvents); Consumer consumer = new Consumer(queue, syncEvents); Thread producerThread = new Thread(producer.ThreadRun); Thread consumerThread = new Thread(consumer.ThreadRun); Console.WriteLine("Launching producer and consumer threads..."); producerThread.Start(); consumerThread.Start(); for (int i=0; i<4; i++) { Thread.Sleep(2500); ShowQueueContents(queue); } Console.WriteLine("Signaling threads to terminate..."); syncEvents.ExitThreadEvent.Set(); producerThread.Join(); consumerThread.Join(); } }

Sada de exemplo
Configuring worker threads... Launching producer and consumer threads... 22 92 64 70 13 59 9 2 43 52 91 98 50 96 46 22 40 94 24 87 79 54 5 39 21 29 77 77 1 68 69 81 4 75 43 70 87 72 59 0 69 98 54 92 16 84 61 30 45 50 17 86 16 59 20 73 43 21 38 46 84 59 11 87 77 5 53 65 7 16 66 26 79 74 26 37 56 92 Signalling threads to terminate... Consumer Thread: consumed 1053771 items Producer thread: produced 1053791 items

COMO: Usar um pool de threads (Guia de programao C#) A pool de segmentos uma coleo de segmentos que podem ser usados para executar um nmero de tarefas em segundo plano. (Consulte Usando Threading Para obter informaes detalhadas.) Isso deixa o segmento primrio livre para executar outras tarefas de forma assncrona. Pools segmento geralmente so empregados em aplicativos de servidor. Cada solicitao de entrada atribuda a um segmento do pool do segmento, para a solicitao pode ser processada de forma assncrona, sem atrasar o processamento de solicitaes subseqentes amarrando backup o segmento primrio ou. Depois que um segmento no pool conclui a tarefa, ele retornado para uma fila de segmentos de espera, onde ele pode ser reutilizado. Essa reutilizao permite que aplicativos para evitar o custo de criar um novo segmento para cada tarefa. Pools segmento normalmente ter um nmero mximo de segmentos. Se estiver ocupados, todos os segmentos tarefas adicionais so colocadas na fila at que eles podem ser atendidos medida segmentos se tornam disponveis. Voc pode implementar seu prprio pool do segmento, mas ele mais fcil de usar o pool de segmentos fornecido pelo .NET Framework por meio da ThreadPool classe. O exemplo a seguir usa o pool de segmentos do .NET Framework para calcular o Fibonacci resultado de dez nmeros entre 20 e 40. Cada Fibonacci resultado representado pela classe Fibonacci, que fornece um mtodo chamado ThreadPoolCallback que executa o clculo. Um objeto que representa cada valor Fibonacci criado e passado para QueueUserWorkItem o ThreadPoolCallback mtodo que atribui um segmento disponvel no pool para executar o mtodo. Como cada Fibonacci objeto dado um valor semi-Random para calcular, e como ser cada um dos segmentos dez ser competindo de Tempo processador, no h um meio para ser instrudos com antecedncia quanto tempo levar para todos os resultados dez deve ser calculado. por isso que cada Fibonacci objeto passado uma instncia da classe ManualResetEvent durante a

Visual C# Consolidado

385

construo. Cada objeto sinaliza o objeto de evento fornecido quando seu clculo estiver concludo, que permite o segmento primrio para execuo de bloco com WaitAll at que todos os objetos dez Fibonacci ter calculado um resultado. O Main mtodo exibir cada Fibonacci resultado. Exemplo C#
using System; using System.Threading; public class Fibonacci { public Fibonacci(int n, ManualResetEvent doneEvent) { _n = n; _doneEvent = doneEvent; } // Wrapper method for use with thread pool. public void ThreadPoolCallback(Object threadContext) { int threadIndex = (int)threadContext; Console.WriteLine("thread {0} started...", threadIndex); _fibOfN = Calculate(_n); Console.WriteLine("thread {0} result calculated...", threadIndex); _doneEvent.Set(); } // Recursive method that calculates the Nth Fibonacci number. public int Calculate(int n) { if (n <= 1) { return n; } return Calculate(n - 1) + Calculate(n - 2); } public int N { get { return _n; } } private int _n; public int FibOfN { get { return _fibOfN; } } private int _fibOfN; private ManualResetEvent _doneEvent; } public class ThreadPoolExample { static void Main() { const int FibonacciCalculations = 10; // One event is used for each Fibonacci object ManualResetEvent[] doneEvents = new ManualResetEvent[FibonacciCalculations]; Fibonacci[] fibArray = new Fibonacci[FibonacciCalculations]; Random r = new Random(); // Configure and launch threads using ThreadPool: Console.WriteLine("launching {0} tasks...", FibonacciCalculations); for (int i = 0; i < FibonacciCalculations; i++) { doneEvents[i] = new ManualResetEvent(false); Fibonacci f = new Fibonacci(r.Next(20,40), doneEvents[i]); fibArray[i] = f; ThreadPool.QueueUserWorkItem(f.ThreadPoolCallback, i); } // Wait for all threads in pool to calculation... WaitHandle.WaitAll(doneEvents); Console.WriteLine("All calculations are complete."); // Display the results... for (int i= 0; i<FibonacciCalculations; i++) { Fibonacci f = fibArray[i]; Console.WriteLine("Fibonacci({0}) = {1}", f.N, f.FibOfN); } } }

Sada de exemplo
launching 10 tasks... result calculated... result calculated... result calculated... result calculated... result calculated... result calculated... result calculated... result calculated... result calculated... result calculated... all calculations complete Fibonacci(22) = 17711 Fibonacci(25) = 75025 Fibonacci(32) = 2178309 Fibonacci(36) = 14930352 Fibonacci(32) = 2178309 Fibonacci(26) = 121393 Fibonacci(35) = 9227465 Fibonacci(23) = 28657 Fibonacci(39) = 63245986 Fibonacci(22) = 17711

COMO: Pesquisar em seqncias de caracteres utilizando expresses regulares (Guia de programao C#) A System.Text.RegularExpressions.Regex classe pode ser usada para procurar seqncias. Essas pesquisas podem variar em complexidade de muito simples a fazer uso total de expresses regulares. A seguir so dois exemplos de seqncia pesquisar usando a Regex classe. Para obter mais informaes, consulte Expresses regulares .NET Framework. Exemplo O cdigo a seguir um aplicativo de console que realiza uma pesquisa simples maisculas de minsculas das seqncias de caracteres em uma matriz. O mtodo System.Text.RegularExpressions.Regex.IsMatch(System.String,System.String,System.Text.Regul arExpressions.RegexOptions) esttico executa a pesquisa fornecida seqncia para pesquisar e uma seqncia contendo o padro de pesquisa. Nesse caso, um argumento terceiro usado para indicar que caso deve ser ignorado. Para obter mais informaes, consulte System.Text.RegularExpressions.RegexOptions.

Visual C# Consolidado

386

C#
class TestRegularExpressions { static void Main() { string[] sentences = { "cow over the moon", "Betsy the Cow", "cowering in the corner", "no match here" }; string sPattern = "cow"; foreach (string s in sentences) { System.Console.Write("{0,24}", s); if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase)) { System.Console.WriteLine(" (match for '{0}' found)", sPattern); } else { System.Console.WriteLine(); } } } }

Sada
cow over the moon (match for 'cow' found) Betsy the Cow (match for 'cow' found) cowering in the corner (match for 'cow' found) no match here

O cdigo a seguir um aplicativo de console que usa expresses regulares para validar o formato da cada seqncia em uma matriz. A validao requer que cada seqncia assumem a forma de um nmero de telefone no qual trs grupos de dgitos so separados por hfen, os primeiros dois grupos conter trs dgitos, e o terceiro grupo contm quatro dgitos. Isso feito com a expresso ^\\d{3}-\\d{3}-\\d{4}$ regular. Para obter mais informaes, consulte Elementos de idioma de expresses regulares. C#
class TestRegularExpressionValidation { static void Main() { string[] numbers = { "123-456-7890", "444234-22450", "690-203-6578", "146-893-232", "146-839-2322", "4007-295-1111", "407-295-1111", "407-25555", }; string sPattern = "^\\d{3}-\\d{3}-\\d{4}$"; foreach (string s in numbers) { System.Console.Write("{0,14}", s); if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern)) { System.Console.WriteLine(" - valid"); } else { System.Console.WriteLine(" - invalid"); } } } }

Sada
123-456-7890 - valid 444-234-22450 - invalid 690-203-6578 - valid 146-893-232 - invalid 146-839-2322 valid 4007-295-1111 - invalid 407-295-1111 - valid 407-2-5555 - invalid

COMO: Unir vrias seqncias de caracteres (Guia de programao C#) H duas maneiras para ingressar em vrias seqncias: usando o + operador que a String classe overloads, e usando a StringBuilder classe. O + operador fcil de usar e torna para intuitivo cdigo, mas ele funciona em seqncia; uma nova seqncia criada para cada uso do operador, portanto encadeamento vrios operadores juntos ineficiente. Por exemplo: C#
string two = "two"; string str = "one " + two + " three"; System.Console.WriteLine(str);

Embora quatro seqncias aparecem no cdigo, a trs seqncias sendo associados e a seqncia de caracteres que contm todos os trs, final cinco seqncias so criadas no total porque as primeiras duas seqncias esto associadas primeiro, criar uma seqncia contendo " Um dois ". O terceiro acrescentado separadamente, formando a seqncia de caracteres armazenada no str final. Como alternativa, a StringBuilder classe pode ser usada para adicionar cada seqncia a um objeto que cria a seqncia final em uma etapa. Essa estratgia demonstrada no exemplo a seguir. Exemplo

Visual C# Consolidado

387

O cdigo a seguir usa o mtodo acrscimo da classe StringBuilder Para ingressar em trs seqncias sem o efeito do + operador Chaining. C#
class StringBuilderTest { static void Main() { string two = "two"; System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append("one "); sb.Append(two); sb.Append(" three"); System.Console.WriteLine(sb.ToString()); string str = sb.ToString(); System.Console.WriteLine(str); } }

COMO: Pesquisar em seqncias de caracteres utilizando mtodos de String (Guia de programao C#) O Seqncia Tipo, que um alias para a System.String classe, fornece um nmero de mtodos til para pesquisar o contedo de uma seqncia. O exemplo a seguir utiliza e EndsWith Mtodos., StartsWith a IndexOf, LastIndexOf Exemplo C#
class StringSearch { static void Main() { string str = "A silly sentence used for silly purposes."; System.Console.WriteLine("'{0}'",str); bool test1 = str.StartsWith("a silly"); System.Console.WriteLine("starts with 'a silly'? {0}", test1); bool test2 = str.StartsWith("a silly", System.StringComparison.OrdinalIgnoreCase); System.Console.WriteLine("starts with 'a silly'? {0} (ignoring case)", test2); bool test3 = str.EndsWith("."); System.Console.WriteLine("ends with '.'? {0}", test3); int first = str.IndexOf("silly"); int last = str.LastIndexOf("silly"); string str2 = str.Substring(first, last - first); System.Console.WriteLine("between two 'silly' words: '{0}'", str2); } }

Sada
'A silly sentence used for silly purposes.' starts with 'a silly'? False starts with 'a silly'? True (ignore case) ends with '.'? True between two 'silly' words: 'silly sentence used for '

COMO: Analisar seqncias usando o mtodo Split (Guia de programao C#) O exemplo de cdigo a seguir demonstra como uma seqncia pode ser analisado usando o System.String.Split mtodo. Esse mtodo funciona, retornando uma matriz de seqncias, onde cada elemento uma palavra. Como entrada, Split leva uma matriz de caracteres que indicam quais caracteres so a ser usado como delimitadores. Neste exemplo, espaos, vrgulas, pontos, dois-pontos, e guias so usados. Uma matriz contendo esses delimitadores passado para Split, e cada palavra na frase ser exibida separadamente usando a matriz de seqncias de caracteres resultante. Exemplo C#
class TestStringSplit { static void Main() { char[] delimiterChars = { ' ', ',', '.', ':', '\t' }; string text = "one\ttwo three:four,five six seven"; System.Console.WriteLine("Original text: '{0}'", text); string[] words = text.Split(delimiterChars); System.Console.WriteLine("{0} words in text:", words.Length); foreach (string s in words) { System.Console.WriteLine(s); } } }

Sada
Original text: 'one two three:four,five six seven' 7 words in text: one two three four five six seven

COMO: Criar uma unio C/C++ usando atributos (Guia de programao C#)

Visual C# Consolidado

388

Usando atributos Voc pode personalizar como estruturas so dispostas na memria. Por exemplo, voc pode criar o que conhecido como uma unio em C/C usando e FieldOffset Atributos. o StructLayout(LayoutKind.Explicit) Exemplo Nesse segmento de cdigo, todos os campos de TestUnion incio no mesmo local na memria. C#
[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)] struct TestUnion { [System.Runtime.InteropServices.FieldOffset(0)] public int i; [System.Runtime.InteropServices.FieldOffset(0)] public double d; [System.Runtime.InteropServices.FieldOffset(0)] public char c; [System.Runtime.InteropServices.FieldOffset(0)] public byte b; }

A seguir outro exemplo onde incio campos em diferente explicitamente configurar locais. C#
[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)] struct TestExplicit { [System.Runtime.InteropServices.FieldOffset(0)] public long lg; [System.Runtime.InteropServices.FieldOffset(0)] public int i1; [System.Runtime.InteropServices.FieldOffset(4)] public int i2; [System.Runtime.InteropServices.FieldOffset(8)] public double d; [System.Runtime.InteropServices.FieldOffset(12)] public char c; [System.Runtime.InteropServices.FieldOffset(14)] public byte b; }

Os dois int campos, i1 e i2, compartilhar os mesmos locais como lg de memria. Esse tipo de controle sobre layout struct til quando usando invocao de plataforma. COMO: Criar e usar DLLs em C# (Guia de programao C#) Uma biblioteca de vnculo dinmica (DLL) est vinculada ao seu programa em tempo de execuo. Para demonstrar Criando e usando uma DLL, considere o seguinte cenrio:
MathLibrary.DLL o arquivo de biblioteca que contm os mtodos para ser chamado em tempo de execuo. Neste exemplo, a DLL contm dois mtodos, Add e Multiply. Add.cs o arquivo de origem que contm o mtodo Add(long i, long j). Ela retorna a soma de seus parmetros. A classe AddClass que contm o mtodo Add um membro do espao para nome UtilityMethods. Mult.cs o cdigo fonte que contm o mtodo Multiply(long x, long y). Ele retorna o produto de seus parmetros. A classe MultiplyClass que contm o mtodo Multiply tambm um membro do espao para nome UtilityMethods. TestCode.cs o arquivo que contm o Main mtodo. Ele usa os mtodos no arquivo DLL para

calcular a soma e o produto dos argumentos em tempo de execuo. Exemplo C#


// File: Add.cs namespace UtilityMethods { public class AddClass { public static long Add(long i, long j) { return (i + j); } } }

Visual C# Consolidado

389

C#
// File: Mult.cs namespace UtilityMethods { public class MultiplyClass { public static long Multiply(long x, long y) { return (x * y); } } }

C#
// File: TestCode.cs using UtilityMethods; class TestCode { static void Main(string[] args) { System.Console.WriteLine("Calling methods from MathLibrary.DLL:"); if (args.Length != 2) { System.Console.WriteLine("Usage: TestCode <num1> <num2>"); return; } long num1 = long.Parse(args[0]); long num2 = long.Parse(args[1]); long sum = AddClass.Add(num1, num2); long product = MultiplyClass.Multiply(num1, num2); System.Console.WriteLine("{0} + {1} = {2}", num1, num2, sum); System.Console.WriteLine("{0} * {1} = {2}", num1, num2, product); } }

Este arquivo contm o algoritmo que usa os mtodos DLL, Add e Multiply. Comear com analisar os argumentos inseridos da linha de comando, num1 e num2. Ele calcula a soma, usando o Add mtodo na classe AddClass, e o produto usando o Multiply mtodo na classe MultiplyClass. Observe que a using diretiva no incio do arquivo permite-lhe usar a classe no qualificado nomes para consultar os mtodos DLL ao tempo de compilao, da seguinte maneira: C#
MultiplyClass.Multiply(num1, num2);

Caso contrrio, voc ter para usar os nomes totalmente qualificados, da seguinte maneira: C#
UtilityMethods.MultiplyClass.Multiply(num1, num2);

Execuo Para executar o programa, digite o nome do arquivo exe, seguido por dois nmeros, da seguinte maneira:
TestCode 1234 5678

Sada
Calling methods from MathLibrary.DLL: 1234 + 5678 = 6912 1234 * 5678 = 7006652

Compilando o cdigo Para criar o arquivo MathLibrary.DLL, compilar os dois arquivos Add.cs e Mult.cs Usando a linha de comando a seguir:
csc /target:library /out:MathLibrary.DLL Add.cs Mult.cs

A /Target:Library opo de compilador informa o compilador para dar sada uma DLL em vez de um arquivo EXE. A / Fora opo de compilador seguida por um nome de arquivo utilizada para especificar o nome do arquivo DLL Caso contrrio, o compilador usa o primeiro arquivo (Add.cs.) como o nome da DLL Para criar o arquivo executvel, TestCode.exe, use a seguinte linha de comando:
csc /out:TestCode.exe /reference:MathLibrary.DLL TestCode.cs

Visual C# Consolidado

390

A /out opo de compilador informa o compilador para produzir sada de um arquivo EXE e especifica o nome do arquivo de sada). (TestCode.exe Esta opo de compilador opcional. A /Reference opo de compilador Especifica o arquivo DLL ou arquivos que usa este programa. COMO: Determinar se um arquivo um mdulo (assembly) (Guia de programao C#) Um arquivo um conjunto se e somente se ele gerenciada, e contm uma entrada do conjunto nos seus metadados. Para obter mais informaes sobre conjuntos e metadados, consulte o tpico Manifesto do Assembly. Como determinar se um arquivo um conjunto manualmente 1. 2. 3. Iniciar o Disassembler MSIL (Ildasm.exe). Carregar o arquivo que deseja testar. Se ILDASM, arquivo relatrios no que o arquivo um executvel porttil (PE), ele um conjunto no. Para obter mais informaes, consulte o tpico Como Visualizar o Contedo de um Assembly. Chame o GetAssemblyName mtodo, passando o caminho de arquivo completo e nome do arquivo que voc est testando. Se uma BadImageFormatException exceo acionada, o arquivo um conjunto no.

Como determinar se um arquivo um conjunto programaticamente 1. 2.

Exemplo Este exemplo testa uma DLL para verificar se ele um conjunto. C#
class TestAssembly { static void Main() { try { System.Reflection.AssemblyName testAssembly = System.Reflection.AssemblyName.GetAssemblyName(@"C:\WINDOWS\system\avicap.dll"); System.Console.WriteLine("Yes, the file is an Assembly."); } catch (System.IO.FileNotFoundException e) { System.Console.WriteLine("The file cannot be found."); } catch (System.BadImageFormatException e) { System.Console.WriteLine("The file is not an Assembly."); } catch (System.IO.FileLoadException e) { System.Console.WriteLine("The Assembly has already been loaded."); } } }

O GetAssemblyName mtodo carrega o arquivo de teste, e depois libera ele depois que as informaes leitura. Sada
The file is not an Assembly.

COMO: Carregar e descarregar mdulos (assemblies) (Guia de programao C#) As montagens referenciadas por seu programa automaticamente ser carregadas ao tempo de criao, mas tambm possvel carregar conjuntos especficos para o domnio do aplicativo atual em tempo de execuo. Para obter mais informaes, consulte Domnios de aplicativo. No h um meio para descarregar um conjunto individual sem descarregar todos os domnios de aplicativos que contm ele. Mesmo se o conjunto sai do escopo, o arquivo de montagem real permanecer carregado at que todos os domnios de aplicativos que contm ele sejam descarregados.

Visual C# Consolidado

391

Se voc desejar descarregar alguns conjuntos mas no outros, considere criar um novo domnio do aplicativo executar o cdigo dentro desse domnio, e ento descarregar desse domnio do aplicativo. Para obter mais informaes, consulte Como executar cdigo em outro domnio de aplicativo:. Para carregar um conjunto em um domnio de aplicativo

Use uma das vrias a carregar mtodos contidos nas classes AppDomain e System.Reflection. Para obter mais informaes, consulte Carregar conjuntos em um domnio de aplicativo. No h um meio para descarregar um conjunto individual sem descarregar todos os domnios de aplicativos que contm ele. Use o Unload mtodo do AppDomain para descarregar os domnios de aplicativo. Para obter mais informaes, consulte Descarregar um domnio de aplicativo.

Para descarregar um domnio de aplicativo

COMO: Compartilhar um mdulo (assembly) com outros aplicativos (Guia de programao C#) Conjuntos podem ser privado nem compartilhada: Por padro, simples maioria dos programas C# consistir de um conjunto particular porque eles no se destinam a ser usado por outros aplicativos. Para compartilhar um conjunto com outros aplicativos, ele deve ser colocado no (GAC Cache global de assembly ). Compartilhar um conjunto 1. 2. 3. 4. 5. Criar seu conjunto. Para obter mais informaes, consulte Criando conjuntos. Atribuir um nome de alta segurana a seu conjunto. Para obter mais informaes, consulte COMO: Assinar uma Assembly com Nome Forte. Atribuir informaes de verso a seu conjunto. Para obter mais informaes, consulte Versionamento de assembly. Incluir seu conjunto para o cache assembly global. Para obter mais informaes, consulte Como Instalar um Assembly na Cache Global de Assemblies. Acessar os tipos contidos no conjunto dos outros aplicativos. Para obter mais informaes, consulte Como Referenciar um Assembly de Nome Forte.

Executar cdigo em outro domnio de aplicao (Guia de programao C#)


Depois que um conjunto tenha sido carregado em um domnio de aplicativo, ele contm o cdigo pode ser executado. A maneira mais simples para fazer isso para usar AssemblyLoad qual ir carregar o conjunto para o domnio de aplicativos atual, e comear a execuo do cdigo em ponto de entrada padro do conjunto. Se voc desejar carregar o conjunto em outro domnio de aplicativo, use ExecuteAssembly ou ExecuteAssemblyByName. ou uma da outra o sobrecarregado verses um desses mtodos Se voc deseja executar o outro conjunto comeando no ponto de entrada padro, alm de definir um novo tipo no conjunto remoto, derivar de MarshalByRefObject. Usar CreateInstance para criar uma instncia do tipo do seu aplicativo.

Visual C# Consolidado

392

Considere arquivo a seguir, que cria um conjunto que consiste em um espao para nome nico e duas classes. Suponha que este conjunto de mdulos (assembly) tenha sido criado, e armazenada no disco C com o nome HelloWorldRemote.exe. C#
// This namespace contains code to be called. namespace HelloWorldRemote { public class RemoteObject : System.MarshalByRefObject { public RemoteObject() { System.Console.WriteLine("Hello, World! (RemoteObject Constructor)"); } } class Program { static void Main() { System.Console.WriteLine("Hello, World! (Main method)"); } } }

Para acessar o cdigo de outro aplicativo, voc pode tanto carregar o conjunto para o domnio de aplicativo atual ou criar um novo domnio de aplicativo e carregar o conjunto para ela Se voc carregar o conjunto no domnio de aplicativo atual com Assembly.LoadFrom, voc pode usar Assembly.CreateInstance para criar uma instncia da classe RemoteObject, que faz o Construtor de objeto a ser executado C#
static void Main() { // Load the assembly into the current appdomain: System.Reflection.Assembly newAssembly = System.Reflection.Assembly.LoadFrom(@"c:\HelloWorldRemote.exe"); // Instantiate RemoteObject: newAssembly.CreateInstance("HelloWorldRemote.RemoteObject"); }

Ao carregar o conjunto em um domnio de aplicativos separados, usar AppDomain.ExecuteAssembly para acessar o ponto de entrada padro ou AppDomain.CreateInstance Para criar uma instncia da classe RemoteObject. Criar a instncia faz o construtor para ser executado. C#
static void Main() { System.AppDomain NewAppDomain = System.AppDomain.CreateDomain("NewApplicationDomain"); // Load the assembly and call the default entry point: NewAppDomain.ExecuteAssembly(@"c:\HelloWorldRemote.exe"); // Create an instance of RemoteObject: NewAppDomain.CreateInstanceFrom(@"c:\HelloWorldRemote.exe", "HelloWorldRemote.RemoteObject"); }

Se voc no faa desejar carregar o conjunto programaticamente, use Add Reference de para especificar o conjunto HelloWorldRemote.exe. o Solution Explorer Em seguida, adicionar uma using HelloWorldRemote; diretiva para o Usando Bloco de seu aplicativo, e usar o RemoteObject tipo no seu programa para declarar uma instncia do objeto RemoteObject, como este: C#
static void Main() { // This code creates an instance of RemoteObject, assuming HelloWorldRemote has been added as a reference: HelloWorldRemote.RemoteObject o = new HelloWorldRemote.RemoteObject(); }

COMO: Criar e usar um domnio de aplicao (Guia de programao C#) Domnios de aplicativo fornecem um mtodo de isolar o cdigo para fins de segurana e desempenho. Para obter mais informaes, consulte Domnios de aplicativo (guia de programao C#). Usando um domnio de aplicativo

Visual C# Consolidado

393

1.

Criar o domnio de aplicativo. O host Runtime de idioma comum cria um domnio de aplicativo para automaticamente seu aplicativo. Para informaes, consulte o tpico Como: Criar um domnio de aplicativo. Configure o domnio de aplicativo. Para obter mais informaes, consulte Como Configurar um Domnio de Aplicativo. Carregar um conjunto no domnio de aplicativo. Para obter mais informaes, consulte Como Carregar Assemblies em um Domnio de Aplicativo. Acessar o Contedo do outro conjunto. Para obter mais informaes, consulte Executar cdigo em outro domnio de aplicao (Guia de programao C#). Descarregar o domnio do aplicativo. Para obter mais informaes, consulte Como: Descarregar um domnio de aplicativo.

2. 3. 4. 5.

Exemplos do Visual C#
Voc pode acessar cdigo de exemplo, procurando resumos de exemplo nesta seo. Cada abstrato contm um link para abrir ou copiar o exemplo na arquivos. Alm disso, o SDK do .NET Framework inclui tecnologia e aplicativo Exemplos e tutoriais QuickStart que demonstram recursos .NET Framework e cdigo Visual C#. Os tutoriais QuickStart so a maneira mais rpida para entender o que a tecnologia .NET Framework oferece desenvolvedores lder-borda. Os QuickStarts so uma srie de exemplos e suporte documentao projetadas para rapidamente acquaint voc com a sintaxe, arquitetura, e poder do Visual Studio e o .NET Framework. Do ASP.NET Os tutoriais QuickStart inclui exemplos na e aplicativos Windows Forms, alm de muitos aplicativos instruo que abrangem os recursos da tecnologia .NET Framework mais atraentes. Para acessar o QuickStarts, clique em Start, aponte para Programs, aponte para Microsoft .NET Framework SDK v2.0, e clique em QuickStart Tutorials. Uma pgina da Web do aplicativo " tutoriais QuickStart SDK Microsoft .NET Framework " exibida. Para executar o QuickStarts, siga as instrues na pgina, que configura o banco de dados amostras e conclui a instalao. Para obter mais informaes, consulte Amostras e QuickStarts. Nesta seo Exemplos de introduo Annimo exemplo representantes Exemplo matrizes Coleo exemplo classes Exemplo generics (C#) Demonstra o uso de representantes para reduzir a complexidade de aplicativos sem nome. Mostra como usar matrizes. Mostra como fazer classes coleo Generic no-que podem ser usados com a foreach instruo. Mostra como fazer classes a coleo genrica que podem ser usados com a foreach instruo.

Exemplo de parmetros Demonstra simples processamento de linha de comando e matriz da linha de comando indexao. Exemplo dos Mtodos condicional Demonstra condicionais mtodos, que fornecem um poderoso mecanismo pelo qual chamadas para mtodos podem ser includos ou omitido dependendo se um smbolo definido.

Exemplo representantes Mostra como representantes so declaradas, mapeado, e combinados. Exemplo eventos Mostra como usar eventos em C#.

Visual C# Consolidado

394

Exemplo de implementao de interface explcita Exemplo World de saudao Exemplo indexadores Indexado exemplo propriedades

Demonstra como explicitamente implementar membros de interface.

Um aplicativo hello world. Mostra como usar notao de matriz para acessar um objeto. Mostra como a implementar uma classe que usa propriedades indexadas. Propriedades indexadas permitem que voc para usar uma classe que representa uma coleo de vrios tipos diferentes de itens semelhantes matriz-. Mostra como propriedades so declaradas e usados; tambm demonstra propriedades abstratas. Mostra como usar structs em C#. Mostra como definido pelo usurio classes poder sobrecarregar operadores. Mostra como definir converses de e para tipos definidos pelo usurio. Do override demonstra verso em C# atravs do uso de e new palavras-chave. Demonstra a palavra-chave rendimento para filtrar itens em uma coleo.

Exemplo propriedades Exemplo Structs Exemplo Overloading do operador Exemplo Conversions definidas pelo usurio Exemplo de verso Produzir exemplo

Exemplos intermedirio e Avanado Exemplo atributos Exemplo parte 1 Interop COM Exemplo parte 2 Interop COM Exemplo bibliotecas Mostra como criar classes de atributo personalizado, us-los em cdigo, e consult-los atravs de reflexo. Mostra como usar C# para interoperar com objetos COM. Mostra como um servidor use um C# com um cliente com C++. Mostra como usar opes do compilador para criar uma DLL de vrios arquivos de origem; alm disso, como usar a biblioteca em outros programas. Demonstra tipos de valores que podem ser definidos como nulo. Demonstra como usar um banco de dados do Microsoft Access do C#. Ele mostra como voc pode criar um DataSet e adicionar tabelas a ela a partir de um banco de dados.

Exemplo anulvel Exemplo BD OLE

Exemplo tipos parcial Demonstra como classes e estruturas podem ser definidas em vrios arquivos cdigo fonte-C#. Plataforma Invoke exemplo Exemplo de segurana Mostra como chamar exportadas funes DLL do C#. Discute a segurana do .NET Framework e mostra duas maneiras de modificar as permisses de segurana em C#: Usando classes de permisso e atributos de permisso.

Visual C# Consolidado

395

Segmentao de exemplo Exemplo de cdigo no seguros Exemplo de documentao XML

Demonstra vrias atividades do segmento, como criando e executando um segmento, sincronizando segmentos, interagir entre segmentos, e usando um pool de segmentos. Mostra como usar ponteiros. Mostra como a documentar cdigo usando XML.

Visual C# Consolidado

396

.NET Framework (Como Fazer em C#)


Esta pgina contm links para a Ajuda sobre tarefas do .NET Framework amplamente usadas. Para ver outras categorias de tarefas populares abordadas na Ajuda, consulte Como Fazer em C#. Gerais Introduo Linguagem C# e ao .NET Framework Descreve o relacionamento entre a linguagem C# e as bibliotecas de classe do .NET Framework e o mecanismo de execuo de tempo de execuo. Viso Geral sobre o .NET Framework Fornece uma viso geral conceitual dos recursos chave do .NET Framework, incluindo o Common Language Runtime, a biblioteca de classes do .NET Framework e a interoperabilidade entre linguagens. Localizador Rpido de Tecnologia Fornece uma referncia rpida para as principais reas de tecnologia do .NET Framework. E/S de Arquivo Como Criar uma Listagem de Diretrio Cria um novo diretrio. Como Ler de e Escrever em um Arquivo de Dados Recm-criado L de e escreve em um arquivo de dados recm-criado. Como Abrir e Anexar em um Arquivo de Log Abre e anexa em um arquivo de log. Como Escrever Texto em um Arquivo Escreve texto em um arquivo. Como Ler Texto de um Arquivo L texto de um arquivo. Como Ler Caracteres de uma Seqncia de Caracteres L caracteres de uma seqncia de caracteres. Como Escrever Caracteres em uma Seqncia de Caracteres Escreve caracteres em uma seqncia de caracteres.

Visual C# Consolidado

397

Como Adicionar ou Remover Entradas da Lista de Controle de Acesso Adiciona ou remove entradas da Lista de Controle de Acesso (ACL) para aumentar a segurana. Seqncias de Caracteres Criando Novas Seqncias de Caracteres Como criar uma nova seqncia de caracteres. Aparando e Removendo Caracteres Como remover caracteres do incio ou do final de uma seqncia de caracteres. Preenchendo Seqncias de Caracteres Como adicionar tabulaes ou espaos ao incio ou ao final de seqncias de caracteres. Comparando Seqncias de Caracteres Como verificar a igualdade de duas seqncias de caracteres. Alterando a Caixa Como alterar letras em maisculo para letras em minsculo e visse-versa. Usando a Classe StringBuilder Tcnicas eficientes de manipulao de seqncias de caracteres. Como Executar Manipulaes sobre Seqncia de Caracteres Usando Operaes Bsicas Como dividir seqncias, acrescentar uma seqncia a outra e mais. Como Converter Tipos de Dados Usando System.Convert Contm um exemplo que usa a classe Convert para transformar um valor string em um valor booleano. Como Remover Caracteres Invlido de uma Seqncia de Caracteres Contm um exemplo que usa o mtodo esttico Regex.Replace para remover caracteres invlidos de uma seqncia de caracteres. Como Verificar se Seqncias de Caracteres Esto em um Formato de Email Vlido Contm um exemplo que usa o mtodo esttico Regex.IsMatch para verificar se uma seqncias de caracteres est em um formato de email vlido. Colees Colees e Estruturas de Dados Viso geral das classes de coleo do .NET Framework.

Visual C# Consolidado

398

Selecionando uma Classe de Coleo Como escolher que tipo de coleo usar. Quando Usar Colees Genricas Explica as vantagens de classes de coleo genricas sobre classes coleo nogenricas. System.Collections.Generic Pgina de portal das classes da coleo genricas. List Fornece exemplos de cdigo mostrando como adicionar e remover itens de uma coleo List<T>. SortedDictionary Fornece exemplos de cdigo mostrando como adicionar e remover pares chave/valor de uma coleo SortedDictionary<K,V>. Excees Como Usar Excees Especficas em um Bloco Catch Contm um exemplo que usa um bloco try/catch para captura uma InvalidCastException. Como Usar o Bloco Try/Catch para Capturar Excees Contm um exemplo que usa um bloco try/catch para capturar uma possvel exceo. Como Criar Excees Definida pelo Usurio Contm um exemplo onde uma nova classe de exceo, EmployeeListNotFoundException, derivada de Exception. Como Usar Blocos Finally Contm um exemplo que usa um bloco try/catch para capturar uma exceo ArgumentOutOfRangeException. Como Lanar Excees Explicitamente Contm um exemplo que usa um bloco try/catch para detectar uma possvel exceo FileNotFoundException. Eventos Como Consumir Eventos em um Aplicativo do Windows Forms Contm exemplos que mostram como tratar um evento de clique boto em um Windows Form. Como Conectar Mtodos de Manipulao de Eventos a Eventos

Visual C# Consolidado

399

Contm exemplos que mostram como adicionar um mtodo que manipula um evento a um evento. Como Gerar e Consumir Eventos Contm um exemplo que usa conceitos descritos em detalhes em Eventos e Delegates e Gerando um Evento. Como Manipular Vrios Eventos Usando Propriedades de Evento Contm um exemplo que mostrar como manipular vrios eventos usando propriedades de evento. Como Implementar Eventos em sua Classe Contm procedimentos que descrevem como implementar um evento em uma classe. Depurao Consulte Depurao (Como Fazer em C#). Implantao Consulte Segurana (Como Fazer em C#). Serviced Components Como Criar um Gerenciador de Recursos de Compensao (CRM) Inclui exemplos de cdigo para mostrar como criar um Gerenciador de Recursos de Compensao Como Criar um Serviced Component Contm um procedimento que descreve como criar um novo serviced component. Como Aplicar o Atributo Description a um Assembly Mostra como aplicar o atributo DescriptionAttribute para definir a descrio de um assembly. Como Usar os Mtodos SetAbort e SetComplete Mostra como usar os mtodos estticos SetComplete e SetAbort da classe ContextUtil. Como Aplicar o Atributo ApplicationID a um Assembly Mostra como aplicar o atributo ApplicationID a um assembly. Como Criar um Objeto de Pool e Definir seus Limites de Tamanho e de Tempo Mostra como criar um objeto de pool e definir seus limites de tamanho e de tempo. Como criar um Mtodo de Web Service que Usa Transaes Automticas

Visual C# Consolidado

400

Descreve como criar um mtodo de Web Service que usa transaes automticas. Como Definir a Propriedade SoapRoot Property para um Aplicativo Mostra como definir a propriedade SoapVRoot como "MyVRoot". Como Definir o Tempo Limite da Transao Mostra como configurar o tempo limite da transao para 10 segundos. Como Definir o Nome do Aplicativo Usando o Atributo ApplicationName Mostra como fornecer o nome do aplicativo usando o atributo ApplicationName a nvel de assembly. Como Usar o Recurso BYOT (Bring Your Own Transaction - Traga sua Prpria Transao) do COM+ Contm procedimentos que mostram como uma classe derivada da classe ServicedComponent pode usar o recurso BYOT do COM+ para acessar um coordenador de transaes distribudas (DTC). Como Criar um Componente Privado Mostra como usar o atributo PrivateComponentAttribute em uma classe. Como Definir o Tipo de Ativao de um Aplicativo Mostra como definir o tipo de ativao para "server". Como Habilitar Sincronizao em Instncias de uma Classe Mostra como para habilitar sincronizao em instncias da classe TestSync. Como Usar Transaes Automticas em uma Classe do .NET Framework Descreve como preparar uma classe para participar de uma transao automtica. Como Habilitar Ativao JIT Mostra como habilitar ativao e desativao JIT dentro e fora de uma classe. Como Definir o Atributo AutoComplete em uma Classe Transaction-Aware Mostra o posicionamento do atributo AutoComplete em uma classe transaction-aware. Como Implementar um Componente Enfileirado que Exibe uma Mensagem de Forma Assncrona Demonstra como implementar um componente enfileirado que exibe uma mensagem de forma assncrona. Como Implementar Eventos Fracamente Acoplados

Visual C# Consolidado

401

Contm procedimentos que mostram como implementar uma classe de eventos e um coletor de eventos que implementam uma interface de eventos comum e mais um publisher para acionar o evento. Como Configurar a Construo de Objetos Contm um procedimento e um exemplo que descrevem como configurar a construo de objetos e definir a seqncia de inicializao padro da classe TestObjectConstruct para a seqncia "Initial Catalog=Northwind;Data Source=.\\SQLServerInstance;Trusted_Connection=yes". Assemblies e Domnios de Aplicativos Como Obter Informaes de Tipo e Membros de um Assembly Contm um exemplo que obtm informaes de tipo e membro de um assembly. Como Criar um Assembly de Arquivo nico Contm um procedimento que mostra como criar assemblies de arquivo nico usando compiladores de linha de comando. Como criar um Domnio de Aplicativo Cria um novo domnio de aplicativo, atribui o nome MyDomain e, em seguida, imprime no console o nome do domnio do host e do domnio do aplicativo filho recm-criado. Como Determinar o Nome Totalmente Qualificado de um Assembly Mostra como exibir o nome totalmente qualificado de um assembly contendo uma classe especificada para o console. Como Configurar um Domnio de Aplicativo Cria uma instncia da classe AppDomainSetup, usa essa classe para criar um novo domnio de aplicativo, escreve as informaes no console e descarrega o domnio de aplicativo. Como Visualizar o Contedo de um Assembly Contm um exemplo que comea com um programa "Hello, World " bsico e mostra como usar ILDASM.exe para desmontar o assembly Hello.exe e exibir o manifesto do assembly. Como Referenciar um Assembly de Nome Forte Cria um assembly chamado myAssembly.dll que referencia um assembly de nome forte chamado myLibAssembly.dll a partir de um mdulo de cdigo chamado myAssembly.CS. Como Descarregar um Domnio de Aplicativo Cria um novo domnio de aplicativo chamado MyDomain, imprime algumas informaes no console e, em seguida, descarrega o domnio de aplicativo. Como Remover um Assembly de Cache Global de Assemblies

Visual C# Consolidado

402

Contm um exemplo que remove um assembly chamado Hello.dll da cache global de assemblies. Como Instalar um Assembly na Cache Global de Assemblies Contm um exemplo que instala um assembly chamado Hello.dll na cache global de assemblies. Como Criar um Assembly de Mltiplos Arquivos Descreve o procedimento usado para criar um assembly de mltiplos arquivos e fornece um exemplo completo que ilustra cada uma das etapas do procedimento. Como Carregar Assemblies em um Domnio de Aplicativo Contm um exemplo que carrega um assembly no domnio de aplicativo atual e, em seguida, executa o assembly. Como Assinar um Assembly com um Nome Forte Contm um exemplo que assina o assembly MyAssembly.dll com um nome forte usando o arquivo chave sgKey.snk. Como Visualizar o Contedo da Cache Global de Assemblies Mostra como usar a ferramenta Global Assembly Cache (Gacutil.exe) para exibir o contedo da cache global de assemblies. Como Criar um par de chaves Public/Private Mostra como assinar um assembly com um nome forte e como criar um par de chaves usando a ferramenta Strong Name (Sn.exe). Interoperao Como Incorporar Bibliotecas de Tipo como Recursos Win32 em Aplicativos Baseados no .NET Mostra como incorporar uma biblioteca de tipos como um recurso Win32 em um aplicativo baseado no .NET Framework. Como Gerar Assemblies de Interoperabilidade Primrios Usando Tlbimp.exe Fornece exemplos que mostram como gerar assemblies de interoperabilidade primrios usando Tlbimp.exe. Como Criar Assemblies de Interoperabilidade Primrios Manualmente Fornece um exemplo que mostra como criar assemblies de interoperabilidade primrios manualmente. Como Gerar Assemblies de Interoperabilidade a partir de Bibliotecas de Tipo Fornece exemplos que mostram como gerar um assemblies de interoperabilidade a partir de uma biblioteca tipo.

Visual C# Consolidado

403

Como Gerar Eventos Manipulados por um Coletor COM Fornece um exemplo que mostra um servidor gerenciado como a fonte do evento e um cliente COM como o coletor do evento. Como Personalizar Wrappers Invocveis em Tempo de Execuo Mostra como personalizar wrappers invocveis em tempo de execuo modificando a fonte IDL ou modificando um assembly importado. Como Configurar Componentes Baseado em .NET para Habilitar Livre Registro Explica como configurar componentes baseados no .NET Framework para habilitar Livre Registro Como Implementar Funes CallBack Demonstra como um aplicativo gerenciado, usando invocao de plataforma, pode imprimir o valor de identificador para cada janela do computador local Como Mapear HRESULTs e Excees Contm um exemplo que mostra como criar uma nova classe de exceo chamada NoAccessException e mape-la ao HRESULT E_ACCESSDENIED. Como Editar Assemblies de Interoperabilidade Demonstra como especificar alteraes de empacotamento na Microsoft Intermediate Language (MSIL). Como Adicionar Referncias a Bibliotecas de Tipo Explica as etapas para adicionar uma referncia a uma biblioteca de tipos. Como Manipular Eventos Gerados por uma Fonte COM Inclui um exemplo que demonstrar como abrir uma janela do Internet Explorer e como amarrar eventos gerados pelo objeto InternetExplorer a manipuladores de eventos implementados em cdigo gerenciado. Como Criar Wrappers Manualmente Mostra um exemplo da interface ISATest e da classe SATest em IDL e os tipos correspondentes no cdigo fonte C#. Como Registrar Assemblies de Interoperabilidade Primrios Inclui um exemplo que mostra como registrar o assembly de interoperabilidade primrio CompanyA.UtilLib.dll. Como Empacotar Vrias Verses de Bibliotecas de Tipos Explica como empacotar mais de uma verso de uma biblioteca de tipos. Segurana

Visual C# Consolidado

404

Consulte Segurana (Como Fazer em C#). Serializao Como Desserializar um Objeto Fornece um exemplo que desserializa um objeto em um arquivo. Como Usar Ferramenta de Definio de Esquema XML para Gerar Classes e Documentos de Esquema XML Fornece procedimentos para mostrar como usar a ferramenta de definio de esquema XML para gerar classes e documentos de esquema XML. Como Especificar um Nome de Elemento Alternativo para um Fluxo XML Mostra como voc pode gerar mais de um fluxo de XML com o mesmo conjunto de classes. Como Controlar a Serializao de Classes Derivadas Fornece um exemplo que mostrar como controlar a serializao de classes derivadas. Como Serializar um Objeto como um Fluxo XML de Codificao SOAP Fornece um procedimento e um exemplo para serializar um objeto como um fluxo de XML de Codificao SOAP. Como Particionar Dados Serializados Fornece um procedimento e um exemplo para implementar particionamento do lado do servidor e processamento do lado do cliente. Como Serializar um Objeto Fornece um procedimento para serializar um objeto. Como Qualificar um Elemento XML e Nomes Atributos XML Fornece um procedimento e um exemplo para criar nomes qualificados em um documento XML. Como Substituir a Serializao SOAP XML Codificada Fornece um procedimento e um exemplo para substituir serializao de objetos como mensagens SOAP. Codificao e Localizao Como Analisar Dgitos Unicode Fornece um exemplo que usa o mtodo Decimal.Parse para analisar seqncias de caracteres de valores Unicode que especificam dgitos em scripts diferentes.

Visual C# Consolidado

405

Como Criar Culturas Personalizadas Fornece um procedimento para definir e criar um cultura personalizada. Programao Avanada Como Definir e Executar Mtodos Dinmicos Mostra como definir e executar um mtodo dinmico simples e um mtodo dinmico ligado a uma instncia de uma classe. Como Examinar e Instanciar Tipos Genricos com Reflexo Fornece procedimentos que mostram como descobrir e manipular tipos genricos. Como Definir um Mtodo genrico com Emisso de Reflexo Fornece procedimentos que mostram como definir um mtodo genrico com emisso de reflexo. Como Usar Assinatura Completa para Dar a um Assembly Dinmico um Nome Forte Demonstra o uso de assinatura completa para dar um assembly dinmico um nome forte. Como Carregar Assemblies no Contexto Somente de Reflexo Fornece um procedimento e um exemplo de cdigo para mostrar como carregar assemblies no contexto somente de reflexo. Como Definir um Tipo Genrico com Emisso de Reflexo Mostra como criar um tipo genrico simples com dois parmetros de tipo, como aplicar restries de classe, restries de interface e restries especiais aos parmetros de tipo e como criar membros que usam os parmetros de tipo de uma classe como tipos de parmetros e tipos de retorno. Explicaes Passo-a-passo do .NET Framework SDK Passo-a-passo: Adicionando Marcas Inteligentes a um Componente do Windows Forms Demonstra como adicionar marcas inteligentes usando cdigo de um controle de exemplo simples, ColorLabel, que derivado do controle padro Windows Forms Label Passo-a-passo: Alterando a Mensagem SOAP Usando Extenses SOAP Mostra como criar e executar uma extenso SOAP. Passo-a-passo: Construindo um XML Web Service Bsico Usando ASP.NET Demonstra como criar um XML Web Services bsico usando ASP.NET. Passo-a-passo: Personalizao para Dispositivos Especficos Demonstra como personalizar dispositivos especficos. Passo-a-passo: Personalizando a Gerao de Descries de Servios e Classes Proxy

Visual C# Consolidado

406

Demonstra como personalizar a gerao de descries de servios e classes proxy. Passo-a-passo: Implantando um Aplicativo ClickOnce Manualmente Descreve as etapas necessrias para criar uma implantao ClickOnce completa usando a verso de linha de comando ou grfica da ferramenta de Gerao e Edio de Manifesto (Manifest Generation and Editing - Mage). Passo-a-passo: Fazendo o Download de Assemblies por Demanda com a API de Implantao do ClickOnce Demonstra como marcar determinados assemblies em seu aplicativo como "optional" (opcional) e como fazer o download dos mesmos usando classes no namespace System.Deployment.Application quando a Common Language Runtime (clr) os requer. Passo-a-passo: Implementando um Editor de Tipos de Interface do Usurio Explica como criar seu prprio editor de tipos de interface do usurio para um tipo personalizado e como exibir a interface de edio usando um PropertyGrid. Recursos adicionais Visual Studio 2005 Developer Center Contm vrios artigos e recursos sobre o desenvolvimento de aplicativos usando o Visual Studio 2005. Este site atualizado regularmente com novos contedos. Visual C# Developer Center Contm vrios artigos e recursos sobre o desenvolvimento de aplicativos em C#. Este site atualizado regularmente com novos contedos. Microsoft .NET Framework Developer Center Contm vrios artigos e recursos sobre desenvolvimento e a depurao de aplicativos no .NET Framework. Este site atualizado regularmente com novos contedos.

Visual C# Consolidado

407

Introduo linguagem C# e ao .NET Framework


C# uma linguagem elegante orientada a objetos e fortemente tipada que permite aos desenvolvedores criar uma ampla variedade de aplicativos seguros e eficientes que so executados sob o .NET Framework. Voc pode usar C# para criar aplicativos clientes tradicionais do Windows , XML Web services, componentes distribudos, aplicativos cliente-servidor, aplicativos de banco de dados, e muito, muito mais. Microsoft Visual C# 2005 fornece um editor de cdigo avanado, designers de interface de usurio convenientes, depurador integrado, e muitas outras ferramentas para facilitar o rpido desenvolvimento de aplicativos com base na verso 2.0 da linguagem C# e do .NET Framework. Observao A documentao Visual C# presume que voc tenha uma compreenso dos conceitos bsicos existentes de programao. Se voc for um completo principiante, convm explorar Visual C# Express Edition, que est disponvel na Web. Voc tambm pode aproveitar qualquer um dos diversos livros excelentes e recursos da Web em C# para aprender tcnicas de prtica de programao. Linguagem C# A sintaxe C# altamente expressiva, mas com menos de 90 palavras-chave, tambm simples e fcil para aprender. A sintaxe do C# utilizando chaves como marcador de blocos ser instantaneamente reconhecvel para qualquer pessoa familiarizada com C, C++ ou Java. Os desenvolvedores que conhecem qualquer uma dessas linguagens so normalmente capazes de comear a trabalhar produtivamente em C# dentro de muito pouco tempo. A sintaxe C# simplifica muitas das complexidades de C++ enquanto fornece recursos poderosos como tipos de valor anulvel, enumeraes, delegaes, mtodos annimos e acesso direto memria, que no foram localizados em Java. C# tambm oferece suporte a mtodos e tipos genricos, que fornecem aumento de segurana e desempenho, e iteradores, que permitem implementadores das classes de coleo definirem comportamentos personalizados da iterao que so simples para usar pelo cdigo do cliente. Como uma linguagem orientada a objetos, C# suporta os conceitos de encapsulamento, herana e polimorfismo. Todas as variveis e mtodos, incluindo o mtodo Main, ponto de entrada do aplicativo, so encapsulados em definies da classe. Uma classe pode herdar diretamente de uma classe pai, mas ela pode implementar qualquer nmero de interfaces. Mtodos que substituem mtodos virtuais em uma classe pai exigem a palavra-chave override como uma forma para evitar redefinio acidental. No C#, uma estrutura como uma classe simplificada; ele um tipo alocado na pilha que pode implementar interfaces mas no tem suporte a herana. Alm desses princpios orientados a objetos, C# facilita o desenvolvimento de componentes de software atravs de vrios construtores inovadores da linguagem, incluindo:

Assinaturas de mtodos encapsulados chamadas delegaes, que permitem notificaes de eventos fortemente tipados. Propriedades, que servem como accessadores de variveis membros privadas. Atributos, que fornecem metadados declarativos sobre tipos no tempo de execuo. Comentrios internos da documentao XML.

Se voc precisar interagir com outro software Windows como objetos COM ou DLLs nativas Win32, voc pode fazer isso em C# atravs de um processo denominado "Interoperabilidade".

Visual C# Consolidado

408

Interoperabilidade permite que programas C# faam praticamente tudo que um aplicativo C++ nativo pode fazer. C# tambm suporta ponteiros e o conceito de cdigo "inseguro" para os casos no qual o acesso direto a memria absolutamente essencial. O processo de compilao C# simples comparado ao C e C++ e mais flexvel do que em Java. No h nenhum arquivo cabealho separado, e nenhum requisito de que mtodos e tipos sejam declarados em uma ordem especfica. Um arquivo fonte C# pode definir qualquer nmero de classes, estruturas, interfaces, e eventos. Estes so recursos adicionais do C#:

Para uma boa introduo geral da linguagem, consulte o Captulo 1 da Especificao da Linguagem C#. Para obter informaes detalhadas sobre aspectos especficos da linguagem C#, consulte a Referncia C#. Para uma comparao da sintaxe C# com a de Java e C++, consulte A linguagem de programao C# para desenvolvedores Java e Comparao entre C++ e C#.

Arquitetura da plataforma .NET Framework Programas C# so executados no .NET Framework, um componente integrante do Windows que inclui um sistema de execuo virtual chamado de Common Language Runtime (CLR) e um conjunto unificado de bibliotecas de classe. O CLR implementao comercial da Microsoft do Common Language Infrastructure (CLI), um padro internacional que a base para criar ambientes de execuo e desenvolvimento nos quais linguagens e bibliotecas trabalham perfeitamente juntas. Cdigo fonte escrito em C# compilado em uma linguagem intermediria (IL) que est em conformidade com a especificao CLI. O cdigo IL, juntamente com recursos como bitmaps e seqncias de caracteres, armazenado em disco em um arquivo executvel chamado de assembly, normalmente com uma extenso .exe ou .dll. Um assembly contm um manifesto que fornece informaes sobre tipos do assembly, verso, cultura, e requisitos de segurana. Quando o programa C# executado, o mdulo (assembly) carregado no CLR, que pode levar a vrias aes com base nas informaes no manifesto. Em seguida, se os requisitos de segurana forem atendidos, o CLR executa a compilao Just-In-Time (JIT) para converter o cdigo IL em instrues nativas da mquina. O CLR tambm oferece outros servios relacionados a coleta de lixo automtica, tratamento de exceo, e gerenciamento de recursos. Cdigo que executado pelo CLR as vezes conhecido como "cdigo gerenciado", em contraste com "cdigo no gerenciado" que compilado em linguagem de mquina nativa que atinge um sistema especfico. O diagrama a seguir ilustra os relacionamentos entre o tempo de compilao e o tempo de execuo dos arquivos de cdigo fonte C#, as bibliotecas de classes base, mdulos (assemblies), e o CLR.

Visual C# Consolidado

409

A interoperabilidade da linguagem um recurso chave do .NET Framework. Por estar em conformidade com o Common Type Specification (CTS), o cdigo IL produzido pelo compilador C# pode interagir com cdigo que foi gerado a partir das verses .NET do Visual Basic, Visual C++, Visual J#, ou qualquer uma das outras mais de 20 linguagens CTS-Compliant. Um conjunto nico pode conter vrios mdulos escritos em linguagens .NET diferentes, e os tipos podem se referenciar como se eles fossem escritos na mesma linguagem. Alm dos servios de tempo de execuo, o .NET Framework tambm inclui uma biblioteca abrangente com mais de 4000 classes organizadas em namespaces que fornecem uma variedade de funcionalidades teis para tudo desde entrada e sada de arquivo at manipulao de seqncia para anlise XML e controles de Windows Forms. Uma aplicao C# tpica usa amplamente a biblioteca de classe do .NET Framework para manipular tarefas comuns de "conexes internas". Para obter mais informaes sobre a plataforma .NET Framework, consulte Viso geral sobre o .NET Framework.

Viso geral sobre o .NET Framework


Esta seo fornece uma viso geral conceitual dos recursos chave do .NET Framework, incluindo o Common Language Runtime, a biblioteca de classes do .NET Framework, e interoperabilidade entre linguagens.

Viso Geral Conceitual Sobre o .NET Framework


O .NET Framework um componente integral do Windows que oferece suporte criao e execuo da prxima gerao de aplicativos e Servios XML da Web. O .NET Framework foi criado para atender os seguintes objetivos:

Visual C# Consolidado

410

Para fornecer um ambiente de programao orientada a objetos consistente, se o cdigo objeto for armazenado e executado localmente, executado localmente mas distribudo pela Internet ou executado remotamente. Para fornecer um ambiente da execuo de cdigo que minimiza conflitos de implantao e versionamento de software. Para fornecer um ambiente da execuo que promova a execuo segura do cdigo, incluindo o cdigo criado por terceiros: desconhecidos ou semi-confiveis. Para fornecer um ambiente da execuo que elimina os problemas de desempenho dos ambientes interpretados ou com scripts. Para tornar a experincia do desenvolvedor consistente, atravs dos diversos tipos de aplicativos, como aplicativos baseados no Windows e aplicativos baseados na Web. Para criar todas as comunicaes nas indstrias padro, para garantir que cdigos baseados no .NET Framework possam se integrar a qualquer outro cdigo.

O .NET Framework tem dois componentes principais: o Common Language Runtime e a biblioteca de classes do .NET Framework. O Common Language Runtime a fundao do .NET Framework. Voc pode pensar no Runtime como um agente que dirige o cdigo no tempo de execuo, fornecendo servios principais como gerenciamento de memria, gerenciamento de segmento e arquitetura de comunicao remota, enquanto foram, tambm, a segurana de tipos estritos e outras formas de preciso de cdigo que promovem segurana e robustez. Na verdade, o conceito de gerenciamento de cdigo um princpio fundamental do Runtime. O cdigo que visa o Runtime conhecido como cdigo gerenciado, enquanto o cdigo que no visa o Runtime conhecido como cdigo no gerenciado. A biblioteca de classes, outro componente principal do .NET Framework, uma coleo de objetos orientados de tipos reutilizveis, que voc pode usar para desenvolver aplicativos, variando de linhas de comando tradicionais ou aplicativos grficos de interfaces de usurios (GUI), para aplicativos com base nas inovaes mais recentes fornecidas pelo ASP.NET, como Web Forms e Servios XML da Web. O .NET Framework pode ser hospedado por componentes no gerenciados que carregam o Common Language Runtime em seus processos, e inicializam a execuo de cdigo gerenciado. Assim, criam um ambiente de software que pode explorar os recursos gerenciados e no gerenciados. O .NET Framework no apenas fornece vrios Runtime Hosts, como tambm suporta o desenvolvimento de Runtime Hosts de terceiros. Por exemplo, o ASP.NET hospeda o Runtime para fornecer um ambiente escalonvel, do lado do servidor, para cdigo gerenciado. ASP.NET trabalha diretamente com o tempo de execuo para ativar os aplicativos ASP.NET e Servios XML da Web, ambos sero discutidos posteriormente neste tpico. Internet Explorer um exemplo de um aplicativo no gerenciado que hospeda o Runtime (na forma de uma extenso tipo MIME). Usar o Internet Explorer para hospedar o Runtime, permite que voc incorpore componentes gerenciados ou controles Windows Forms em documentos HTML. Hospedar o Runtime dessa maneira, torna possvel o gerenciamento do cdigo mvel (semelhante a controles Microsoft ActiveX), mas com melhorias significativas que somente o cdigo gerenciado pode oferecer, como execuo semi-confivel e armazenamento de arquivos isolados. A ilustrao a seguir mostra o relacionamento do Common Language Runtime e da biblioteca de classes para seus aplicativos e para o sistema geral. A ilustrao tambm mostra como o cdigo gerenciado opera dentro uma arquitetura maior. NET Framework em contexto

Visual C# Consolidado

411

As sees a seguir descrevem os recursos e componentes principais do .NET Framework com mais detalhes. Recursos do Common Language Runtime O Common Language Runtime gerencia memria, execuo de segmento, execuo do cdigo, verificao de segurana do cdigo, compilao e outros servios do sistema. Esses recursos so intrnsecos para o cdigo gerenciado, que executa no Common Language Runtime. Quanto segurana, os componentes gerenciados so concedidos variando os graus da confiana, dependendo do nmero de fatores que incluem sua origem (como a Internet, rede corporativa ou computador local). Isso significa que um componente gerenciado pode ou no ser capaz de executar operaes de acesso de arquivo, operaes de registro de acesso ou outras funes confidenciais, mesmo se ele estiver sendo usado no mesmo aplicativo ativo. O Runtime impe segurana de acesso a cdigo. Por exemplo, os usurios podem confiar que um executvel, incorporado em uma pgina da Web, pode reproduzir uma animao na tela ou tocar uma msica, mas no pode acessar seus dados pessoais, arquivos de sistema ou rede. Os recursos de segurana do Runtime ativam o legtimo Internet-deployed software para ser caracterizado, excepcionalmente, como rico. O Runtime tambm impe robustez ao cdigo ao implementar uma estrita infra-estrutura Typeand-Code-Verification chamada Common Type System (CTS). O CTS assegura que todo cdigo gerenciado autodescritivo. Os diversos compiladores de linguagem da Microsoft e de terceiros geram cdigos gerenciados que esto em conformidade com o CTS. Isso significa que cdigos gerenciados podem consumir outros tipos gerenciados e instncias, enquanto foram estritamente a fidelidade tipo e segurana. Alm disso, o ambiente gerenciado do Runtime elimina muitos problemas comuns de software. Por exemplo, o Runtime automaticamente manipula o layout de objetos e gerencia referncias a eles, liberando-os quando no esto sendo usados. Este gerenciamento automtico de memria resolve os dois erros mais comuns de aplicativos: vazamentos e referncias invlidas de memria. O Runtime tambm acelera a produtividade do desenvolvedor. Por exemplo, os programadores podem escrever aplicativos em sua linguagem de desenvolvimento de preferncia, mas aproveitar completamente o Runtime, a biblioteca de classes e componentes escritos em outras linguagens, por outros desenvolvedores. Qualquer fornecedor de compilador que escolher direcionar o Runtime pode faz-lo. Compiladores de linguagem que direcionam o .NET Framework tornam os recursos do .NET Framework disponveis para cdigos existentes, escritos nessa linguagem, facilitando bastante o processo de migrao para os aplicativos existentes. O Runtime foi criado para o software do futuro, mas tambm suporta software atuais. Interoperabilidade entre cdigos gerenciados e no gerenciados permite aos desenvolvedores continuar a usar os componentes COM e DLLs necessrios. O Runtime projetado para melhorar o desempenho. Embora o Common Language Runtime fornea vrios servios padro de Runtime, o cdigo gerenciado nunca interpretado. Um recurso chamado compilao Just-In-Time (JIT) ativa todos os cdigos gerenciados para executar na linguagem nativa da mquina do sistema, no qual ele estiver em execuo. Enquanto isso, o gerenciador de memria remove as possibilidades de memria fragmentada e aumenta a localidade-de-referncia da memria, melhorando ainda mais o desempenho. Finalmente, o Runtime pode ser hospedado por aplicativos de alto desempenho, do lado do servidor, como o Microsoft SQL Server e Servios de Informaes da Internet (IIS). Esta infra-estrutura permite que voc use cdigo gerenciado para escrever sua lgica corporativa,

Visual C# Consolidado

412

enquanto aproveita o desempenho superior dos melhores servidores de empresa que suportam runtime hosting. Biblioteca de Classes do .NET Framework A Biblioteca de classes do .NET Framework uma coleo de tipos reutilizveis que se integram rigidamente com o Common Language Runtime. A biblioteca de classes orientada a objetos, fornecendo tipos que seu prprio cdigo gerenciado pode derivar. Isso no s torna os tipos do .NET Framework fceis de usar, como tambm reduz o tempo associado ao aprendizado de novos recursos do .NET Framework. Alm disso, componentes de terceiros podem se integrar totalmente com classes do .NET Framework. Por exemplo, as classes da coleo .NET Framework implementam um conjunto de interfaces que voc pode usar para desenvolver suas prprias colees de classes. Sua coleo de classes ser perfeitamente combinada com as classes do .NET Framework. Como voc espera de uma biblioteca de classe orientada a objetos, os tipos do .NET Framework permitem que voc realize uma gama de tarefas comuns de programao, incluindo tarefas como gerenciamento de seqncia de caracteres, coleta de dados, conectividade do banco de dados e acesso a arquivos. Alm dessas tarefas comuns, a biblioteca de classes inclui tipos que oferecem suporte a uma variedade de cenrios especializados de desenvolvimento. Por exemplo, voc pode usar o .NET Framework para desenvolver os seguintes tipos de aplicativos e servios:

Aplicativos de console. Aplicativos Windows GUI (Windows Forms). Aplicativos ASP.NET. Servios XML da Web. Servios do Windows.

Por exemplo, as classes Windows Forms so um conjunto abrangente de tipos reutilizveis que simplificam vastamente o desenvolvimento do Windows GUI. Se voc criar um aplicativo de Web Form ASP.NET, voc pode usar as classes Web Forms. Desenvolvimento de Aplicativos Cliente Aplicativos cliente so os mais prximos de um estilo tradicional de um aplicativo baseado em programao Windows. Esses so os tipos de aplicativos que exibem janelas ou formulrios na rea de trabalho, permitindo a um usurio executar uma tarefa. Aplicativos cliente incluem aplicativos como processadores de texto e planilhas, bem como aplicativos de negcios personalizados, como ferramentas de entrada de dados, ferramentas de relatrios e assim por diante. Aplicativos cliente geralmente empregam janelas, menus, botes e outros elementos GUI. Eles acessam, provavelmente, recursos locais como o sistema de arquivos e perifricos, como impressoras. Outro tipo de aplicativo cliente o tradicional controle ActiveX (agora, substitudo pelo o controle gerenciado do Windows Forms) implantado atravs da Internet como pgina da Web. Este aplicativo se parece muito com outros aplicativos clientes: ele executado de forma nativa, tem acesso a recursos locais e inclui elementos grficos. No passado, os desenvolvedores criavam esses aplicativos utilizando C/C++ em conjunto com o Microsoft Foundation Classes (MFC) ou com um ambiente de desenvolvimento de aplicativos rpidos (RAD) como o Microsoft Visual Basic . O .NET Framework incorpora aspectos desses produtos existentes em um ambiente de desenvolvimento simples e consistente, que drasticamente simplifica o desenvolvimento de aplicativos cliente.

Visual C# Consolidado

413

As classes do Windows Forms contidas no .NET Framework so projetadas para serem usadas para o desenvolvimento do GUI. Facilmente, voc pode criar janelas de comando, botes, menus, barras de ferramentas e outros elementos de tela, com a flexibilidade necessria para acomodar mudanas de necessidades comerciais Por exemplo, o .NET Framework fornece propriedades simples para ajustar atributos visuais associados a formulrios. Em alguns casos o sistema operacional base no d suporte para alterao direta desses atributos, e nesse caso o .NET Framework automaticamente recria os formulrios. Essa uma das vrias maneiras na qual o .NET Framework integra a interface do desenvolvedor, tornando a codificao simples e mais consistente. Diferentemente de controle ActiveX, controles Windows Forms tm acesso semi-confivel ao computador do usurio. Isso significa que execuo binria ou nativa de cdigo pode acessar alguns dos recursos do sistema do usurio (como elementos GUI e acesso limitado ao arquivo) sem poder acessar ou comprometer outros recursos. Devido segurana de acesso ao cdigo, muitos aplicativos que antes necessitavam ser instalados no sistema de um usurio, agora podem ser implantados atravs da Web. Seus aplicativos podem implementar os recursos de um aplicativo local, enquanto so implantadas como uma pgina da Web. Desenvolvimento de aplicativos servidores Aplicativos do servidor no mundo gerenciado so implementados atravs de Runtime Hosts. Aplicativos no gerenciados hospedam o Common Language Runtime, que permite que seu cdigo gerenciado personalizado controle o comportamento do servidor. Esse modelo fornece a voc todos os recursos do Common Language Runtime e biblioteca de classes, enquanto ganha o desempenho e escalabilidade do servidor host. A ilustrao a seguir mostra um esquema de rede bsica com cdigo gerenciado em execuo, em ambientes de servidores diferentes. Servidores como o IIS e SQL Server podem executar operaes padro, enquanto a lgica do seu aplicativo executa atravs do cdigo gerenciado. Cdigo gerenciado do lado do servidor

ASP.NET o ambiente de hospedagem que permite aos desenvolvedores usar o.NET Framework para direcionar aplicativos baseados na Web. Entretanto, o ASP.NET mais do que apenas um Runtime Host; ele uma arquitetura completa para desenvolver sites e objetos InternetDistributed, usando cdigo gerenciado. Web Forms e servios XML da Web usam IIS e ASP.NET como mecanismos de publicao de aplicativos, e ambos tm uma coleo de classes que so suportadas pelo .NET Framework. Servios XML da Web, uma evoluo importante na tecnologia baseada na Web, so componentes de aplicativos distribudos, do lado do servidor, semelhante a sites comuns da Web. Entretanto, diferentemente dos aplicativos baseados na Web, componentes de servios XML da Web no tm interface de usurio, e no so direcionados para navegadores como o Internet Explorer e Netscape Navigator. Em vez disso, servios XML da Web consistem em componentes de software reutilizveis, projetados para serem consumidos por outros aplicativos, como aplicativos cliente tradicionais, aplicativos baseados na Web ou mesmo outros servios XML da Web. Como resultado, a tecnologia dos servios XML da Web est movendo, rapidamente, o desenvolvimento e implantao de aplicativos para o ambiente altamente distribudo da Internet. Se voc utilizou verses anteriores da tecnologia ASP, voc imediatamente notar os aperfeioamentos que ASP.NET e Web Forms oferecem. Por exemplo, voc pode desenvolver pginas Web Forms em qualquer linguagem que suporte o .NET Framework. Alm disso, seu cdigo no precisa mais compartilhar o mesmo arquivo com o texto HTTP (embora ele possa

Visual C# Consolidado

414

continuar fazendo isso, se voc preferir). Pginas Web Forms executam na linguagem de mquina nativa porque, como qualquer outro aplicativo gerenciado, elas aproveitam completamente o Runtime. Por outro lado, pginas ASP no gerenciadas so sempre colocadas em script e interpretadas. Pginas ASP.NET so mais rpidas, mais funcionais e mais fceis para desenvolver do que as pginas ASP no gerenciadas, porque elas interagem com o Runtime como qualquer aplicativo gerenciado. O .NET Framework tambm fornece um conjunto de classes e ferramentas para ajudar no desenvolvimento e consumo de aplicativos de servios XML da Web. Servios XML da Web so criados em padres como SOAP (um protocolo remoto de chamada de procedimento), XML (um formato de dados extensvel) e WSDL (Web Services Description Language). O .NET Framework foi construdo sobre esses padres para promover a interoperabilidade com solues noMicrosoft. Por exemplo, a ferramenta WSDL, includa com o SDK do .NET Framework, pode consultar um servio XML da Web publicado na Web, analisar sua descrio WSDL e produzir cdigo fonte C# ou Visual Basic, que o aplicativo pode usar para se tornar um cliente do servio XML da Web. O cdigo fonte pode criar classes derivadas de classes, na biblioteca de classes que trata toda a comunicao base, usando anlise SOAP e XML. Embora voc possa usar a biblioteca de classes para consumir diretamente servios XML da Web, a ferramenta WSDL e as outras ferramentas contidas no SDK facilitam os esforos de desenvolvimento com o .NET Framework. Se voc desenvolver e publicar seus prprios servios XML da Web, o .NET Framework fornecer um conjunto de classes compatveis com todos os padres de comunicao como SOAP, WSDL, e XML. Usar as classes permite que voc enfoque na lgica do seu servio, sem se preocupar com com a infra-estrutura de comunicao exigida pelo desenvolvimento de software distribudos. Finalmente, como pginas Web Forms no ambiente gerenciado, seu servio XML da Web ser executado com a velocidade de linguagem de mquina nativa, usando a comunicao escalonvel do IIS.

Visual C# Consolidado

415

Common Language Runtime


O .NET Framework fornece um ambiente de tempo de execuo chamado Common Language Runtime, que executa o cdigo e fornece servios que facilitam o processo de desenvolvimento.

Viso geral do Common Language Runtime


Compiladores e ferramentas expem as funcionalidades do runtime e permitem que voc escreva cdigo que se beneficia desse ambiente de execuo gerenciado. Cdigo que voc desenvolve com um compilador de linguagem que visa o runtime chamado cdigo gerenciado; ele se beneficia de recursos como integrao entre linguagens, tratamento de exceo entre linguagens, segurana aprimorada, suporte a versionamento e implantao, um modelo simplificado para interao entre componentes, depurao e servios de perfil. Para ativar o runtime para fornecer servios de cdigo gerenciado, compiladores de linguagens devem emitir metadados que descrevem os tipos, membros, e referncias em seu cdigo. Os metadados so armazenados com o cdigo; todo arquivo executvel portvel (PE) carregvel do common language runtime contm metadados. O runtime usa metadados para localizar e carregar classes, organizar instncias na memria, resolver invocaes mtodo, gerar cdigo nativo, reforar a segurana, e definir limites de contexto em tempo de execuo. O runtime automaticamente trata de objetos de layout e gerencia referncias a objetos, liberandoos quando eles no esto sendo usados. Objetos cujos tempos de vida so gerenciados dessa forma so chamados de dados gerenciados. A coleta de lixo elimina vazamentos de memria e alguns outros erros comuns de programao. Se seu cdigo gerenciado, voc pode usar dados gerenciados, dados no gerenciados ou ambos no seu aplicativo .NET Framework. Devido ao fato de compiladores de linguagens fornecerem seus prprios tipos, como tipos primitivos, voc no pode sempre saber (ou precisa saber) se seus dados esto sendo gerenciados. O Common Language Runtime torna fcil a criao de componentes e aplicativos cujos objetos interagem entre linguagens. Objetos escritos em diferentes linguagens podem se comunicar entre si, e seus comportamentos podem ser totalmente integrados. Por exemplo, voc pode definir uma classe e, em seguida, usar uma linguagem diferente para derivar uma classe de sua classe original ou chamar um mtodo na classe original. Voc tambm pode passar uma instncia de uma classe para um mtodo de uma classe escrito em uma linguagem diferente. Essa integrao entre linguagens possvel porque os compiladores de linguagens e ferramentas que miram o runtime usam um CTS (Common Type System) definido pelo runtime, e eles seguem as regras do runtime para definir novos tipos, como tambm para criao, uso, persistncia e ligao de tipos. Como parte de seus metadados, todos os componentes gerenciados transportam informaes sobre os componentes e recursos dos quais eles foram construdos. O runtime usa essas informaes para garantir que o componente ou aplicativo tenha as verses especificadas de tudo o que precisa, o que torna seu cdigo menos suscetvel a quebra devido a alguma dependncia no encontrada. Informaes de registro e dados do estado no so mais armazenadas no registro onde eles podem ser difceis para estabelecer e manter. Em vez disso, as informaes sobre os tipos que voc definir (e suas dependncias) so armazenados com o cdigo como metadados, fazendo com que as tarefas de replicao de componentes e remoo sejam muito menos complicadas. Compiladores de linguagens e ferramentas expem as funcionalidades do runtime de maneira a serem teis e intuitivas para desenvolvedores. Isso significa que alguns recursos do runtime devem ser mais notveis em um ambiente que em outro. Como voc experimenta o runtime depende de qual compiladores de linguagem ou ferramentas voc usa. Por exemplo, se voc for um desenvolvedor Visual Basic, voc pode notar que com o Common Language Runtime, a

Visual C# Consolidado

416

linguagem Visual Basic tem mais recursos orientados a objetos do que antes. A seguir esto alguns benefcios do runtime:

Melhorias de desempenho. Capacidade de facilmente usar componentes desenvolvidos em outras linguagens. Tipos extensveis fornecidos por uma biblioteca de classes. Novos recursos da linguagem como herana, interfaces e sobrecarga para programao orientada a objetos; suporte a segmentao livre explcita que permite criao de aplicativos de vrios segmentos, escalonveis; suporte a tratamento de exceo estruturada e atributos personalizados.

Se voc usar o Microsoft Visual C++ .NET, voc pode escrever cdigo gerenciado usando o Managed Extensions for C++, que fornece os benefcios de um ambiente de execuo gerenciado como tambm o acesso a recursos poderosos e tipos de dados expressivos que voc est familiarizado. Recursos de runtime adicionais incluem:

Integrao entre linguagens, especialmente herana entre linguagens. Coleta de lixo que gerencia o tempo de vida de objeto sendo a contagem de referncia desnecessria. Objetos autodescritivos, que fazem uso da Interface Definition Language (IDL) desnecessariamente. A capacidade de compilar uma vez e executar em qualquer CPU e sistema operacional que d suporte ao runtime.

Voc tambm pode escrever cdigo gerenciado usando a linguagem C#, que fornece os seguintes benefcios:

Design completamente orientado a objetos. Segurana de tipos muito forte. Boa combinao da simplicidade do Visual Basic e poder do C++. Coleta de lixo. Sintaxe e palavras-chave semelhante as do C e C++. Uso do delegates em vez de ponteiros de funo para aumento da segurana de tipos e segurana. Ponteiros de funo esto disponveis atravs do uso da palavra-chave unsafe do C# e a opo /unsafe do compilador C# (CSC.exe) para cdigo no gerenciado e dados.

Gerenciamento automtico de memria


Gerenciamento automtico de memria um dos servios que o Common Language Runtime fornece durante a Execuo Gerenciada. O coletor de lixo do Common Language Runtime gerencia a alocao e liberao de memria para um aplicativo. Para desenvolvedores, isso significa que voc no tem que escrever cdigo para executar tarefas de gerenciamento de memria quando voc desenvolver aplicativos gerenciados. Gerenciamento automtico de memria pode eliminar problemas comuns, como esquecer de liberar um objeto e causar um vazamento de memria, ou tentar acessar a memria de um objeto que j tinha sido liberado. Esta seo descreve como o coletor de lixo aloca e libera memria. Alocando memria

Visual C# Consolidado

417

Quando voc inicializa um novo processo, o tempo de execuo reserva uma regio contgua de espao de endereo para o processo. Este espao de endereo reservado chamado de heap gerenciada. A heap gerenciada mantm um ponteiro para o endereo onde o prximo objeto da heap ser alocado. Inicialmente, esse ponteiro definido como Endereo bsico da heap gerenciada. Todos os tipos de referncia so alocados na heap gerenciada. Quando um aplicativo cria o primeiro tipo de referncia, alocada memria para o tipo no Endereo bsico da heap gerenciada. Quando o aplicativo cria o prximo objeto, o coletor de lixo aloca memria para ele no espao de endereo imediatamente aps o primeiro objeto. Desde que exista espao de endereo disponvel, o coletor de lixo continua a alocar espao para novos objetos dessa maneira. Alocar memria de heap gerenciada mais rpido que a alocao de memria no gerenciada. Pelo fato de que o Runtime aloca memria para um objeto adicionando um valor a um ponteiro, ele quase to rpido quanto a alocao de memria da pilha (stack). Alm disso, porque novos objetos que so alocados consecutivamente so armazenados contiguamente na heap gerenciada, um aplicativo pode acessar os objetos muito rapidamente. Liberando memria O mecanismo otimizado do coletor de lixo determina o melhor momento para executar uma coleta com base nas alocaes sendo feitas. Quando o coletor de lixo executa uma coleta, ele libera a memria dos objetos que no esto sendo usados pelo aplicativo. Ele determina quais objetos no esto mais sendo usados pelo exame das razes do aplicativo. Cada aplicativo tem um conjunto de razes. Cada raiz refere-se a um objeto na heap gerenciada ou definida como nula. Razes do aplicativo incluem ponteiros para objetos globais e estticos, variveis locais e parmetros de objetos de referncia na pilha de um segmento, e registro da CPU. O coletor de lixo tem acesso lista de razes ativas mantidas pelo runtime e pelo Compilador Just-In-Time (JIT). Usando essa lista, ele examina as razes do aplicativo, e no processo cria um grfico que contm todos os objetos que possam ser alcanados a partir as razes. Objetos que no esto no grfico so inacessveis a partir das razes do aplicativo. O coletor de lixo considera como lixo os objetos inacessveis e ir liberar a memria alocada para eles. Durante uma coleta, o coletor de lixo examina a heap gerenciada, procurando pelos blocos de espao de endereo ocupados por objetos inacessveis. Na medida em que ele descobre cada objeto inacessvel, ele usa uma funo de cpia de memria para compactar os objetos acessveis na memria, liberando os blocos de espaos endereo alocados para objetos inacessveis. Uma vez que a memria para dos objetos acessveis tiver sido compactada, o coletor de lixo faz as correes de ponteiros necessrias razes de forma que as razes do aplicativo apontem para os objetos em seus novos locais. Ele tambm posiciona o ponteiro da heap gerenciadas aps o ltimo objeto acessvel. Observe que memria compactada somente se uma coleta descobre um nmero significativo de objetos inacessveis. Se todos os objetos na heap gerenciada sobrevivem a uma coleta, no h necessidade de compactao de memria. Para melhorar o desempenho, o tempo de execuo aloca memria para objetos grandes em uma heap separada. O coletor de lixo libera automaticamente. a memria para objetos grandes Entretanto, para evitar mover objetos grandes na memria, essa memria no compactada. Geraes e Desempenho Para otimizar o desempenho do coletor de lixo, a heap gerenciada est dividida em trs geraes: 0, 1, e 2. O algoritmo de coleta de lixo do tempo de execuo baseado em vrias generalizaes que indstria de software de computador tem descoberto serem verdadeiras por experincias com esquemas de coleta de lixo Primeiro, mais rpido compactar a memria para uma parte da heap gerenciada do que para toda a memria gerenciada. Em segundo lugar, objetos mais recentes tero vidas teis menores e objetos mais antigos tero vidas teis mais longas. Por fim, objetos mais recentes tendem a ser relacionados entre si e acessados pelo aplicativo ao redor do mesmo tempo.

Visual C# Consolidado

418

O coletor de lixo do Runtime armazena novos objetos na gerao 0. Objetos criados com antecedncia no tempo de vida do aplicativo que sobrevivem a coletas so promovidos e armazenados em geraes 1 e 2. O processo de promoo do objeto descrito posteriormente neste tpico. Porque mais rpido compactar uma parte da heap gerenciada que a heap inteira, este esquema permite que o coletor de lixo libere a memria em uma gerao especfica em vez liberar a memria para toda a memria gerenciada a cada vez que ele executa uma coleta. Na verdade, o coletor de lixo executa uma coleta quando a gerao 0 est cheia. Se um aplicativo tentar criar um novo objeto quando a gerao 0 est cheia, o coletor de lixo descobre que no existe nenhum espao de endereo restante na gerao 0 para alocar para o objeto. O coletor de lixo executa uma coleta em uma tentativa de liberar espao de endereo na gerao 0 para o objeto. O coletor de lixo inicia examinando os objetos na gerao 0 em vez de todos os objetos na heap gerenciada. Isso a abordagem mais eficiente, porque novos objetos costumam ter tempos de vida curtos, e esperado que muitos dos objetos na gerao 0 no estejam mais em uso mais pelo aplicativo quando uma coleta executada. Alm disso, uma nica coleta de gerao 0 freqentemente recupera memria suficiente para permitir ao aplicativo continuar criando novos objetos. Aps o coletor de lixo executar uma coleta de gerao 0, ele compacta a memria para os objetos acessveis conforme explicado anteriormente neste tpico em Liberando memria. O coletor de lixo ento promove esses objetos e considera esta parte da heap gerenciada como gerao 1. Pelo fato de que objetos que sobrevivem a coletas costumam ter vidas teis mais longas, faz sentido promov-los para uma gerao superior. Como resultado, o coletor de lixo no tem que reexaminar os objetos em geraes 1 e 2 sempre que ele executa uma coleta de gerao 0. Aps o coletor de lixo executar sua primeira coleta de gerao 0 e promover os objetos acessveis na gerao 1, ele considera o resto da heap gerenciada como gerao 0. Ele continua a alocar memria para novos objetos na gerao 0 at que a gerao 0 esteja cheia e que seja necessrio executar outra coleta. Nesse ponto, o mecanismo de otimizao do coletor de lixo determina se ele necessrio examinar os objetos em geraes mais antigas. Por exemplo, se uma coleta de gerao 0 no recupera memria suficiente para o aplicativo concluir sua tentativa de criar um novo objeto de forma bem sucedida, o coletor de lixo pode executar uma coleta de gerao 1, e depois de gerao 0. Se isso no recuperar memria suficiente, o coletor de lixo pode executar uma coleta de geraes 2, 1, e 0. Aps cada coleta, o coletor de lixo compacta os objetos acessveis na gerao 0 e promove-os para gerao 1. Objetos na gerao 1 que sobrevivem a coletas so elevados para gerao 2. Como o coletor de lixo oferece suporte somente a trs geraes, objetos na gerao 2 que sobrevivem a uma coleta permanecem na gerao 2 at que eles sejam determinados como inalcanveis em uma coleta futura. Liberando Memria para Recursos no Gerenciados Para a maioria dos objetos que seu aplicativo cria, voc pode confiar no coletor de lixo para executar automaticamente as tarefas de gerenciamento de memria necessrias. Entretanto, recursos no gerenciados requerem limpeza explcita. O tipo mais comum de recurso no gerenciado um objeto que envolve um recurso do sistema operacional, como um identificador de arquivo, identificador de janela, ou conexo de rede. Embora o coletor de lixo seja capaz de controlar o tempo de vida de um objeto gerenciado que encapsula um recurso no gerenciado, ele no tem conhecimento especfico sobre como limpar o recurso. Quando voc criar um objeto que encapsula um recurso no gerenciado, recomendado que voc fornea o cdigo necessrio para limpar o recurso no gerenciado em um mtodo Dispose pblico. Ao fornecer um mtodo Dispose, voc permite que usurios do seu objeto explicitamente liberem sua memria quando eles tiverem concludo com o objeto. Quando voc usa um objeto que encapsula um recurso no gerenciado, voc deve estar ciente do Dispose e cham-lo conforme necessrio. Para obter mais informaes sobre limpeza de recursos no gerenciados e um exemplo de um padro de design para implementar Dispose, consulte Coleta Lixo.

Visual C# Consolidado

419

CTS (Common Type System)


O CTS (Common Type System) define como tipos so declarados, usados, e gerenciados no ambiente de tempo de execuo, e tambm uma parte importante do suporte do ambiente de tempo de execuo para integrao entre linguagens. O CTS executa as seguintes funes:

Estabelece uma estrutura que ajuda a habilitar integrao entre linguagens, segurana de tipos, e execuo de cdigo de alto desempenho. Fornece um modelo orientado a objetos que oferece suporte implementao completa de muitas linguagens de programao. Define regras que as linguagens devem seguir, que ajudam a assegurar que objetos escritos em linguagens diferentes podem interagir entre si.

Viso Geral do CTS (Common Type System)


Esta seo descreve conceitos e define termos que ajudaro a compreender e trabalhar com a implementao do CTS da sua linguagem. Classificao de Tipos O CTS fornece suporte a duas categorias gerais de tipos, cada um delas posteriormente dividida em subcategorias:

Tipos de valor Tipos de valor contm diretamente seus dados. Instncias de tipos de valor ou so alocadas na pilha ou so alocadas internamente em uma estrutura. Tipos de valor podem ser internos (implementados pelo ambiente de execuo), definidos pelo usurio ou enumeraes. Para obter uma lista dos tipos valor internos, consulte a Biblioteca de Classes do .NET Framework.

Tipos de referncia Tipos de referncia armazenam uma referncia para o endereo de memria do valor e so alocados no heap. Tipos referncia podem ser tipos autodescritivos, tipos ponteiro ou tipos de interface. O tipo de um tipo de referncia pode ser determinado a partir dos valores de tipos autodescritivos. Tipos autodescritivos so posteriormente divididos em matrizes e tipos de classe. Os tipos de classe so classes definidas pelo usurio, tipos de valor convertidos e delegates.

Variveis que so tipos de valor possuem sua prpria cpia dos dados e, portanto, operaes em uma varivel no afetam outras variveis. Variveis que so tipos de referncia podem referenciar o mesmo objeto e, portanto, operaes em uma varivel podem afetar o mesmo objeto referenciado por outra varivel. Todos os tipos derivam do tipo base System.Object. O exemplo a seguir mostra a diferena entre tipos de referncia e tipos de valor. C#
using System; class Class1 { public int Value = 0; } class Test { static void Main() { int val1 = 0; int val2 = val1; val2 = 123; Class1 ref1 = new Class1(); Class1 ref2 = ref1; ref2.Value = 123; Console.WriteLine("Values: {0}, {1}", val1, val2); Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value); } }

A sada do programa a seguinte.

Visual C# Consolidado

420

Values: 0, 123 Refs: 123, 123

O diagrama a seguir ilustra como esses tipos esto relacionados. Observe que instncias de tipos podem ser simplesmente tipos de valor ou tipos autodescritivos, mesmo que haja subcategorias desses tipos. Classificao de tipos

Valores e objetos Valores so representaes binrias de dados. Os tipos fornecem uma maneira de interpretar esses dados. Um tipo de valor armazenado como uma representao binria dos dados do tipo. O valor de um tipo de referncia a localidade da seqncia de bits que representam os dados do tipo. Cada valor possui um tipo exato que define por completo a representao do valor e as operaes que so definidas no valor. Valores de tipos autodescritivos so chamados objetos. Enquanto sempre possvel determinar o tipo exato de um objeto examinando seu valor, no possvel fazer o mesmo com o um tipo de valor ou tipo ponteiro. Um valor pode ter mais de um tipo. Um valor cujo tipo implementa uma interface tambm um valor do tipo da interface. Da mesma forma, um valor cujo tipo deriva de um tipo base tambm um valor desse tipo base. Tipos e Assemblys O ambiente de execuo usa assemblys para localizar e carregar tipos. O manifesto do assembly contm as informaes que o ambiente de execuo usa para resolver todas as referncias de tipo feitas dentro do escopo do assembly. Um nome de tipo no ambiente de execuo possui duas partes lgicas: o nome do assembly e o nome do tipo dentro do assembly. Dois tipos com o mesmo nome, mas em assemblys diferentes, so definidos como dois tipos distintos.

Visual C# Consolidado

421

Assemblys fornecem consistncia entre o escopo de nomes vistos pelo desenvolvedor e o escopo de nomes vistos pelo sistema em tempo de execuo. Os desenvolvedores criam tipos no contexto de um assembly. O contedo do assembly que est sendo criando por um desenvolvedor estabelece o escopo de nomes que estar disponvel em tempo de execuo. Tipos e Namespaces No ponto de vista do ambiente de execuo, um namespace apenas um conjunto de nomes de tipo. Determinadas linguagens podem ter construes que ajudam os desenvolvedores a formar grupos lgicos de tipos, mas essas construes no so usadas pelo ambiente de execuo ao vincular tipos. Assim, ambas as classes Object e String so parte do namespace System, mas o ambiente de execuo reconhece apenas os nomes completos de cada tipo que so System.Object e System.String, respectivamente Voc pode criar um nico assembly que expe tipos que parecem ter vindo de dois namespaces hierrquicos diferentes, como System.Collections e System.Windows.Forms. Voc tambm pode criar dois assemblys que exportam tipos cujos nomes contenham MyDll.MyClass. Se voc criar uma ferramenta para representar tipos em um assembly como pertencentes a um namespace hierrquico, a ferramenta deve enumerar os tipos em um assembly, ou em um grupo de assemblys, e analisar os nomes dos tipos a fim de derivar um relacionamento hierrquico.

Definies de Tipo
Voc define novos tipos a partir de tipos existentes. Tipos de valor interno, ponteiros, matrizes e delegados so definidos quando eles so usados e so referidos como tipos implcitos. Tipos podem ser aninhados; ou seja, um tipo pode ser um membro de outro tipo. Uma definio de tipo inclui:

Qualquer atributo definido no tipo. A visibilidade do tipo. O nome do tipo. O tipo base do tipo. Qualquer interface implementada pelo tipo. Definies para cada um dos membros do tipo.

Atributos Atributos fornecem metadados adicionais definidos pelo usurio. Atributos podem ser aplicados a praticamente qualquer elemento de linguagem tipos, propriedades, mtodos e assim por diante. Tipo de acessibilidade Todos os tipos tm um modificador de acessibilidade que rege sua acessibilidade a outros tipos. A tabela a seguir descreve a acessibilidade de tipo suportada pelo runtime. Acessibilidade Pblico Descrio O tipo acessvel por todos os assemblies.

Visual C# Consolidado

422

Assembly

O tipo acessvel somente dentro do assembly.

A acessibilidade de um tipo aninhado depende do seu domnio de acessibilidade, que determinado pelas acessibilidade declarada do membro e pelo domnio de acessibilidade do tipo imediatamente contido. Entretanto, o domnio de acessibilidade de um tipo aninhado no pode exceder o do tipo contido. O domnio de acessibilidade de um membro aninhado M declarado em um tipo T de um programa P definido como segue (observando que M, por si s, pode ser um tipo):

Se a acessibilidade declarada de M for public, o domnio de acessibilidade de M o domnio de acessibilidade de T. Se a acessibilidade declarada de M for protected internal, o domnio de acessibilidade de M a interseo do domnio de acessibilidade de T com o do texto do programa de P, e o texto do programa de qualquer tipo derivado de T, declarado fora de P. Se a acessibilidade declarada de M for protected, o domnio de acessibilidade de M a interseo do domnio de acessibilidade de T com o texto do programa de T, e qualquer tipo derivado de T. Se a acessibilidade declarada de M for internal, o domnio de acessibilidade de M a interseo do domnio de acessibilidade de T com o texto de programa de P. Se a acessibilidade declarada de M for private, o domnio de acessibilidade de M o texto de programa de T.

Nomes de Tipos O CTS impe apenas duas restries de nomes: 1. 2. Todos os nomes so codificados como seqncias de caracteres Unicode (16 bits). No so permitidos nomes que tenham um valor (16 bits) incorporado de 0x0000.

Todas as comparaes so feitas em uma base byte-by-byte, e possuem, portanto, diferenciao de maisculas e minsculas e so independentes de local Embora um tipo possa fazer referncia a tipos de outros mdulos e assemblies, um tipo totalmente definido dentro de um mdulo. Nomes de tipo precisam somente ser exclusivos em um assembly. Para identificar totalmente um tipo, o nome do tipo deve ser qualificado pelo assembly que contm a implementao do tipo. Para mais informaes, consulte Especificando Nomes de Tipos Totalmente Qualificados. Tipos Base e Interfaces Um tipo pode herdar valores e comportamentos de outro tipo. O CTS no permite que tipos sejam herdados de mais de um tipo base. Um tipo pode implementar qualquer nmero de interfaces. Para implementar uma interface, um tipo deve implementar todos os membros virtuais da interface. Um mtodo virtual pode ser implementado por um tipo derivado e pode ser chamado esttica ou dinamicamente. Para obter mais informaes sobre membros virtuais, consulte Membros de Tipos. Para obter mais informaes sobre herana e interfaces, consulte Classes e Interfaces. Membros de Tipos

Visual C# Consolidado

423

O comportamento e estado de um tipo so definidos pelos membros do tipo: eventos, campos, tipos aninhados, mtodos e propriedades. Para mais informaes, consulte Membros de Tipos.

Membros de Tipos
O ambiente de execuo permite que voc defina os membros do tipo: eventos, campos, tipos aninhados, mtodos e propriedades. Cada membro tem uma assinatura. A tabela a seguir descreve os membros usados no .NET Framework. Membro Evento Descrio Define um incidente ao qual pode-se responder e define mtodos para inscrever em, cancelar a inscrio em e levantar um evento. Eventos so freqentemente usados para informar outros tipos de alteraes de estado. Descreve e contm parte do estado do tipo. Campos podem ser de qualquer tipo suportado pelo ambiente de execuo. Define um tipo dentro do escopo do tipo delimitador. Descreve as operaes disponveis no tipo. A assinatura do mtodo especifica os tipos dos argumentos e o valor de retorno do mtodo. O construtor um tipo especial de mtodo que cria novas instncias de um tipo.

Campo Tipo aninhado Mtodo

Propriedade Nomeia um valor ou um estado do tipo e define mtodos para obter ou definir o valor da propriedade. Propriedades podem ser tipos primitivos, colees de tipos primitivos, tipos definidos pelo usurio ou colees de tipos definidos pelo usurio. Propriedades so freqentemente usadas para manter a interface pblica de um tipo, independente da representao real do tipo. Caractersticas de um Membro O CTS (Common Type System) permite que os membros possuam uma variedade de caractersticas, mas as linguagens no necessariamente suportam todas elas. A tabela a seguir descreve as caractersticas de um membro. Pode ser aplicada a Mtodos, propriedades e eventos

Caracterstica abstract

Descrio O tipo no fornece a implementao do mtodo. Tipos que herdam mtodos abstratos e tipos que implementam interfaces com mtodos abstratos devem fornecer uma implementao para o mtodo. A nica exceo quando o tipo derivado um tipo abstrato. Todos os mtodos abstratos so virtuais. Define a acessibilidade de um membro: private Acessvel somente dentro do tipo do membro ou dentro de um tipo aninhado. family Acessvel dentro do tipo do membro e dentro de um tipo derivado que herda do tipo do membro. assembly Acessvel somente no assembly no qual o tipo definido. family e assembly

private, family, assembly, family e assembly, family ou assembly, ou public

Todos

Visual C# Consolidado

424

Acessveis somente dentro de tipos que se cumprem tanto as restries de acesso da caracterstica family quanto da caracterstica assembly. family ou assembly Acessveis somente dentro de tipos que se cumprem as restries de acesso da caracterstica family ou as restries da caracterstica assembly. public Acessveis dentro de qualquer tipo. final Mtodos, propriedades e eventos Campos Campos, mtodos, propriedades e eventos Um mtodo virtual no pode ser substitudo em um tipo derivado. O valor pode apenas ser inicializado, no pode ser gravado outro valor aps a inicializao. Se um membro no estiver marcada como static (C# e C++), Shared (Visual Basic), virtual. (C# e C++) ou Overridable (Visual Basic), ele um membro da instncia (no existe a palavra-chave instance). Haver o mesmo nmero de cpias desses membros na memria e de objetos que os usam. O valor atribudo ao campo um valor fixo, conhecido em tempo de compilao, de um tipo de valor interno. s vezes, campos marcados como literal so chamados de constantes. Define como o membro interage com os membros herdados que possuem a mesma assinatura: newslot Oculta membros herdados que possuem a mesma assinatura. override Substitui a definio de um mtodo virtual herdado. O padro newslot. O membro pertence ao tipo no qual est definido e no a uma instncia particular do tipo. O membro existe mesmo que uma instncia de tipo no tenha sido criada. Ele compartilhado entre todas as instncias do tipo. O mtodo pode ser implementado por um tipo derivado e pode ser chamado estaticamente ou dinamicamente. Se foi usada uma chamada dinmica, o tipo da instncia que fez a chamada em tempo de execuo determina qual implementao do mtodo deve ser chamada, e no o tipo conhecido em tempo de compilao. Para chamar um mtodo virtual estaticamente, pode ser necessrio converter a varivel (usando o operador cast) para um tipo que usa a verso desejada do mtodo.

initialize-only instance

literal

Campos

newslot ou override

Todos

static

Campos, mtodos, propriedades e eventos Mtodos, propriedades e eventos

virtual

Sobrecarga

Visual C# Consolidado

425

Cada membro de tipo tem uma assinatura nica. A assinatura de um mtodo consistem do nome do mtodo e da lista de parmetros (a ordem e tipos dos argumentos do mtodo). Mais de um mtodo com o mesmo nome pode ser definido em um tipo desde que as assinaturas sejam diferentes. Quando dois ou mais mtodos com o mesmo nome so definidos, diz-se que o mtodo est sobrecarregado. Listas de parmetros podem ser qualificadas por restries varargs, indicando que o mtodo suporta uma lista de argumentos varivel. Por exemplo, em System.Char, o mtodo IsDigit est sobrecarregado. Um mtodo recebe um Char e retorna um Boolean, outro mtodo recebe um Int32 e uma String e retorna um Boolean Herana, Substituio e Membros Ocultos Um tipo derivado herda todos os membros do seu tipo base, ou seja, esses membros esto definidos no tipo derivado e disponveis para o mesmo. O comportamento, ou qualidades, de membros herdados pode ser modificado de duas maneiras:

Um tipo derivado pode ocultar um membro herdado definindo um novo membro com a mesma assinatura. Isso pode ser feito quando deseja-se tornar um membro pblico em privado ou para definir um novo comportamento para um mtodo herdado que est marcado como final. Um tipo derivado pode substituir um mtodo virtual herdado. O novo mtodo fornece uma nova definio do mtodo original. Essa nova definio ser chamada baseando-se no tipo do valor em tempo de execuo, em vez de no tipo conhecido em tempo de compilao. Um mtodo s pode substituir um mtodo virtual se o mtodo virtual no est marcado como final. O novo mtodo est pelo menos to acessvel quanto o mtodo virtual.

Tipos de valor no Common Type System


A maioria das linguagens de programao fornecem tipos de dados internos, como inteiros e nmeros de ponto flutuante que so copiados quando eles so passados como argumentos (ou seja, eles so passados pelo valor). No .NET Framework, esses so os chamados tipos de valor. O Runtime oferece suporte a dois tipos de tipos de valor:

Tipos de valor interno O .NET Framework define Tipos de valor interno, como System.Int32 e System.Boolean, que correspondem e so idnticos aos tipos de dados primitivos usados por linguagens de programao.

Tipos de valor definidos pelo usurio A sua linguagem fornecer maneiras para definir seus prprios tipos de valor, que derivam de System.ValueType ou System.Enum. Se voc desejar definir um tipo representando um valor que seja pequeno, como um nmero complexo (usando dois nmeros de ponto flutuante), voc pode optar por defini-lo como um tipo de valor porque voc pode passar por valor o tipo de valor com eficincia. Se voc estiver definindo um tipo que seria mais eficientemente passado por referncia, em vez disso, voc deve defini-lo como uma classe .

Para obter informaes especficas sobre enumaraes, consulte Enumeraes no Common Type System (CTS). Tipos de valor so armazenados to eficientemente quanto tipos primitivos, mas voc pode chamar mtodos neles, incluindo os mtodos virtuais definidos nas classes System.ValueType e System.Object, assim como quaisquer mtodos definidos no prprio tipo de valor. Voc pode criar instncias de tipos de valor, pass-los como parmetros, armazen-los como variveis locais, ou armazen-los em um campo de outro tipo de valor ou objeto. Tipos valor no tm a sobrecarga associada com o armazenamento de uma instncia de uma classe e eles no exigem construtores.

Visual C# Consolidado

426

Para cada tipo de valor, o tempo de execuo fornece um tipo convertido (boxed) correspondente, que uma classe que tem o mesmo estado e comportamento que o tipo de valor. Algumas linguagens exigem que voc utilize sintaxe especial quando o tipo convertido (boxed) necessrio; outras usam automaticamente o tipo convertido (boxed) quando for necessrio. Quando voc define um tipo de valor, voc est definindo o tipo convertido (boxed) e o tipo noconvertido (unboxed). Tipos de valor podem ter campos, propriedades e eventos. Eles tambm podem ter mtodos estticos e no-estticos. Quando eles so convertidos (boxed), eles herdam os mtodos virtuais de System.ValueType, e eles podem implementar zero ou mais interfaces. Tipos de valor so autenticados (sealed), o que significa que nenhum outro tipo pode ser derivado a partir deles. Entretanto, voc pode definir mtodos virtuais diretamente sobre o tipo de valor, e esses mtodos podem ser chamados tanto no na forma convertida (boxed) quanto na noconvertida (unboxed) do tipo. Embora voc no possa derivar outro tipo de um tipo de valor, voc pode definir mtodos virtuais em um tipo de valor quando voc estiver usando uma linguagem em que for mais conveniente trabalhar com mtodos virtuais do que com mtodos no-virtuais ou estticos. O exemplo a seguir mostra como construir um tipo de valor para nmeros complexos. C#
using System; // Value type definition for a complex number representation. public struct Complex { public double r, i; // Constructor. public Complex(double r, double i) { this.r = r; this.i = i; } // Returns one divided by the current value. public Complex Reciprocal { get { if (r == 0d && i == 0d) throw new DivideByZeroException(); double div = r*r + i*i; return new Complex(r/div, -i/div); } } // Conversion operators. public static explicit operator double(Complex a) { return a.r; } public static implicit operator Complex(double r) { return new Complex(r,0d); } // Basic unary operators. public static Complex operator + (Complex a) { return a; } public static Complex operator - (Complex a) { return new Complex(-a.r, -a.i); } // Basic binary operators for addition, subtraction, multiplication, and division. public static Complex operator + (Complex a, Complex b) { return new Complex(a.r + b.r, a.i + b.i); } public static Complex operator (Complex a, Complex b) { return new Complex(a.r - b.r, a.i - b.i); } public static Complex operator * (Complex a, Complex b) { return new Complex(a.r*b.r - a.i*b.i, a.r*b.i + a.i*b.r); } public static Complex operator / (Complex a, Complex b) { return a * b.Reciprocal; } // Override the ToString method so the value appears in write statements. public override string ToString() { return String.Format("({0}+{1}i)", r, i); } } // Entry point. public class ValueTypeSample { public static void Main() { Complex a = new Complex(0, 1); Complex b = new Complex(0, -2); Console.WriteLine(); Console.WriteLine("a = " + a); Console.WriteLine("b = " + b); Console.WriteLine(); Console.WriteLine("a + b = " + (a+b)); Console.WriteLine("a - b = " + (a-b)); Console.WriteLine("a * b = " + (a*b)); Console.WriteLine("a / b = " + (a/b)); Console.WriteLine(); Console.WriteLine("(double)a = " + (double)a); Console.WriteLine("(Complex)5 = " + (Complex)5); } }

A sada deste programa como se segue.


a = (0+1i) b = (0+-2i) a + b = (0+-1i) a - b = (0+3i) a * b = (2+0i) a / b = (-0.5+0i) (double)a = 0 (Complex)5 = (5+0i)

Classes no Common Type System


Se voc estiver familiarizado com programao orientada a objetos, voc sabe que uma classe define as operaes que um objeto pode executar (mtodos, eventos, ou propriedades) e define um valor que contm o estado do objeto (campos). Embora uma classe geralmente inclua tanto a

Visual C# Consolidado

427

definio quanto a implementao, ela pode ter um ou mais membros que no possuem implementao. Uma instncia de uma classe um objeto. Voc acessa as funcionalidades de um objeto chamando seus mtodos e acessando suas propriedades, eventos, e campos. A tabela a seguir fornece uma descrio de algumas das caractersticas que o tempo de execuo permite para uma classe. (Caractersticas adicionais que esto disponveis atravs de classes de Atributos no so includas nesta lista.) Sua linguagem pode no tornar todas essas caractersticas disponveis. Caracterstica autenticada implementa Abstrata Herda Descrio Especifica que outro tipo no pode ser derivado desse tipo. Indica que a classe usa uma ou mais interfaces, fornecendo implementaes de membros da interface. Especifica que voc no pode criar uma instncia da classe. Para us-la, voc deve derivar outra classe a partir dela. Indica que as instncias da classe podem ser usadas em qualquer lugar em que a classe base for especificada. Uma classe derivada que herda de uma classe base pode usar a implementao de qualquer mtodo virtual fornecido pela classe base, ou a classe derivada pode substitu-los com sua prpria implementao.

exportada ou no Indica se uma classe est visvel fora do Assembly em que ela est definida. exportada S se aplica a classes de alto nvel. Classes aninhadas tambm tm caractersticas membros. Para mais informaes, consulte Tipos membros. Membros da classe que no tm implementao so membros abstratos. Uma classe que tenha um ou mais membros abstratos ela prpria abstrata; no possvel criar novas instncias dessa classe. Algumas linguagens que direcionam o tempo de execuo permitem que voc marque uma classe como abstrata mesmo que nenhum de seus membros seja abstrato. Voc pode usar uma classe abstrata quando voc precisar encapsular um conjunto bsico de funcionalidades que as classes derivadas podem herdar ou substituir quando for apropriado. Classes que no so abstratas so chamadas de classes concretas. Uma classe pode implementar qualquer nmero de interfaces, mas ela pode herdar apenas da uma classe base. Todas as classes devem ter pelo menos um construtor, que inicializa novas ocorrncias da classe. Cada linguagem com suporte ao tempo de execuo fornece uma maneira para indicar que uma classe ou membros da classe tem caractersticas especficas. Quando voc usa a sintaxe exigida pela sua linguagem, a linguagem garante que as caractersticas da classe e seus membros so armazenados (como Metadados) junto com a implementao da classe.

Delegados no Common Type System


O Runtime oferece suporte a tipos de referncia, chamados delegados, que servem a um propsito semelhante ao de ponteiros de funo em C++. Diferentemente de ponteiros de funo, delegados so seguros, verificveis e do tipo seguro. Um tipo delegado pode representar qualquer mtodo com uma assinatura compatvel. Enquanto ponteiros de funo podem representar

Visual C# Consolidado

428

somente funes estticas, um delegado pode representar mtodos estticos e de instncias. Delegados so usados para manipular eventos e funes callback no .NET Framework. Todos os delegados so herdados do MulticastDelegate, que so herdados do Delegate. As linguagens C#, Visual Basic e C++ no permitem a herana desses tipos, ao invs de fornecerem palavras-chave para declarar delegados. Como representantes so herdados do MulticastDelegate, um delegado tem uma lista de invocao, que uma lista dos mtodos que o delegado representa, e que so executados quando o delegado chamado. Todos os mtodos da lista recebem os argumentos fornecidos quando o delegado chamado. Observao O valor de retorno no est definido para um delegado que tenha mais de um mtodo na sua lista de invocao, mesmo que o delegado tenha um tipo de retorno. Criando e usando representantes Em muitos casos, como em mtodos callback, um delegado representa apenas um mtodo, e as nicas aes voc precisa fazer so criar e invocar o delegado. Para delegados que representam vrios mtodos, o .NET Framework fornece mtodos de classes de delegao Delegate. e MulticastDelegate para dar suporte a operaes como adicionar um mtodo para a lista de invocao do um delegado (mtodo System.Delegate.Combine(System.Delegate[])), remover um mtodo (mtodo System.Delegate.Remove(System.Delegate,System.Delegate)) e obter a lista de invocao (mtodo System.Delegate.GetInvocationList) Observao No necessrio usar esses mtodos para delegados manipuladores de eventos no C#, C++ e Visual Basic, j que essas linguagens fornecem sintaxe para adicionar e remover manipuladores de eventos. Delegados Estticos Fechados e Instncias de Abertura de Delegados Delegados podem representar static (Shared no Visual Basic) ou mtodos de instncia. Normalmente quando um delegado representa um mtodo de instncia, a instncia acoplada ao delegado juntamente com o mtodo. Por exemplo, um delegado manipulador de eventos pode ter trs mtodos de instncia em sua lista de invocao, cada um com uma referncia ao objeto ao qual o mtodo pertence. Na verso 2.0 do .NET Framework, tambm possvel criar e abrir um delegado para um mtodo de instncia. Um mtodo de instncia tem um parmetro da instncia implcito (representado por this no C# ou Me no Visual Basic), e ele tambm pode ser representado por um tipo delegado que expe este parmetro oculto. Ou seja, o tipo delegado deve ter um parmetro extra no incio da sua lista formal de parmetros, do mesmo tipo da classe a qual o mtodo pertence. oferecido suporte para o inverso desse cenrio, para que seja possvel vincular o primeiro argumento de um mtodo esttico.

Visual C# Consolidado

429

Observao

A criao de instncia aberta e delegados estticos fechados no possui suporte diretamente pelo Visual Basic, C++ ou C#, para construtores de delegados. Em vez disso, use um dos mtodos de sobrecarga System.Delegate.CreateDelegate que especifica objetos MethodInfo, como System.Delegate.CreateDelegate(System.Type,System.Object,System.Reflection.MethodInfo,System.Boole Regras relaxadas para vinculao de delegados Na verso 2.0 do .NET Framework, os tipos de parmetro e retorno de um delegado devem ser compatveis com os tipos de parmetro e retorno do mtodo que o delegado representa; os tipos no precisam coincidir exatamente. Observao Nas verses 1.0 e 1.1 do .NET Framework, os tipos devem coincidir exatamente. Um parmetro de um delegado compatvel com o parmetro correspondente de um mtodo se o tipo do parmetro do delegado for mais restritivo do que o tipo de parmetro do mtodo, porque isso garante que um argumento passado para o delegado possa ser passado com segurana para o mtodo. Da mesma forma, o tipo de retorno de um delegado compatvel com o tipo de retorno de um mtodo se o tipo de retorno do mtodo for mais restritivo do que o tipo de retorno do delegado, porque isso garante que o valor de retorno do mtodo possa ser difundido com segurana para o tipo retorno do delegado. Por exemplo, um delegado com um parmetro do tipo Hashtable e um tipo de retorno de Object pode representar um mtodo com um parmetro de tipo Object e um valor de retorno do tipo Hashtable. Para obter mais informaes e cdigos de exemplo, consulte System.Delegate.CreateDelegate(System.Type,System.Object,System.Reflection.MethodInfo). Representantes e chamadas assncrona a mtodo Cada delegado tem um mtodo BeginInvoke que permite a voc chamar o delegado assincronamente, e um mtodo EndInvoke que limpa, posteriormente, os recursos. Esses mtodos so gerados automaticamente para cada tipo delegado. Quando um delegado chamado usando o mtodo BeginInvoke, o mtodo que o delegado representa executado em um segmento pertencente ao do ThreadPool. Para obter mais informaes e cdigos de exemplo, consulte Programao assncrona usando delegados.

Matrizes em Common Type System


Um tipo matriz definido especificando o tipo da matriz, a ordem (nmero de dimenses) da matriz e os limites superiores e inferiores de cada dimenso da matriz. Todos esses esto includos em qualquer assinatura de um tipo matriz, embora eles possam ser marcados como fornecidos dinamicamente (ao invs de estticos). Tipos exatos de matriz so criados automaticamente pelo Runtime conforme eles so necessrios, e nenhuma definio separada do

Visual C# Consolidado

430

tipo matriz necessria. Matrizes de um determinado tipo s podem ter elementos desse tipo. Para obter mais informaes sobre o tipo de um valor, consulte Valores e Objetos. Valores de um tipo matriz so objetos. Objetos de matrizes so definidos como uma srie de locais onde valores do tipo elemento de matriz so armazenados. O nmero de valores repetidos determinado pelo posto e limites da matriz. Tipos matriz so herdados do tipo System.Array. Esta classe representa todas as matrizes independentemente do tipo de seus elementos ou sua posio. As operaes definidas em matrizes so: alocao de matriz baseada no tamanho e na informao de limite inferior; indexao de uma matriz para ler e escrever um valor; computao do endereo de um elemento da matriz (ponteiro gerenciado) e consulta da ordem, limites e nmero total de valores armazenados na matriz. Matrizes com uma dimenso de limite inferior para seus elementos (s vezes chamado vetores) igual a zero possui um tipo com base no tipo dos elementos da matriz, independentemente do limite superior. Matrizes com mais de uma dimenso, ou com uma dimenso porm com limite inferior diferente de zero, possuem o mesmo tipo se eles possuem o mesmo tipo de elemento e ordem, independentemente do limite inferior da matriz. No h suporte para matrizes com dimenses zero.

Interfaces no Common Type System


Interfaces podem ter membros estticos, tipos aninhados, membros virtuais, propriedades e eventos. Qualquer classe que implementar uma interface deve fornecer definies para os membros abstratos declarados na interface. Uma interface pode exigir que qualquer classe de implementao tambm deve implementar uma ou mais interfaces. As restries a seguir se aplicam a interfaces:

Uma interface pode ser declarada com qualquer acessibilidade, mas todos membros de interface devem ter acessibilidade pblica. Nenhuma permisso de segurana pode ser anexada a membros ou prpria interface. Interfaces no podem definir construtores.

Cada linguagem deve fornecer regras para mapear uma implementao para a interface que requer o membro, de maneira que mais de uma interface possa declarar um membro com a mesma assinatura e esses membros possam ter implementaes separadas.

Ponteiros no Common Type System (CTS)


Ponteiros so tipos especiais de variveis. H trs tipos de ponteiros para os quais o ambiente de tempo de execuo oferece suporte: ponteiros gerenciados, ponteiros no gerenciados e ponteiros de funes no gerenciados. Um ponteiro gerenciado, tambm conhecido como um identificador para um objeto no heap gerenciado, um novo tipo de ponteiro disponvel para aplicativos gerenciados. Ponteiros gerenciados so referncias a um bloco gerenciado de memria no heap do Common Language Runtime. Coleta de lixo automtica executada neste heap. Ponteiros gerenciados so gerados para argumentos de mtodos que so passados por referncia. Algumas linguagens fornecem outras maneiras de gerar ponteiros gerenciados. Apenas os ponteiros gerenciados so compatveis com CLS.

Visual C# Consolidado

431

Observao No Visual C++ 2002 e no Visual C++ 2003, __gc * foi usado para declarar um ponteiro gerenciado. Este ser substitudo por um ^ no Visual C++ 2005, por exemplo ArrayList^ al = gcnew ArrayList();. Um ponteiro no gerenciado o tradicional ponteiro C++ para um bloco de memria no gerenciado do heap C++ padro. Como ponteiros no gerenciados no fazem parte do CLS (Common Language Specification), sua linguagem pode no fornecer sintaxe para definir ou acessar estes tipos. Consulte a documentao da sua linguagem para informaes sobre suporte a ponteiros no gerenciados. Um ponteiro de funo no gerenciado tambm um ponteiro C++ tradicional referente ao endereo de uma funo. O CLS fornece os delegados como uma alternativa gerenciada para ponteiros de funes no gerenciados. Uma definio explcita de um tipo ponteiro no necessria. Todas as informaes necessrias para determinar o tipo de um ponteiro esto presentes quando o ponteiro declarado. Enquanto tipos ponteiro so tipos de referncia, o valor de um tipo ponteiro no um objeto e voc no pode determinar o tipo exato de tal valor. O CTS fornece duas operaes com segurana de tipos em tipos ponteiro: carregar um valor e gravar um valor para o local referenciado pelo ponteiro. Estas operaes com segurana de tipos so compatveis com CLS. O CTS (Common Type System) tambm fornece trs operaes aritmticas de endereos baseadas em bytes para tipos ponteiro: adio e subtrao de inteiros a ponteiros, e subtrair um ponteiro de outro. Os resultados das duas primeiras operaes aritmticas retornam um valor do mesmo tipo que o ponteiro original. Estas operaes baseadas em bytes no so compatveis com CLS.

Visual C# Consolidado

432

Os metadados e os componentes autodescritivos


No passado, um componente de software (.exe ou .dll) escrito em uma linguagem no podia facilmente usar um componente de software escrito em outra linguagem. COM foi um passo para a soluo desse problema. O .NET Framework facilita a interoperao entre componentes permitindo que compiladores emitam informaes declarativas adicionais em todos os mdulos e assemblies. Essa informao, chamada de metadados, ajuda os componentes a interagir perfeitamente.

Viso Geral Sobre Metadados


Metadados so informaes binrias que descrevem o seu programa, o qual fornecido em um arquivo PE do Common Language Runtime ou na memria. Quando voc compila seu cdigo em um arquivo PE, os metadados so inseridos em uma parte do arquivo, enquanto o cdigo convertido para a Microsoft Intermediate Language (MSIL) e inserido em outra parte do arquivo. Cada tipo e membro definido e referenciado em um mdulo ou assembly descrito em metadados. Quando o cdigo executado, o Runtime carrega os metadados na memria e os referencia para descobrir informaes sobre suas classes de cdigo, membros, herana e assim por diante. Os metadados descrevem cada tipo e membro definido no seu cdigo de uma maneira neutra de linguagem. Os metadados armazenam as seguintes informaes:
o o o o o o o

Descrio do Assembly. Identidade (nome, verso, cultura, chave pblica). Os tipos que so exportados. Outros conjuntos de que este assembly depende. Permisses de segurana necessrias para executar. Descrio dos tipos. Nome, visibilidade, classe base e interfaces implementadas. Membros (mtodos, campos, propriedades, eventos, tipos aninhados). Atributos. Elementos descritivos adicionais que modificam tipos e membros.

Benefcios de Metadados Os metadados so a chave para um modelo de programao simples, eliminando a necessidade de arquivos de Interface Definition Language (IDL), arquivos de cabealho ou qualquer mtodo externo de referncia a componente. Os metadados permitem que linguagens .NET se descrevam automaticamente de uma maneira neutra com relao a linguagem, sem que o desenvolvedor e o usurio vejam. Alm disso, metadados so extensveis pelo uso de atributos. Os metadados oferecem os seguintes benefcios principais:

Arquivos autodescritivos. Mdulos Common Language Runtime e assemblies so autodescritivos. Os metadados de um mdulo contm tudo o que ele precisa para interagir com outro mdulo. Os metadados fornecem automaticamente a funcionalidade de IDL no COM, permitindo que voc use um arquivo para definio e implementao. Mdulos Runtime e assemblies no exigem registro com o sistema operacional. Como resultado, as descries usadas pelo Runtime sempre refletem o cdigo real no arquivo compilado, o que aumenta a confiabilidade do aplicativo.

Interoperabilidade de linguagem e facilidade de design baseado em componentes.

Visual C# Consolidado

433

Os metadados fornecem todas as informaes necessrias sobre cdigo compilado, para voc herdar uma classe de um arquivo de escrita PE em uma linguagem diferente. Voc pode criar uma instncia de qualquer classe escrita em qualquer linguagem gerenciada (qualquer linguagem que atinge o Common Language Runtime), sem se preocupar com o empacotamento explcito ou com o uso de cdigo de interoperabilidade personalizados.

Atributos. O .NET Framework permite que voc declare tipos especficos de metadados, chamados atributos, no seu arquivo compilado. Os atributos podem ser encontradas em toda a .NET Framework, e so usados para controlar mais detalhadamente como o seu programa se comporta em tempo de execuo. Alm disso, voc pode emitir seus prprios metadados personalizados em arquivos do .NET Framework, atravs de atributos definidos pelo usurio. Para mais informaes, consulte Estendendo Metadados Usando Atributos.

Estrutura e uso de metadados


Embora a maioria dos desenvolvedores no necessitem saber os detalhes da implementao de metadados, alguns podem querer uma compreenso mais profunda. Esta seo fornece uma viso geral sobre como metadados so armazenados em um arquivo executvel porttil (pe) do .NET Framework e uma explicao sobre a funo dos metadados em execuo gerenciadas. Voc no precisa para ler esta seo para entender a programao .NET ou como usar atributos.

Metadados e Estrutura do Arquivos PE


Os metadados so armazenadas em uma seo de um arquivo executvel portvel (PE) do .NET Framework, enquanto que a Microsoft Intermediate Language (MSIL) armazenada em outra seo do arquivo PE. A parte de metadados do arquivo contm uma srie de tabelas e estruturas de dados heap. A parte MSIL contm smbolos MSIL e de metadados que fazem referncia a parte de metadados do arquivo PE. Voc pode encontrar smbolos de metadados ao usar ferramentas como o Desassemblador do MSIL (Ildasm.exe) para exibir o MSIL do seu cdigo ou o Depurador do Ambiente de Execuo (Cordbg.exe) para executar um despejo de memria. Tabelas e Heaps de Metadados Cada tabela de metadados contm informaes sobre os elementos do seu programa. Por exemplo, uma tabela de metadados descreve as classes em seu cdigo, outra descreve os campos, e assim por diante. Se existirem dez classes em seu cdigo, a tabela de classes ter dez linhas, uma para cada classe. Tabelas de metadados referenciam outras tabelas e heaps. Por exemplo, a tabela de metadados de classes faz referncia a tabela de mtodos. Metadados tambm armazenam informaes em quatro estruturas de heap: string, BLOB, string de usurio e GUID. Todas as strings usadas para nomear tipos e membros so armazenadas no heap de strings. Por exemplo, uma tabela de mtodos no armazena diretamente o nome de um mtodo especfico, mas aponta para nome do mtodo armazenado no heap de strings. Smbolos de Metadados Cada linha de cada tabela de metadados unicamente identificada na parte MSIL do arquivo PE por um smbolo de metadados. Smbolos de metadados so conceitualmente semelhantes a ponteiros, persistentes na MSIL, e referenciam uma tabela de metadados especfica. Um smbolo de metadados um nmero de quatro bytes. O byte superior denota a tabela de metadados, a qual se refere um token especfico (mtodo, tipo, e assim por diante). Os trs bytes restantes especificam a linha na tabela de metadados que corresponde ao elemento de

Visual C# Consolidado

434

programao sendo descrito. Se voc definir um mtodo em C# e compil-lo em um arquivo PE, o seguinte smbolo de metadados pode ser gerado na parte MSIL do arquivo PE:
0x06000004

O byte superior (0x06) indica que esse um token MethodDef. Os trs bytes inferiores (000004) informam ao Common Language Runtime para procurar na quarta linha da tabela MethodDef pelas informaes que descrevem essa definio de mtodo. Metadados em um arquivo PE Quando um programa compilado para o Common Language Runtime, ele convertido em um arquivo PE que consiste de trs partes. A tabela a seguir descreve o contedo de cada parte. Seo do arquivo PE Cabealho

Contedo da seo O ndice das sees principais do arquivo PE e o endereo do ponto de entrada. O ambiente de execuo usa essas informaes para identificar o arquivo como um arquivo PE e para determinar onde se iniciada a execuo ao carregar o programa na memria. As instrues da Microsoft Intermediate Language (MSIL) que compem o seu cdigo. Muitas instrues da MSIL so acompanhadas de smbolos de metadados. Tabelas e heaps de metadados. O ambiente de execuo usa essa seo para registrar as informaes sobre cada tipo e cada membro em seu cdigo. Essa seo tambm inclui atributos personalizados e informaes de segurana.

Instrues da MSIL Metadados

Uso de metadados em tempo de execuo


Para compreender melhor os metadados e sua funo no Common Language Runtime, pode ser til criar um programa simples e ilustrar como os metadados afetam sua prpria vida em tempo de execuo. O exemplo de cdigo a seguir mostra dois mtodos dentro uma classe chamada MyApp. O mtodo Main o ponto de entrada do programa, enquanto o mtodo Add simplesmente retorna a soma dos dois argumentos inteiros. C#
using System; public class MyApp { public static int Main() { int ValueOne = 10; int ValueTwo = 20; Console.WriteLine("The Value is: {0}", Add(ValueOne, ValueTwo)); return 0; } public static int Add(int One, int Two) { return (One + Two); } }

Quando o cdigo executado, o ambiente de execuo carrega o mdulo na memria e consulta os metadados para esta classe. Aps carregado, o ambiente de execuo executa uma ampla anlise do fluxo Microsoft Intermediate Language (MSIL) do mtodo para convert-lo em instrues de mquina nativas rpidas. ambiente de tempo de execuo usa um compilador JustIn-Time (JIT) para converter as instrues MSIL para cdigo de mquina nativo para um mtodo ao mesmo tempo conforme o necessrio. O exemplo a seguir mostra parte do MSIL produzido a partir da funo Main do cdigo anterior. Voc pode visualizar o MSIL e os metadados de qualquer aplicativo .NET Framework usando o Desassemblador do MSIL (ILDASM.exe).

Visual C# Consolidado

435

.entrypoint .maxstack 3 .locals ([0] int32 ValueOne, [1] int32 ValueTwo, [2] int32 V_2, [3] int32 V_3) IL_0000: ldc.i4.s 10 IL_0002: stloc.0 IL_0003: ldc.i4.s 20 IL_0005: stloc.1 IL_0006: ldstr "The Value is: {0}" IL_000b: ldloc.0 IL_000c: ldloc.1 IL_000d: call int32 ConsoleApplication.MyApp::Add(int32,int32) /* 06000003 */

O compilador JIT l o MSIL para o mtodo inteiro, analisa-o completamente, e gera instrues nativas eficientes para o mtodo. Em IL_000d, um token de metadados para o mtodo Add (/* 06000003 */) encontrado e o ambiente de tempo de execuo usa o token para consultar a terceira linha da tabela MethodDef. A tabela a seguir mostra parte da tabela MethodDef referenciada pelo token de metadados que descreve o mtodo Add. Enquanto outras tabelas de metadados existirem neste assembly e tiverem seus prprios valores exclusivos, somente esta tabela examinada. Endereo virtual relativo Linha (RVA) 1 0x00002050 Nome (Aponta para Assinatura o heap de seqncia (Aponta para o de caracteres.) heap de blob.)

ImplFlags Sinalizadores IL Managed

Public .ctor (construtor) ReuseSlot SpecialName RTSpecialName .ctor Public Static ReuseSlot Public Static ReuseSlot Main String

0x00002058

IL Managed IL Managed

0x0000208c

Add

int, int, int

Cada coluna da tabela contm informaes importantes sobre seu cdigo. A coluna RVA permite que o ambiente de tempo de execuo calcule o endereo de memria inicial do MSIL que define este mtodo. As colunas ImplFlags e Sinalizadores contm mscaras de bits que descrevem o mtodo (por exemplo, se o mtodo pblico ou privado). A coluna Nome indexa o nome do mtodo a partir do heap de seqncia de caracteres. A coluna Assinatura indexa a definio da assinatura do mtodo no heap de blob. O ambiente de tempo de execuo calcula o endereo de deslocamento desejado a partir da coluna RVA na terceira linha e retorna este endereo para o compilador JIT, que depois passa para o novo endereo. O compilador JIT continua a processar o MSIL no novo endereo at encontrar outro token de metadados, e o processo repetido. Usando metadados, o ambiente de tempo de execuo tem acesso a todas as informaes necessrias para carregar seu cdigo e process-lo em instrues de mquina nativas. Desta maneira, os metadados permitem arquivos autodescritivos e, juntamente com o CTS, herana entre linguagens.

Assemblies no Common Language Runtime


Assemblies so os blocos de construo de aplicativos .NET Framework; eles formam a unidade fundamental de implantao, controle de verso, reutilizao, ativao de escopo e permisses de segurana. Um assembly uma coleo de tipos e recursos, que so construdos para trabalhar juntos e formam uma unidade lgica de funcionalidade. Um assembly fornece o Common

Visual C# Consolidado

436

Language Runtime com as informaes necessrias para estar ciente das implementaes de tipo. Para o Runtime, um tipo no existe fora o contexto de um assembly.

Viso Geral Sobre Assemblies


Assemblies so uma parte fundamental da programao com o .NET Framework. Um assembly executa as seguintes funes:

Ele contm cdigo que o Common Language Runtime executa. O cdigo Microsoft Intermediate Language (MSIL), em um arquivo executvel portvel (PE), no ser executado se ele no possuir um manifesto do assembly associado. Observe que cada assembly pode ter somente um ponto de entrada (isto , DllMain, WinMain ou Main). Ele forma um limite de segurana. Um assembly a unidade em que permisses so solicitadas e concedidas. Para obter mais informaes sobre limites de segurana e como eles se aplicam a assemblies, consulte Consideraes Sobre Segurana do Assembly. Ele forma um limite de tipo. A identidade de cada tipo inclui o nome do assembly no qual ele reside. Um tipo chamado MyType, carregado no escopo de um assembly, no o mesmo que um tipo chamado MyType, carregado no escopo de outro assembly. Ele forma um limite de referncia de escopo. O manifesto do assembly contm metadados do assembly que so usados para resolver tipos e satisfazer solicitaes de recursos. Ele especifica os tipos e recursos que so expostos fora do assembly. O manifesto tambm enumera outros assemblies do qual ele depende. Ele forma um limite de verso. O assembly a menor unidade com controle de verso no Common Language Runtime; todos os tipos e recursos no mesmo assembly esto versionados como uma unidade. O manifesto do assembly descreve as dependncias de verso que voc especifica para qualquer assembly dependente. Para obter mais informaes sobre o controle de verso, consulte Controle de Verso do Assembly. Ele forma uma unidade de implantao. Quando um aplicativo iniciado, somente os mdulos assembly que o aplicativo chama inicialmente devem estar presente. Outros assemblies, como recursos de localizao ou assemblies contendo classes utilitrias, podem ser recuperados por demanda. Isso permite que aplicativos sejam mantidos simples e pequenos no primeiro download. Para obter mais informaes sobre como implantar assemblies, consulte Implantao de Aplicativos. Essa a unidade na qual a execuo lado a lado suportada. Para obter mais informaes sobre como executar vrias verses de um assembly, consulte Assemblies e Execuo Lado a Lado.

Assemblies podem ser estticos ou dinmicos. Assemblies estticos podem incluir tipos .NET Framework (interfaces e classes), bem como recursos para o assembly (bitmaps, arquivos JPEG, arquivos de recursos, e assim por diante). Assemblies estticos so armazenados em disco em arquivos PE. Voc tambm pode usar o .NET Framework para criar assemblies dinmicos, que so executados diretamente da memria e no so salvos em disco antes da execuo. Voc pode salvar assemblies dinmicos no disco aps sua execuo. H vrias maneiras de criar assemblies. Voc pode usar ferramentas de desenvolvimento, como Visual Studio 2005, que voc usou anteriormente para criar arquivos .dll ou .exe. Voc pode usar ferramentas fornecidas pelo SDK do .NET Framework para criar assemblies, com mdulos criados em outros ambientes de desenvolvimento. Voc tambm pode usar APIs do Common Language Runtime, como Reflection.Emit, para criar assemblies dinmicos.

Visual C# Consolidado

437

Benefcios do Assembly
Assemblys so projetados para simplificar a implantao de aplicativos e para solucionar problemas de versionamento que podem ocorrer em aplicativos baseados em componentes. Usurios finais e desenvolvedores esto familiarizados com problemas de versionamento e implantao. Problemas esses que surgem nos atuais sistemas baseados em componentes. Alguns usurios finais tm sofrido a frustrao de instalar um novo aplicativo em seus computadores apenas para descobrir que outro aplicativo existente simplesmente parou de funcionar. Muitos desenvolvedores j gastaram inmeras horas tentando manter consistentes todas as entradas do registro necessrias para ativar uma classe COM. Muitos problemas de implantao tm sido resolvidos atravs uso de assemblys no .NET Framework. Por eles seres componentes autodescritivos e por no dependerem de entradas do registro, assemblys permitem que a instalao de aplicativos no tenha impacto algum. Eles tambm simplificam a desinstalao e duplicao de aplicativos. Problemas de Versionamento Atualmente, dois problemas de versionamento ocorrem em aplicativos Win32:

Regras de versionamento no podem ser expressas entre partes de um aplicativo e impostas pelo sistema operacional. A abordagem atual depende da compatibilidade com verses anteriores, o que geralmente difcil de garantir. Uma vez publicadas, as definies de interface devem ser estticas. Uma nica parte do cdigo deve manter a compatibilidade com as verses anteriores. Alm disso, o cdigo deve ser desenvolvido de forma que somente uma nica verso do mesmo possa estar presente e executando em um computador em qualquer instante de tempo. No h como manter a consistncia entre conjuntos de componentes que so criados juntos e o conjunto que est presente em tempo de execuo.

Esses dois problemas de versionamento combinados criam conflitos de DLL, onde a instalao de um aplicativo pode, inadvertidamente, quebrar um outro existente. Isso ocorre porque foi instalado um determinado componente de software, ou DLL, que no era totalmente compatvel com as verses anteriores. Aps decorrida essa situao, o sistema no possui suporte para diagnosticar e corrigir o problema. Acabando com os conflitos de DLL O Microsoft Windows 2000 comeou a atacar por completo esses problemas. Ele fornece dois recursos que corrigem parcialmente conflitos de DLL:

O Windows 2000 permite criar aplicativos cliente cujos arquivos .dll localizam-se na mesma pasta do executvel do aplicativo. O Windows 2000 pode ser configurado para verificar um componente no diretrio onde o executvel est localizado antes de verificar o caminho totalmente qualificado ou procurar o caminho normal. Isso permite que componentes sejam independentes de componentes instalados e usados por outros aplicativos. O Windows 2000 bloqueia arquivos que vm com o sistema operacional no diretrio System32, para que eles no possam ser substitudos quando novos aplicativos so instalados.

O Common Language Runtime usa assemblys para continuar essa evoluo em direo de uma soluo completa para conflitos de DLL. A Soluo do Assembly

Visual C# Consolidado

438

Para resolver problemas de versionamento, assim como problemas restantes que levam a conflitos de DLL, o ambiente de execuo usa assemblys a fim de:

Permitir que os desenvolvedores especifiquem regras de verso entre diferentes componentes de software. Fornecer a infra-estrutura para impor regras de verso. Fornecer a infra-estrutura para permitir que vrias verses de um componente sejam executadas simultaneamente (o que chamamos de execuo lado a lado).

Consulte tambm

Sumrio de assembly
Em geral, um assembly esttico pode consistir de quatro elementos:

O manifesto do assembly, que contm metadados do assembly. Metadados de tipo. Cdigo Microsoft Intermediate Language (MSIL) que implementa os tipos. Um conjunto de recursos.

Somente o manifesto do assembly obrigatrio, mas tipos e recursos so ambos necessrios para fornecer ao assembly qualquer funcionalidade significativa. H vrias maneiras de se agrupar esses elementos em um assembly. Voc pode agrupar todos os elementos em um nico arquivo fsico, que mostrado na ilustrao a seguir. Assembly de arquivo nico

Como alternativa, os elementos de um assembly podem estar contidos em vrios arquivos. Esses arquivos podem ser mdulos de cdigo compilado (.netmodule), recursos (como arquivos .bmp ou .jpg), ou outros arquivos necessrios para o aplicativo. Crie um assembly multi-arquivos quando desejar combinar mdulos escritos em diferentes linguagens e otimizar o download de um aplicativo colocando tipos raramente usados em um mdulo que baixado apenas quando necessrio. Na ilustrao a seguir, o desenvolvedor de um aplicativo hipottico escolheu separar alguns cdigos utilitrios em um mdulo diferente e manter um arquivo grande de recurso (neste caso uma imagem .bmp) em seu arquivo original. O .NET Framework baixa um arquivo somente quando ele referenciado; manter cdigos raramente referenciados em um arquivo separado do aplicativo otimiza o download de cdigo. Assembly multi-arquivos

Visual C# Consolidado

439

Observao Os arquivos que compem um assembly multi-arquivos no so fisicamente vinculados pelo sistema de arquivos. Em vez disso, eles so vinculados atravs do manifesto do assembly e o Common Language Runtime gerencia-os como uma unidade. Nesta ilustrao, todos os trs arquivos pertencem a um assembly, conforme descrito no manifesto do assembly contido em MyAssembly.dll. Para o sistema de arquivos, eles so trs arquivos separados. Observe que o arquivo Util.netmodule foi compilado como um mdulo porque ele no contm nenhuma informao de assembly. Quando o assembly foi criado, o manifesto do assembly foi adicionado ao MyAssembly.dll, indicando seu relacionamento com Util.netmodule e Graphic.bmp. Assim como voc cria hoje seu cdigo-fonte, voc toma decises sobre como particionar a funcionalidade do seu aplicativo em um ou mais arquivos. Ao criar cdigo do .NET Framework, voc tomar decises semelhantes sobre como particionar a funcionalidade em um ou mais assemblies.

Manifesto do Assembly
Cada assembly, seja esttico ou dinmico, contm uma coleo de dados que descrevem como os elementos do assembly se relacionam entre si. O manifesto do assembly contm esses metadados do assembly. O manifesto de um assembly contm todos os metadados necessrios para especificar os requisitos de verso e o identificador de segurana, assim como todos os metadados necessrios para definir o escopo do assembly e analisar referncias a recursos e classes. O manifesto do assembly pode ser armazenado em um arquivo PE (.exe ou .dll) com cdigo da Microsoft Intermediate Language (MSIL) ou em um arquivo PE autnomo que contm somente informaes do manifesto do assembly. A ilustrao a seguir mostra as diferentes maneiras nas quais o manifesto pode se armazenado. Tipos de assemblys

Visual C# Consolidado

440

Para um assembly com um arquivo associado, o manifesto incorporado no arquivo PE para formar um assembly de arquivo nico. Voc pode criar um assembly de vrios arquivos com um arquivo de manifesto autnomo ou com o manifesto incorporado a um dos arquivos PE do assembly. Cada manifesto de um assembly executa as seguintes funes:

Enumerar os arquivos que compem o assembly. Orientar como as referncias a tipos e recursos do assembly so mapeadas em arquivos que contm suas declaraes e implementaes. Enumerar outros assemblys dos quais depende o assembly. Fornecer um nvel de indireo entre os consumidores do assembly e detalhes da implementao do assembly. Processar o assembly autodescritivo.

Contedo do Manifesto do Assembly A tabela a seguir mostra as informaes contidas no manifesto do assembly. Os primeiros quatro itens informaes sobre o nome, o nmero de verso, a cultura e o nome forte do assembly compem a identidade do assembly. Informaes Descrio

Nome do assembly Uma seqncia de texto especificando o nome do assembly. Nmero de verso Um nmero de verso principal e secundrio e um nmero de reviso e de compilao. O Common Language Runtime usa esses nmeros para impor uma poltica de verses. Informaes sobre a cultura ou a linguagem suportada pelo assembly. Essas informaes devem ser usadas somente para designar um assembly como um assembly satlite contendo informaes especficas de cultura ou de linguagem. (Um assembly com informaes de cultura automaticamente considerado um assembly satlite.) A chave pblica do publisher, caso tenha sido dado ao assembly um nome forte. Um hash de cada arquivo contido no assembly e um nome de arquivo. Observe que todos os arquivos que compem o assembly devem estar no mesmo diretrio que o arquivo que contm o manifesto do assembly. Informaes usadas pelo ambiente de execuo para mapear a referncia

Cultura

Informaes de nomes fortes Lista de todos os arquivos no assembly Informaes de

Visual C# Consolidado

441

referncia de tipo Informaes sobre assemblys referenciados

de um tipo ao arquivo que contm sua declarao e implementao. Usado para tipos que so exportados do assembly. Uma lista de outros assemblys que so referenciados estaticamente pelo assembly. Cada referncia inclui o nome do assembly dependente, metadados do assembly (verso, cultura, sistema operacional, e assim por diante) e chave pblica, caso o assembly possua um nome forte.

Voc pode adicionar ou alterar informaes do manifesto do assembly usando os atributos do assembly em seu cdigo. Voc pode alterar informaes sobre verso e atributos informativos, incluindo Trademark (marca comercial), Copyright (direitos autorais), Product (produto), Company (empresa) e Informational Version (verso informativa). Para obter uma lista completa dos atributos de um assembly, consulte Definindo os Atributos de um Assembly.

Cache Global de Assemblies


Cada computador onde o Common Language Runtime est instalado tem um cache de cdigo da mquina chamado de Cache Global de Assemblies. O Cache Global de Assemblies armazena assemblies especificamente designados para serem compartilhados por vrios aplicativos no computador. Voc deve compartilhar assemblies instalando-os no cache global de assemblies somente quando voc precisa faz-lo. Como diretriz geral, mantenha as dependncias de um assembly privadas, e localize assemblies no diretrio de aplicativo a no ser que o compartilhamento de um Assembly seja explicitamente necessrio. Alm disso, no necessrio instalar assemblies no cache global de assemblies para torn-los acessveis para interoperabilidade COM ou cdigo no gerenciado. Observao H situaes em que voc explicitamente no deseja instalar um Assembly no cache global de assemblies. Se voc colocar um dos assemblies que compem um aplicativo no cache global de assemblies, voc no pode mais duplicar ou instalar o aplicativo usando o comando xcopy para copiar o diretrio do aplicativo. Voc tambm deve mover o assembly no cache global de assemblies. H vrias maneiras para implantar um Assembly no cache global de assemblies:

Use um instalador desenvolvido para funcionar com o cache global de assemblies. Essa a opo preferencial para instalar assemblies para o cache global de assemblies. Use uma ferramenta de desenvolvimento chamada de ferramenta Global Assembly Cache (Gacutil.exe), fornecida pelo o .NET Framework SDK Use o Windows Explorer para arrastar mdulos assemblies para o cache. Observao Nos cenrios de implantao, use o Windows Installer 2.0 (site em ingls) para instalar assemblies para o cache global de assemblies. Use o Windows Explorer ou a ferramenta Global Assembly Cache apenas em cenrios de desenvolvimento, porque eles no fornecem contagem de referncia do assembly e outros recursos fornecidos ao usar o Windows Installer.

Visual C# Consolidado

442

Os administradores geralmente protegem o diretrio systemroot usando uma lista de controle de acesso (ACL) para controlar escrita e acesso de execuo. Pelo fato de o cache global de assemblies estar instalado em um subdiretrio do diretrio systemroot, ele herda o ACL dessa pasta. recomendvel que apenas os usurios com privilgios de administrador tenham permisso para excluir arquivos do cache global de assemblies. Assemblies implantados no cache global de assemblies devem ter um nome forte. Quando um Assembly adicionado ao cache global de assemblies, so executadas verificaes de integridade em todos os arquivos que compem o Assembly. O cache executa essas verificaes de integridade para garantir que um Assembly no foi violada, por exemplo, quando um arquivo foi alterado mas o manifesto no refletir a alterao.

Assemblies de Nomes Fortes


Um nome forte consiste na identidade assembly seu nome de texto simples, nmero de verso, e informaes de cultura (se fornecido) mais uma chave pblica e uma assinatura digital. Ela ser gerada a partir de um arquivo Assembly (o arquivo que contm o manifesto do Assembly, que por sua vez contm os nomes e hashes de todos os arquivos que compem o assembly), usando a chave particular correspondente. O Microsoft Visual Studio .NET e outras ferramentas de desenvolvimento fornecidas no .NET Framework SDK podem atribuir nomes fortes para um Assembly. esperado que assemblies com o mesmo nome forte sejam idnticos. Voc pode garantir que um nome seja globalmente exclusivo assinando um assembly com um nome forte. Especificamente, nomes fortes satisfazem os requisitos a seguir:

Nomes Fortes garantem a exclusividade do nome por confiar em pares de chaves exclusivas. Ningum pode gerar o mesmo nome de assembly que voc pode, porque um Assembly gerado com uma chave particular tem um nome diferente que um Assembly gerado com outra chave particular. Nomes Fortes protegem a linhagem da verso de um Assembly. Um nome forte pode garantir que ningum pode produzir uma verso posterior do seu Assembly. Os usurios podem ter certeza que a verso do assembly que eles esto carregando vem do mesmo Publisher que criou a verso na qual o aplicativo foi compilado. Nomes Fortes fornecem uma verificao de integridade forte. Passando as verificaes de segurana do .NET Framework garante-se que o contedo do assembly no foi alterado desde que ele foi criado. Observe, entretanto, que nomes fortes dentro e por eles mesmos no implicam um nvel de confiana como fornecido, por exemplo, por uma assinatura digital e suportando certificado.

Quando voc referencia um assembly de nome forte, voc espera obter certos benefcios, como verso e proteo de nomeao. Se o Assembly de nome forte ento referencia um Assembly com um nome simples, que no tem esses benefcios, voc perde as vantagens que iria derivar pelo uso de um Assembly de nome forte e reverte para conflitos de DLL. Por essa razo, assemblies de nomes fortes podem apenas referenciar outros assemblies de nomes fortes.

Consideraes sobre segurana de assemblies

Quando voc cria um assembly, voc pode especificar um conjunto de permisses que o assembly requer para executar. Se determinadas permisses so concedidas ou no a um assembly isso baseado nas evidncias.

H duas formas distintas de evidncias que so usadas:

Visual C# Consolidado

443

A evidncia de entrada ser mesclada com a evidncia coletada pelo carregador para criar um conjunto final de evidncias usadas para resoluo de poltica. Os mtodos que usam essa semntica incluem Assembly.Load, Assembly.LoadFrom e Activator.CreateInstance. A evidncia de entrada usada inalterada como o conjunto final de evidncias usado para resoluo de poltica. Os mtodos que usam essa semntica incluem AppDomain.DefineDynamicAssembly() e Assembly.Load(byte[]).

Permisses opcionais podem ser concedidas pelo conjunto de polticas de segurana no computador onde o assembly ser executado. Se voc desejar que seu cdigo manipule todas as excees de segurana potenciais, voc pode seguir um desses procedimentos:

Inserir uma solicitao de permisso para todas as permisses que seu cdigo deve ter, e tratar a falha em tempo de carga que ocorre se as permisses no so concedidas. No usar uma solicitao de permisso para obter permisses que seu cdigo pode no precisar, mas estar preparado para manipular excees de segurana se as permisses no so concedidas. Observao Segurana uma rea complexa, e voc tem vrias opes para escolher. Para mais informaes, consulte Conceitos chave sobre segurana.

Em tempo de carga, as evidncias do assembly so usadas como entrada para polticas de segurana. A poltica de segurana estabelecida pela empresa e pelo administrador do computador bem como por configuraes de polticas de usurio e determina o conjunto de permisses que concedido a todos os cdigos gerenciados quando executados. Polticas de segurana podem ser estabelecidas para o publisher do assembly (se ele tiver uma assinatura gerada por uma ferramenta de assinatura), para o site e zona (em termos do Internet Explorer) de que o assembly foi baixado, ou para o nome forte do assembly. Por exemplo, um administrador pode estabelecer polticas de segurana que permitem que todo cdigo baixado do site e assinado por uma determinada de empresa software acesse um banco de dados em um computador, mas no concede acesso para gravar no disco do computador. Assemblies de nome forte e ferramentas de assinatura Voc pode assinar um assembly de duas maneiras diferentes mas complementares: com um nome forte ou usando a Ferramenta de Assinatura de Arquivo (Signcode.exe) no .NET Framework verso 1.0 e 1.1 ou a Ferramenta de Assinatura (SignTool.exe) em verses posteriores do .NET Framework. Assinar um assembly com um nome forte adiciona uma criptografia de chave pblica ao arquivo que contm o manifesto do assembly. Assinatura de nome forte ajuda a verificar exclusividade de nome, a evitar falsificao de nome, e a fornecer chamadores com alguma identidade quando uma referncia resolvida. No entanto, nenhum nvel de confiana associado a um nome forte, o que torna a Ferramenta de Assinatura de Arquivo (Signcode.exe) e Ferramenta de Assinatura (SignTool.exe) importantes. As duas ferramentas de assinatura requerem um publisher para provar sua identidade para uma autoridade de terceiros e obter um certificado. Esse certificado ento incorporado no seu arquivo e pode ser usado por um administrador para decidir se confia na autenticidade do cdigo. Voc pode dar um nome forte e uma assinatura digital criada usando a Ferramenta de Assinatura de Arquivo (Signcode.exe) ou a Ferramenta de Assinatura (SignTool.exe) para um assembly, ou voc pode usar um sozinho. As duas ferramentas de assinatura podem assinar somente um arquivo por vez; para um assembly com vrios arquivos, voc assina o arquivo que contm o manifesto do assembly. Um nome forte armazenado no arquivo que contm o manifesto do

Visual C# Consolidado

444

assembly, mas uma assinatura criada usando a Ferramenta de Assinatura (SignTool.exe) ou a Ferramenta de Assinatura de Arquivo (Signcode.exe) armazenada em um slot reservado no arquivo executvel portvel (PE) que contm o manifesto do assembly. A assinatura de um assembly usando a Ferramenta de Assinatura de Arquivo (Signcode.exe) ou a Ferramenta de Assinatura (SignTool.exe) pode ser usada (com ou sem um nome forte) quando voc j tem uma hierarquia de confiana que confia nas assinaturas geradas pela Ferramenta de Assinatura de Arquivo (Signcode.exe) ou pela Ferramenta de Assinatura (SignTool.exe), ou quando sua poltica usa somente a parte chave e no verifica uma cadeia de confiana. Observao Ao usar um nome forte e uma assinatura gerada por uma ferramenta de assinatura em um assembly, o nome forte deve ser atribudo primeiro. O Common Language Runtime tambm executa uma verificao de hash; o manifesto do assembly contm uma lista de todos os arquivos que compem o assembly, incluindo um hash de cada arquivo como ele existia quando o manifesto foi criado. Como cada arquivo carregado, seu contedo comparado com o valor de hash armazenado no manifesto. Se os dois hashes no coincidirem, o assembly falha ao carregar. Devido ao nome forte e assinatura usarem a garantia de integridade da Ferramenta de Assinatura de Arquivo (Signcode.exe) ou da Ferramenta de Assinatura (SignTool.exe), voc pode basear a poltica de segurana para acesso a cdigo nessas duas formas de evidncias do assembly. Nome forte e assinatura usam garantia de integridade da Ferramenta de Assinatura (SignTool.exe) ou da Ferramenta de Assinatura de Arquivo (Signcode.exe) atravs de assinaturas digitais e certificados. Todas as tecnologias mencionadas Verificao de hash, nome forte, e assinatura usando a Ferramenta de Assinatura de Arquivo (Signcode.exe) ou a Ferramenta de Assinatura (SignTool.exe) trabalham juntas para assegurar que o assembly no tenha sido alterado de nenhuma maneira.

Versionamento de Assembly
Todos os versionamentos de assemblys que usam o Common Language Runtime so feitos no nvel do assembly. A verso de um assembly e as verses de assemblys dependentes so registradas no manifesto do assembly. O poltica de verses padro do ambiente de execuo diz que aplicativos devem executar somente com as verses com que foram criados e testados, a menos que essa poltica de verses seja anulada por uma outra poltica explcitada nos arquivos de configurao (o arquivo de configurao do aplicativo, o arquivo de poltica de editor e o arquivo de configurao do administrador do computador). Observao Versionamento feito somente em assemblys com nomes fortes. O ambiente de execuo executa as seguintes etapas para resolver uma solicitao de ligao de assembly: 1. 2. Verificar a referncia do assembly original para determinar qual verso do assembly deve ser ligada. Verificar os arquivos de configurao apropriados para aplicar um poltica de verses.

Visual C# Consolidado

445

3.

Determinar o assembly correto a partir da referncia do assembly original e de qualquer redirecionamento especificado nos arquivos de configurao. Determinar a verso que deve ser ligada ao assembly sendo chamado. Verifica a cache global de assemblys, bases de cdigo especificadas em arquivos de configurao, e, em seguida, verifica os diretrios e subdiretrios do aplicativo usando as regras de probing explicadas em Como o Ambiente de Execuo Localiza Assemblys.

4.

A ilustrao a seguir mostra essas etapas. Resolvendo uma solicitao de ligao de assembly

Para obter mais informaes sobre como configurar aplicativos, consulte Arquivos de Configurao. Para obter mais informaes sobre polticas de ligao, consulte Como o Ambiente de Execuco Localiza Assemblys. Informaes de Verso Cada assembly possui duas maneiras diferentes de expressar informaes de verso:

Atravs do nmero de verso do assembly. Juntamente com as informaes de nome e cultura do assembly, o nmero de verso parte da identidade do assembly. Esse nmero usado pelo ambiente de execuo para impor uma poltica de verses e representa um papel importante no processo de resoluo de tipo em tempo de execuo. Atravs de uma verso informativa, uma seqncia que representa informaes de verso adicionais includa apenas para fins informativos.

Nmero de Verso do Assembly Cada Assembly tem um nmero de verso como parte de sua identidade. Dessa forma, dois assemblys que diferem pelo nmero de verso so considerados pelo ambiente de execuo assemblys completamente diferentes. Fisicamente, esse nmero de verso representado atravs de uma seqncia dividida em quatro partes com o seguinte formato:

Visual C# Consolidado

446

< verso principal>.<verso secundria>.<nmero de compilao>.<reviso> Por exemplo, a verso 1.5.1254.0 indica que 1 a verso principal, 5 a verso secundria, 1254 o nmero de compilao e 0 o nmero de reviso. O nmero de verso armazenado no manifesto do assembly junto com outras informaes de a identidade, incluindo o nome e a chave pblica do assembly e informaes de relacionamentos e identidades de outros assemblys conectados ao aplicativo. Quando um assembly criado, a ferramenta de desenvolvimento registra as informaes de dependncia de cada assembly referenciado no manifesto do assembly. O ambiente de execuo usa esses nmeros verso, em conjunto com informaes de configurao definidas por um administrador, por um aplicativo, ou por um publisher, a fim de carregar a verso apropriada de um assembly referenciado. O ambiente de execuo distingue assemblys regulares de assemblys com nomes fortes para fins de versionamento. A verificao de verso s ocorre em assemblys com nomes fortes. Para obter informaes sobre como especificar uma poltica de ligao de verso, consulte Arquivos de Configurao. Para obter informaes sobre como o ambiente de execuo usa informaes de verso para localizar um Assembly especfico, consulte Como o Ambiente de Execuo Localiza Assemblys. Verso Informativa do Assembly A verso informativa uma seqncia que anexa informaes adicionais de verso a um assembly, apenas para fins informativos. Essas informaes no so usadas em tempo de execuo. A verso informativa baseada em texto corresponde a literatura de marketing do produto, a embalagem ou ao nome do produto e no usada pelo ambiente de execuo. Por exemplo, uma verso informativa poderia ser "Common Language Runtime verso 1.0" ou " NET Control SP 2 ". Na guia Version da caixa de dilogo File Properties do Microsoft Windows, essas informaes aparecem no item "Product Version". Observao Embora voc possa especificar qualquer texto, uma mensagem de aviso aparecer durante a compilao em dois casos: (i) se a seqncia no possuir o formato usado pelo nmero de verso do assembly ou (ii) se est no formato correto, mas contm wildcards. Esse aviso inofensivo. A verso informativa representada usando o atributo System.Reflection.AssemblyInformationalVersionAttribute. Para obter mais informaes sobre o atributo da verso informativa, consulte Definindo Atributos do Assembly.

Posicionamento do Assembly
Para a maioria dos aplicativos .NET Framework, voc localiza assemblies que compem um aplicativo no diretrio do aplicativo, em uma subpasta da pasta do aplicativo ou no cache global de assemblies (se o assembly for compartilhado). Voc pode substituir onde o Common Language Runtime procura por um assembly, usando o elemento <CODEBASE> em um arquivo de configurao. Se o assembly no tiver um nome forte, a localidade especificada usando o elemento <CODEBASE> restrita para o diretrio do aplicativo ou para a subpasta. Se o assembly tiver um nome forte, o elemento <CODEBASE> pode especificar qualquer localidade no computador ou em uma rede.

Visual C# Consolidado

447

Regras similares se aplicam localizao de assemblies ao trabalhar com cdigo no gerenciado ou aplicativos interop COM: se o assembly ser compartilhado por vrios aplicativos, ele dever ser instalado no cache global de assemblies. Assemblies usados com cdigos no gerenciados devem ser registrados e exportados como uma biblioteca de tipos. Assemblies usados pelo COM interop devem ser registrados no catlogo, embora em alguns casos, esse registro ocorra automaticamente.

Assemblies e execuo lado a lado


Execuo lado a lado a capacidade de armazenar e executar vrias verses de um aplicativo ou componente no mesmo computador. Isso significa que voc pode ter vrias verses do runtime, e vrias verses de aplicativos e componentes que usam uma verso do runtime, no mesmo computador ao mesmo tempo. A execuo lado a lado lhe d mais controle sobre quais verses de um componente um aplicativo est vinculado, e mais controle sobre que verso do Runtime um aplicativo usa. Suporte para armazenamento lado a lado e execuo de diferentes verses do mesmo assembly uma parte integral de nomeao forte e est embutido no infra-estrutura do Runtime. Pelo fato de o nmero da verso do assembly de nome forte fazer parte de sua identidade, o tempo de execuo pode armazenar vrias verses de o mesmo assembly no cache global de assemblies, e carregar esses mdulos em tempo de execuo. Embora o Runtime proporcione a capacidade para criar aplicativos lado a lado, a execuo lado a lado no automtica. Para obter mais informaes sobre a criao de aplicativos para execuo lado a lado, consulte Diretrizes para criar aplicativos e componentes para execuo lado a lado.

Viso Geral da Biblioteca de Classes do .NET Framework


O .NET Framework inclui classes, interfaces e tipos de valor que aceleram e otimizam o processo de desenvolvimento e fornecem acesso funcionalidades do sistema. Para facilitar a interoperabilidade entre linguagens, os tipos do .NET Framework so compatveis com CLS e, portanto, podem ser usados por qualquer linguagem de programao cujo compilador est de acordo com a CLS (Common Language Specification). Os tipos do .NET Framework compes a base na qual os aplicativos, componentes e controles do .NET so criados. O .NET Framework inclui tipos que executam as seguintes funes:

Representar tipos de dados base e excees. Encapsular estruturas de dados. Executar E/S. Acessar informaes sobre os tipos carregados. Invocar as verificaes de segurana do .NET Framework. Fornecer acesso a dados, uma GUI detalhada do lado do cliente e uma GUI do lado do cliente controlada pelo servidor.

O .NET Framework fornece um rico conjunto de interfaces, bem como classes abstratas e concretas. Voc pode usar diretamente as classes concretas ou pode derivar suas prprias classes a partir delas. Para usar a funcionalidade de uma interface, voc pode criar uma classe que implementa a interface ou derivar uma classe de uma das classes do .NET Framework que implementa a interface. Convenes de Nomenclatura

Visual C# Consolidado

448

Os tipos do .NET Framework usam um esquema de nomenclatura de sintaxe de ponto que d a idia de hierarquia. Essa tcnica agrupa tipos relacionados em namespaces para que os tipos possam ser procurados e referenciados mais facilmente. A primeira parte do nome completo at o ponto mais a direita constitui o nome do namespace. A ltima parte do nome o nome do tipo. Por exemplo, System.Collections.ArrayList representa o tipo ArrayList que pertence ao namespace System.Collections. Os tipos em System.Collections podem ser usados para manipular colees de objetos. Esse esquema de nomenclatura facilita, para os desenvolvedores de bibliotecas, a extenso do .NET Framework a fim de criar grupos hierrquicos de tipos e nome-los de uma maneira consistente e informativa. Espera-se que os desenvolvedores de bibliotecas usem as seguintes diretrizes ao criar nomes para seus namespaces: NomeDaEmpresaNomeDaTecnologia Por exemplo, o namespace Microsoft.Word est de acordo com essa diretriz. O uso de padres de nomenclatura para agrupar tipos relacionados em namespaces uma maneira muito til de criar e documentar bibliotecas de classes. Entretanto, esse esquema de nomenclatura no tem efeito sobre a visibilidade, acesso a membro, herana, segurana ou vinculao. Um namespace pode ser particionado em vrios assemblys. Um nico assembly pode conter tipos de vrios namespaces diferentes. O assembly fornece a estrutura formal para o versionamento, a implantao, a segurana, o carregamento e a visibilidade no Common Language Runtime. Para obter mais informaes sobre namespaces e nomes de tipos, consulte CTS (Common Type System). O Namespace System O namespace System o namespace raiz para tipos fundamentais do .NET Framework. Esse namespace inclui classes que representam os tipos de dados base usados por todos os aplicativos: Object (a raiz da hierarquia de herana), Byte, Char, Array, Int32, String, etc. Muitos desses tipos correspondem aos tipos de dados primitivos que so usados pelas linguagens de programao. Quando voc escreve um cdigo usando os tipos do .NET Framework, voc pode usar a correspondente palavra-chave da linguagem onde um tipo de dado base do .NET Framework esperado. A tabela a seguir lista alguns dos tipos de valor que so fornecidos pelo .NET Framework. dada uma breve descrio cada tipo e uma indicao do tipo correspondente em Visual Basic, C# e C++. A tabela tambm inclui entradas para a classes Object e String, para as quais vrias linguagens possuem as palavras-chave correspondentes. Tipo de dado em Visual Basic Byte SByte

Categoria Inteiro

Nome da classe Byte SByte

Descrio Um inteiro de 8 bits sem sinal. Um inteiro de 8 bits com sinal. No compatvel com CLS. Um inteiro de 16 bits com sinal.

Tipo de Tipo de dado em dado em C# C++ Byte sbyte char signed char short

Tipo de dado em JScript Byte SByte

Int16

Short

short

short

Visual C# Consolidado

449

Int32

Um inteiro de 32 bits com sinal. Um inteiro de 64 bits com sinal. Um inteiro e 16 bits sem sinal. No compatvel com CLS. Um inteiro de 32 bits sem sinal. No compatvel com CLS.

Integer

int

int -oulong __int64 unsigned short unsigned int -ouunsigned long unsigned __int64 float

int

Int64 UInt16

Long UShort

long ushort

long UInt16

UInt32

UInteger

uint

UInt32

UInt64

Um inteiro de 64 bits sem sinal. No compatvel com CLS.

ULong

ulong

UInt64

Ponto flutuante

Single

Nmero de ponto flutuante Single de preciso simples (32 bits). Nmero de ponto flutuante Double de preciso dupla (64 bits). Um valor booleano (true ou false). Um caractere unicode (16 bits). Um valor decimal (128 bits). Um inteiro com sinal cujo tamanho depende da plataforma subjacente (um valor de 32 bits em uma plataforma de 32 bits e um valor de 64 bits em uma plataforma de 64 bits). Um inteiro sem sinal cujo tamanho depende da plataforma subjacente (um valor de 32 bits em uma plataforma de 32 bits e um valor de 64 bits em uma plataforma de 64 bits). No compatvel com CLS. A raiz da hierarquia de objeto. Boolean Char Decimal IntPtr Nenhum tipo interno.

float

float

Double Lgico Outros Boolean Char Decimal IntPtr

double bool char decimal IntPtr Nenhum tipo interno.

double bool wchar_t Decimal IntPtr Nenhum tipo interno.

double bool char Decimal IntPtr

UIntPtr

UIntPtr Nenhum tipo interno.

UIntPtr Nenhum tipo interno.

UIntPtr Nenhum tipo interno.

UIntPtr

Objetos de Object Classe String

Object

object string

Object* String*

Object String

Uma seqncia de String caracteres Unicode imutvel e de comprimento fixo.

Visual C# Consolidado

450

Alm dos tipos de dados base, o namespace System contm mais de 100 classes, variando de classes que tratam excees a classes que lidam com os principais conceitos do ambiente de execuo, como domnios de aplicativo e coleta de lixo. O namespace System tambm contm vrios namespaces de segundo nvel. Para obter mais informaes sobre namespaces, consulte a Referncia do .NET Framework. Essa documentao fornece uma viso geral sobre cada namespace, assim como uma descrio formal de cada tipo e de seus membros.

Localizador rpido de tecnologia


A tabela a seguir fornece uma referncia rpida para as principais reas de tecnologias do .NET Framework. Para aprender sobre... Biblioteca de classes do .NET Framework ADO.NET Domnios de aplicativos ASP.NET Consultar... Viso geral sobre a biblioteca de classes do .NET Framework ADO.NET Usando domnios de aplicativos Criando aplicativos ASP.NET Viso geral do ASP.NET Controles de servidores Web do ASP.NET Assemblies Programao assncrona Programao com assemblies COMO: Encadear chamadas assncronas com um mtodo de Web Service Gerao e compilao dinmicas de cdigo fonte Common Language Runtime Configurando aplicativos Configurando aplicativos ASP.NET Acesso a dados Depurao Implantao Acesso a dados Depurao e perfil de aplicativos Implantao de ClickOnce para aplicativos de formulrios do Windows Implantando aplicativos .NET Framework

CodeDom Common Language Runtime Configurao

Visual C# Consolidado

451

Noes bsicas sobre implantao de .NET Framework Designers e o ambiente de design Eventos Excees Coleta de lixo GDI + Tipos genricos E/S Interoperabilidade Desenvolvimento mvel Estendendo suporte em tempo de design Tratamento e disparada de eventos Tratamento e lanamento de excees Coleta de lixo Elementos grficos e desenho em formulrios do Windows Reflexo e tipos genrico E/S de arquivo e de fluxo Interoperabilidade .NET Compact Framework Criando aplicativos mveis ASP .NET Redes Reflexo Programao de redes Reflexo

Arquitetura de comunicao remota Objetos remotos Viso geral sobre a arquitetura de comunicao remota do .NET Framework Segurana Segurana no .NET Framework Conceitos chaves sobre segurana Componentes atendidos Escrevendo componentes atendidos Viso geral sobre componentes atendidos Serializao Execuo lado a lado Threads Formulrios do Windows Serializao Execuo lado a lado Threads gerenciadas Formulrios do Windows no .NET Framework

Visual C# Consolidado

452

Controles de formulrios do Windows XML XML Web Services

Controles de formulrios do Windows

Documentos e dados XML Viso geral sobre XML Web Services

Como Criar uma Listagem de Diretrio O exemplo de cdigo a seguir mostra como usar as classes de E/s para criar uma lista de todos os arquivos com a extenso ".exe " em um diretrio. Exemplo C#
using System; using System.IO; class DirectoryLister { public static void Main(String[] args) { string path = "."; if (args.Length > 0) { if (File.Exists(args[0]) { path = args[0]; } else { Console.WriteLine("{0} not found; using current directory:", args[0]); } DirectoryInfo dir = new DirectoryInfo(path); foreach (FileInfo f in dir.GetFiles("*.exe")) { String name = f. Name; long size = f.Length; DateTime creationTime = f.CreationTime; Console.WriteLine("{0,-12:N0} {1,-20:g} {2}", size, creationTime, name); } } }

Programao robusta Neste exemplo, (.. ",) e o cdigo relaciona todos os arquivos na pasta atual ter uma extenso.exe, junto com seus tamanho do arquivo, hora de criao, e nome. " a pasta atual, indicada pelo DirectoryInfo Supondo que havia arquivos.exe na subpasta \Bin da C:\MyDir, a sada desse cdigo pode parecer isso:
953 7/20/2000 10:42 AM C:\MyDir\Bin\paramatt.exe 664 7/27/2000 3:11 PM C:\MyDir\Bin\tst.exe 403 8/8/2000 10:25 AM C:\MyDir\Bin\dirlist.exe

Se voc desejar uma lista de arquivos em outro diretrio, como o diretrio de raiz C:\, passar o argumento " C:\ " para o executvel gerado por compilao esse cdigo, por exemplo: " testApplication.EXE C:\ ". Observao Usurios Visual Basic podem optar por usar os mtodos e propriedades fornecidas pelo objeto My.Computer.FileSystem para a E/s de arquivos. Para obter mais informaes, consulte Objeto My.Computer.FileSystem. Como: Ler e gravar em um arquivo de dados recm criado O BinaryWriter e BinaryReader classes so usados para gravar e ler dados, em vez de caracteres seqncias. O exemplo de cdigo a seguir demonstra gravar dados e Ler dados de um fluxo de arquivo novo e vazio (Test.data). Aps criar os dados arquivos na pasta atual, a associada BinaryWriter e BinaryReader so criados, usado para gravar os inteiros 0 a 10 para Test.data, que deixa o ponteiro de arquivo no final do arquivo. e BinaryWriter Aps definir o ponteiro de arquivo volta para a origem, as BinaryReader leituras sem o contedo especificado.

Visual C# Consolidado

453

Exemplo C#
using System; using System.IO; class MyStream { private const string FILE_NAME = "Test.data"; public static void Main(String[] args) { // Create the new, empty data file. if (File.Exists(FILE_NAME)) { Console.WriteLine("{0} already exists!", FILE_NAME); return; } FileStream fs = new FileStream(FILE_NAME, FileMode.CreateNew); // Create the writer for data. BinaryWriter w = new BinaryWriter(fs); // Write data to Test.data. for (int i = 0; i < 11; i++) { w.Write( (int) i); } w.Close(); fs.Close(); // Create the reader for data. fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read); BinaryReader r = new BinaryReader(fs); // Read data from Test.data. for (int i = 0; i < 11; i++) { Console.WriteLine(r.ReadInt32()); } r.Close(); fs.Close(); } }

Programao robusta Se Test.data acionada. j existe no diretrio atual, um IOException Usar FileMode.Create para criar um novo arquivo sem organizando sempre um IOException. Como: Abrir e anexar aum arquivo de log e StreamWriterStreamReader caracteres para gravar e ler caracteres fluxos. O exemplo de cdigo a seguir abre o log.txt arquivo para entrada, ou cria o arquivo se ele ainda no existir, e acrescenta informaes ao final do arquivo. O contedo do arquivo so gravados na sada padro para exibio. Como uma alternativa para este exemplo, as informaes pode ser armazenadas como uma nica seqncia ou matriz de seqncia, e a WriteAllText. ou WriteAllLines mtodo pode ser usado para obter a mesma funcionalidade Observao Do My.Application.Log Usurios Visual Basic podem optar por usar os mtodos e propriedades fornecidas pelo ou My.Computer.FileSystem objetos para criar ou gravar em arquivos de log. Para obter mais informaes, consulte Objeto My.Application.Log e Objeto My.Computer.FileSystem. Exemplo C#
using System; using System.IO; class DirAppend { public static void Main(String[] args) { using (StreamWriter w = File.AppendText("log.txt")) { Log ("Test1", w); Log ("Test2", w); // Close the writer and underlying file. w.Close(); } // Open and read the file. using (StreamReader r = File.OpenText("log.txt")) { DumpLog (r); } } public static void Log (String logMessage, TextWriter w) { w.Write("\r\nLog Entry : "); w.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(), DateTime.Now.ToLongDateString()); w.WriteLine(" :"); w.WriteLine(" :{0}", logMessage); w.WriteLine ("-------------------------------"); // Update the underlying file. w.Flush(); } public static void DumpLog (StreamReader r) { // While not at the end of the file, read and write lines. String line; while ((line=r.ReadLine())!=null) { Console.WriteLine(line); } r.Close(); }}

Como Escrever Texto em um Arquivo Os exemplos de cdigo a seguir mostram como gravar texto em um arquivo de texto.

Visual C# Consolidado

454

O primeiro exemplo mostra como adicionar texto a um arquivo existente. O segundo exemplo mostra como criar um novo arquivo de texto e gravar uma seqncia a ele. Funcionalidade semelhante pode ser fornecida pelos mtodos WriteAllText. Observao Usurios Visual Basic podem optar por usar os mtodos e propriedades fornecidas pelo objeto My.Computer.FileSystem para a E/s de arquivos. Para obter mais informaes, consulte Objeto My.Computer.FileSystem. Exemplo C#
using System; using System.IO; class Test { public static void Main() { // Create an instance of StreamWriter to write text to a file. // The using statement also closes the StreamWriter. using (StreamWriter sw = new StreamWriter("TestFile.txt")) { // Add some text to the file. sw.Write("This is the "); sw.WriteLine("header for the file."); sw.WriteLine("-------------------"); // Arbitrary objects can also be written to the file. sw.Write("The date is: "); sw.WriteLine(DateTime.Now); } } }

C#
using System; using System.IO; public class TextToFile { private const string FILE_NAME = "MyFile.txt"; public static void Main(String[] args) { if (File.Exists(FILE_NAME)) { Console.WriteLine("{0} already exists.", FILE_NAME); return; } using (StreamWriter sw = File.CreateText(FILE_NAME)) { sw.WriteLine ("This is my file."); sw.WriteLine ("I can write ints {0} or floats {1}, and so on.", 1, 4.2); sw.Close(); } } }

Como: Ler texto de um arquivo Os exemplos de cdigo a seguir mostram como ler texto de um arquivo de texto. O segundo exemplo notifica voc quando o final do arquivo for detectado. Do ReadAllLines essa funcionalidade tambm pode ser obtida usando ou ReadAllText mtodos. Exemplo C#
using System; using System.IO; class Test { public static void Main() { try { // Create an instance of StreamReader to read from a file. // The using statement also closes the StreamReader. using (StreamReader sr = new StreamReader("TestFile.txt")) { String line; // Read and display lines from the file until the end of // the file is reached. while ((line = sr.ReadLine()) != null) { Console.WriteLine(line); } } } catch (Exception e) { // Let the user know what went wrong. Console.WriteLine("The file could not be read:"); Console.WriteLine(e.Message); } } }

C#
using System; using System.IO; public class TextFromFile { private const string FILE_NAME = "MyFile.txt"; public static void Main(String[] args) { if (!File.Exists(FILE_NAME)) { Console.WriteLine("{0} does not exist.", FILE_NAME); return; } using (StreamReader sr = File.OpenText(FILE_NAME)) { String input; while ((input=sr.ReadLine())!=null) { Console.WriteLine(input); } Console.WriteLine ("The end of the stream has been reached."); sr.Close(); } }

Programao robusta

Visual C# Consolidado

455

Este cdigo cria um StreamReader que aponta para MyFile.txt por meio de uma chamada para File.OpenText. Retorna StreamReader.ReadLine cada linha como uma seqncia. Quando no houver nenhum mais caracteres para ler, uma mensagem exibida com essa informao, e o fluxo est fechado. Observao Usurios Visual Basic podem optar por usar os mtodos e propriedades fornecidas pelo objeto My.Computer.FileSystem para a E/s de arquivos. Para obter mais informaes, consulte Objeto My.Computer.FileSystem. Como Ler Caracteres de uma Seqncia de Caracteres O exemplo de cdigo a seguir permite que voc a ler um determinado nmero de caracteres uma seqncia existente, comeando no local especificado na seqncia. Use StringReader para fazer isso, conforme demonstrado abaixo. Este cdigo define uma seqncia e converte-para uma matriz de caracteres, que ento pode ser lido pelo utilizando o mtodo apropriado StringReader.Read. Este exemplo l apenas o nmero especificado de caracteres da seqncia, da seguinte maneira.
Some number o

Exemplo C#
using System; using System.IO; public class CharsFromStr { public static void Main(String[] args) { // Create a string to read characters from. String str = "Some number of characters"; // Size the array to hold all the characters of the string // so that they are all accessible. char[] b = new char[24]; // Create an instance of StringReader and attach it to the string. StringReader sr = new StringReader(str); // Read 13 characters from the array that holds the string, starting // from the first array member. sr.Read(b, 0, 13); // Display the output. Console.WriteLine(b); // Close the StringReader. sr.Close(); } }

Como Escrever Caracteres em uma Seqncia de Caracteres O exemplo de cdigo a seguir grava um determinado nmero de caracteres de uma matriz de caracteres em uma seqncia existente, comeando no local especificado na matriz. Use StringWriter para fazer isso, conforme demonstrado abaixo. Exemplo C#
using System; using System.IO; using System.Text; public class CharsToStr { public static void Main(String[] args) { // Create an instance of StringBuilder that can then be modified. StringBuilder sb = new StringBuilder("Some number of characters"); // Define and create an instance of a character array from which // characters will be read into the StringBuilder. char[] b = {' ','t','o',' ','w','r','i','t','e',' ','t','o','.'}; // Create an instance of StringWriter // and attach it to the StringBuilder. StringWriter sw = new StringWriter(sb); // Write three characters from the array into the StringBuilder. sw.Write(b, 0, 3); // Display the output. Console.WriteLine(sb); // Close the StringWriter. sw.Close(); } }

Visual C# Consolidado

456

Programao robusta Este exemplo ilustra o uso do para modificar uma seqncia existente. um StringBuilder Observe que isso requer uma declarao adicional using, como a StringBuilder classe um membro do espao para nome System.Text. Alm disso, em vez de definir uma seqncia e convert-la em uma matriz de caracteres, este um exemplo de criar uma matriz de caractere diretamente e inicializando ele. Esse cdigo produz o seguinte resultado.
Some number of characters to

Como Adicionar ou Remover Entradas da Lista de Controle de Acesso Para adicionar ou remover entradas controle acesso (ACL) Lista para ou de um arquivo, ou DirectorySecurity Objeto deve ser obtido o arquivo ou pasta, modificado, e aplicados novamente ao arquivo ou pasta.. o FileSecurity Para adicionar ou remover uma entrada ACL de um arquivo 1. 2. 3. 1. 2. 3. Chame o GetAccessControl mtodo para obter um FileSecurity objeto que contm as entradas ACL atuais de um arquivo. Adicionar ou remover entradas ACL do objeto FileSecurity retornado da etapa 1. Passar o FileSecurity objeto para o SetAccessControl mtodo para aplicar as alteraes. Chame o GetAccessControl mtodo para obter um DirectorySecurity objeto que contm as entradas ACL atuais de uma pasta. Adicionar ou remover entradas ACL do objeto DirectorySecurity retornado da etapa 1. Passar o DirectorySecurity objeto para o SetAccessControl mtodo para aplicar as alteraes.

Para adicionar ou remover uma entrada ACL de um diretrio

Exemplo C#
using System; using System.IO; using System.Security.AccessControl; namespace FileSystemExample { class FileExample { public static void Main() { try { string fileName = "test.xml"; Console.WriteLine("Adding access control entry for " + fileName); // Add the access control entry to the file. AddFileSecurity(fileName, @"DomainName\AccountName", FileSystemRights.ReadData, AccessControlType.Allow); Console.WriteLine("Removing access control entry from " + fileName); // Remove the access control entry from the file. RemoveFileSecurity(fileName, @"DomainName\AccountName", FileSystemRights.ReadData, AccessControlType.Allow); Console.WriteLine("Done."); } catch (Exception e) { Console.WriteLine(e); } } // Adds an ACL entry on the specified file for the specified account. public static void AddFileSecurity(string fileName, string account, FileSystemRights rights, AccessControlType controlType) { // Get a FileSecurity object that represents the // current security settings. FileSecurity fSecurity = File.GetAccessControl(fileName); // Add the FileSystemAccessRule to the security settings. fSecurity.AddAccessRule(new FileSystemAccessRule(account, rights, controlType)); // Set the new access settings. File.SetAccessControl(fileName, fSecurity); } // Removes an ACL entry on the specified file for the specified account. public static void RemoveFileSecurity(string fileName, string account, FileSystemRights rights, AccessControlType controlType) { // Get a FileSecurity object that represents the // current security settings. FileSecurity fSecurity = File.GetAccessControl(fileName); // Add the FileSystemAccessRule to the

Visual C# Consolidado

457

security settings. fSecurity.RemoveAccessRule(new FileSystemAccessRule(account, rights, controlType)); // Set the new access settings. File.SetAccessControl(fileName, fSecurity); } } }

Compilando o cdigo Voc deve fornecer um usurio ou conta de grupo vlido para executar esse exemplo. Este exemplo usa um File objeto; no entanto, o mesmo procedimento usado para o FileInfo, Directory., e DirectoryInfo Classes

Criando Novas Seqncias de Caracteres


O.NET Framework fornece vrios mtodos da classe System.String que criar novos objetos de seqncia, combinando vrias seqncias, matrizes de seqncias, ou objetos. A tabela a seguir lista diversos mtodos til. Nome do mtodo String.Format String.Concat String.JOIN String.Insert String.CopyTo Formato Voc pode usar o String.Format mtodo para criar seqncias formatadas e concatenar seqncias que representam vrios objetos Qualquer objeto passado esse mtodo converte automaticamente em uma seqncia. Por exemplo, se seu aplicativo deve exibir um Int32 valor e um DateTime valor para o usurio, voc pode construir uma seqncia para representar esses valores usando o Format mtodo facilmente. Para obter informaes sobre como formatar convenes usadas com esse mtodo, consulte a seo sobre composio formatao. O exemplo a seguir usa o Format mtodo para criar uma seqncia que usa uma varivel Inteiro. C#
int MyInt = 12; string MyString = String.Format("Your dog has {0} fleas. It is time to get a flea collar. The current universal date is: {1:u}." , MyInt, DateTime.Now); Console.WriteLine(MyString);

Uso Cria uma seqncia formatada de um conjunto de objetos de entrada. Cria seqncias de dois ou mais seqncias. Cria uma nova seqncia, combinando uma matriz de seqncias. Cria uma nova seqncia inserindo uma seqncia no ndice especificado de uma seqncia existente. Cpias especificado caracteres em uma seqncia em uma posio especificada de caracteres em uma matriz.

O exemplo anterior exibe o texto ' Your dog has 12 fleas. It is time to get a flea collar. The current universal date is: 2001-04-10 15:51:24Z.. ' para o console Exibe DateTime.Now a data atual e tempo de uma maneira especificada pela cultura associada a segmento atual. Concat O String.Concat mtodo pode ser usado para facilmente criar um novo objeto seqncia de caracteres de dois ou mais objetos existentes. Ele fornece uma forma independente de linguagem para concatenar seqncias. Esse mtodo aceita qualquer classe que deriva de System.Object. O exemplo a seguir cria uma seqncia de dois objetos de seqncia e um caractere separating.

Visual C# Consolidado

458

C#
string MyString = "Hello"; string YourString = "World!"; Console.WriteLine(String.Concat(MyString, ' ', YourString));

Esse cdigo exibe Hello World! para o console. Ingressar O String.Join mtodo cria uma nova seqncia de uma matriz de seqncias e uma seqncia de caracteres separadores. Esse mtodo til se voc desejar concatenar vrias seqncias juntos, fazer uma lista talvez separada por uma vrgula. O exemplo a seguir usa um espao para vincular uma matriz de seqncia de caracteres. C#
string[] MyString = {"Hello", "and", "welcome", "to", "my" , "world!"}; Console.WriteLine(String.Join(" ", MyString));

Esse cdigo exibe Hello and welcome to my world! para o console. Inserir O String.Insert mtodo cria uma nova seqncia inserindo uma seqncia em uma posio na outra seqncia especificada. Esse mtodo usa um ndice com base zero. O exemplo a seguir insere uma seqncia no quinta a posio do MyString ndice e cria uma nova seqncia com esse valor. C#
string MyString = "Once a time."; Console.WriteLine(MyString.Insert(4, " upon"));

Esse cdigo exibe Once upon a time. para o console. CopyTo O String.CopyTo mtodo copia partes de uma seqncia em uma matriz de caracteres. Voc pode especificar os dois ndice Incio da seqncia e o nmero de caracteres a serem copiados. Este mtodo utiliza o ndice fonte, uma matriz de caracteres, o ndice de destino, e o nmero de caracteres para copiar. Todos os ndices so baseada em zero. O exemplo a seguir usa o CopyTo mtodo para copiar os caracteres da palavra " Hello " de um objeto de seqncia para a primeira posio de ndice de uma matriz de caracteres. C#
string MyString = "Hello World!"; char[] MyCharArray = {'W','h','e','r','e'}; Console.WriteLine("The original character array: {0}", MyCharArray); MyString.CopyTo(0, MyCharArray,0 ,5); Console.WriteLine("The new character array: {0}", MyCharArray);

Esse cdigo exibir o seguinte para o console.


The original character array: Where The new character array: Hello

Visual C# Consolidado

459

Aparando e Removendo Caracteres


Se voc estiver analisando uma frase em palavras individuais, voc pode finalizar backup com palavras que tenham espaos em branco (tambm chamados espaos em branco) em qualquer uma das extremidades da palavra. Nessa situao, voc pode usar um dos mtodos aparo na classe System.String para remover qualquer nmero de espaos ou outros caracteres de uma posio especificada na seqncia de caracteres A tabela a seguir descreve os mtodos aparo disponveis. Nome do mtodo String.Trim String.TrimEnd String.TrimStart String.Remove Aparar Facilmente voc pode remover espaos em branco de ambas as extremidades de uma seqncia usando o String.Trim mtodo, conforme mostrado no exemplo o seguir. C#
String MyString = " Big "; Console.WriteLine("Hello{0}World!", MyString ); string TrimString = MyString.Trim(); Console.WriteLine("Hello{0}World!", TrimString );

Uso Remove espaos em branco de incio e no fim de uma seqncia. Remove caracteres especificados em uma matriz de caracteres a partir do final de uma seqncia. Remove caracteres especificados em uma matriz de caracteres de incio de uma seqncia. Remove um nmero especificado de caracteres de uma posio ndice especificado na seqncia.

Esse cdigo exibe as seguintes linhas ao console.


Hello Big World! HelloBigWorld!

TrimEnd O String.TrimEnd mtodo Remove caracteres a partir do final de uma seqncia, criando um novo objeto de seqncia. Uma matriz de caracteres passado para este mtodo para especificar os caracteres a ser removido. A ordem dos elementos na matriz de caracteres no afeta a operao aparo. O Trim pra quando for encontrado um caractere no especificado na matriz. O exemplo a seguir remove as letras de uma seqncia usando o TrimEnd mtodo ltima. Neste exemplo, a posio do caractere 'r' e o 'W' caractere esto invertidos para ilustrar que a ordem dos caracteres na matriz no importa. Observe que este cdigo remove a palavra ltima de MyString mais a primeira parte. C#
string MyString = "Hello World!"; char[] MyChar = {'r','o','W','l','d','!',' '}; string NewString = MyString.TrimEnd(MyChar); Console.WriteLine(NewString);

Esse cdigo exibe He para o console.

Visual C# Consolidado

460

O exemplo a seguir remove a ltima palavra de uma seqncia usando o TrimEnd mtodo. Nesse cdigo, uma vrgula segue a palavra Hello e, porque a vrgula no est especificada na matriz de caracteres para cortar, o Trim termina na vrgula. C#
string MyString = "Hello, World!"; char[] MyChar = {'r','o','W','l','d','!',' '}; string NewString = MyString.TrimEnd(MyChar); Console.WriteLine(NewString);

Esse cdigo exibe Hello, para o console. TrimStart O String.TrimStart mtodo semelhante ao mtodo String.TrimEnd exceto que ele cria uma nova seqncia, removendo caracteres do incio da seqncia um objeto existente. Uma matriz de caracteres passado para o TrimStart mtodo para especificar os caracteres a ser removido. Como com o TrimEnd mtodo, a ordem dos elementos na matriz de caracteres no afeta a operao aparo. O Trim pra quando for encontrado um caractere no especificado na matriz. O exemplo a seguir remove a primeira palavra de uma seqncia. Neste exemplo, a posio do caractere 'l' e o 'H' caractere esto invertidos para ilustrar que a ordem dos caracteres na matriz no importa. C#
string MyString = "Hello World!"; char[] MyChar = {'e', 'H','l','o',' ' }; string NewString = MyString.TrimStart(MyChar); Console.WriteLine(NewString);

Esse cdigo exibe World! para o console. Remover O String.Remove mtodo, comeando em uma posio especificada em uma seqncia existente, remove um nmero especificado de caracteres. Este mtodo assume um ndice com base zero. O exemplo a seguir remove dez caracteres de um Incio de seqncia na posio cinco de um ndice da seqncia baseada em zero. C#
string MyString = "Hello Beautiful World!"; Console.WriteLine(MyString.Remove(5,10));

Esse cdigo exibe Hello World! para o console.

Preenchendo Seqncias de Caracteres


Pode usar um dos mtodos a seguir para criar uma nova verso de uma seqncia existente que alinhado direita ou alinhada esquerda a um nmero especificado de espaos. A nova seqncia ou pode ser preenchida com espaos vazios (tambm chamados espaos em branco) ou com caracteres personalizados. Nome do mtodo

Uso

Visual C# Consolidado

461

String.PadLeft String.PadRight PadLeft

Alinha direita e PADS uma seqncia para que seja uma distncia especificada a partir do incio da seqncia seu caractere mais direita. Alinha esquerda e PADS uma seqncia para que seja uma distncia especificada a partir do final de seqncia seu caractere mais direita.

O String.PadLeft mtodo cria uma nova seqncia que alinhado direita para que o ltimo caractere seja um nmero de espaos do primeiro ndice da seqncia especificado. Espaos em branco so inseridos se voc no usar uma substituio que permite que voc se especificar seu prprio caractere de preenchimento personalizada. O exemplo a seguir usa o PadLeft mtodo para criar uma nova seqncia que tenha um comprimento total de vinte espaos. C#
string MyString = "Hello World!"; Console.WriteLine(MyString.PadLeft(20, '-'));

Este exemplo exibe --------Hello World! para o console. PadRight O String.PadRight mtodo cria uma nova seqncia que alinhado esquerda para que a seqncia atual ser estendida especificado um nmero de espaos para a direita do primeiro ndice a seqncia na. Esse mtodo preenche a nova seqncia com espaos em branco se voc no especificar um caractere personalizado. O exemplo a seguir usa o PadRight mtodo para criar uma nova seqncia que tenha um comprimento total de vinte espaos. C#
string MyString = "Hello World!"; Console.WriteLine(MyString.PadRight(20, '-'));

Este exemplo exibe Hello World!-------- para o console.

Comparando Seqncias de Caracteres


O.NET Framework fornece vrios mtodos para comparar os valores de seqncias. A tabela a seguir lista e descreve os mtodos Comparison valor. Nome do mtodo String.Compare Uso Compara os valores das duas seqncias. Retorna um valor inteiro.

String.CompareOrdinal Compara duas seqncias sem considerar a cultura local. Retorna um valor inteiro. String.CompareTo String.StartsWith String.EndsWith Compara o objeto de seqncia atual outra seqncia. Retorna um valor inteiro. Determina se uma seqncia comea com a seqncia passada. Retorna um valor booleano. Determina se uma seqncia termina com a seqncia passada. Retorna

Visual C# Consolidado

462

um valor booleano. String.Equals String.IndexOf Determina se duas seqncias so os mesmos. Retorna um valor booleano. Retorna a posio de ndice de um caractere ou seqncia, comeando a partir do incio da seqncia voc est examinando. Retorna um valor inteiro. Retorna a posio de ndice de um caractere ou seqncia, comeando a partir do final de seqncia voc est examinando. Retorna um valor inteiro.

String.LastIndexOf

Compare O String.Compare mtodo fornece uma maneira completa de comparar o objeto de seqncia atual para outro objeto ou seqncia. Esse mtodo culturally ciente. Voc pode usar esta funo para comparar dois seqncias ou substrings de duas seqncias. Alm disso, overloads so fornecidos que considerar ou Ignorar maisculas e culturais varincia. A tabela a seguir mostra valores inteiros trs que podem ser retornados por esse mtodo. Tipo de valor Um inteiro negativo 0 Um inteiro positivo Ou1 Condio strA menor que strB. igual a strAstrB. Esta instncia maior que value. Ou value uma referncia nula (Nothing no Visual Basic.)

O exemplo a seguir usa o Compare mtodo para determinar os valores das duas seqncias relativos. C#
string MyString = "Hello World!"; Console.WriteLine(String.Compare(MyString, "Hello World?"));

Este exemplo exibe -1 para o console. O exemplo anterior confidenciais culture-por padro. Para executar uma comparao de seqncia culture-insensitive, use uma sobrecarga do String.Compare mtodo que permite que voc para especificar a cultura para usar, fornecendo um culture parmetro. Para obter um exemplo que demonstra como usar o String.Compare mtodo para realizar uma comparao culture-insensitive, consulte Executar Comparisons String Insensitive Culture-. CompareOrdinal O String.CompareOrdinal mtodo compara dois objetos de seqncia sem considerar a cultura local. Os valores de retorno desse mtodo so idnticos aos valores retornados pelo mtodo Compare na tabela anterior. O exemplo a seguir usa o CompareOrdinal mtodo para comparar os valores das duas seqncias. C#
string MyString = "Hello World!"; Console.WriteLine(String.CompareOrdinal(MyString, "hello world!"));

Visual C# Consolidado

463

Este exemplo exibe -32 para o console. CompareTo O String.CompareTo mtodo compara a seqncia que o objeto de seqncia atual encapsula a outro seqncia ou objeto. Os valores de retorno desse mtodo so idnticos aos valores retornados pelo mtodo Compare na tabela anterior. O exemplo a seguir usa o CompareTo mtodo para comparar o MyString objeto do OtherString objeto. C#
String MyString = "Hello World"; String OtherString = "Hello World!"; int MyInt = MyString.CompareTo(OtherString); Console.WriteLine( MyInt );

Este exemplo exibe 1 para o console. Todos os overloads do mtodo String.CompareTo executar comparaes confidenciais culture-e maisculas de minsculas por padro. Nenhum overloads desse mtodo so fornecidos que permitem a voc para realizar uma comparao insensitive culture-. Para maior clareza de cdigo, recomendvel que voc utilize o String.Compare mtodo em vez disso, especificando CultureInfo.CurrentCulture para operaes confidenciais culture-ou CultureInfo.InvariantCulture para operaes insensitive culture-. Para obter exemplos que demonstram como usar o String.Compare mtodo para realizar comparaes confidenciais culture-e-insensitive culture, consulte Executar Comparisons String Insensitive Culture-. Igual a O String.Equals mtodo facilmente pode determinar se duas seqncias so os mesmos. Maisculas de Minsculas esse mtodo retorna um true ou false boolean valor. Pode ser usado de uma classe existente, conforme ilustrado no exemplo a seguir. O exemplo a seguir usa o Equals mtodo para determinar se um objeto de seqncia contm a frase " Hello World ". C#
string MyString = "Hello World"; Console.WriteLine(MyString.Equals("Hello World"));

Este exemplo exibe True para o console. Esse mtodo tambm pode ser usado como um mtodo esttico. O exemplo a seguir compara dois objetos de seqncia usando um mtodo esttico. C#
string MyString = "Hello World"; string YourString = "Hello World"; Console.WriteLine(String.Equals(MyString, YourString));

Este exemplo exibe True para o console. StartsWith e EndsWith Voc pode utilizar o String.StartsWith mtodo para determinar se um objeto de seqncia comea com os mesmos caracteres que abranger outra seqncia. Esse mtodo maisculas de minsculas retorna true se o objeto de seqncia atual comea com a seqncia passada e false

Visual C# Consolidado

464

se no estiver. O exemplo a seguir usa esse mtodo para determinar se um objeto de seqncia comea com " Hello ". C#
string MyString = "Hello World"; Console.WriteLine(MyString.StartsWith("Hello"));

Este exemplo exibe True para o console. O String.EndsWith mtodo Compara uma seqncia passada para os caracteres que existem no final da seqncia o objeto atual. Ele tambm retorna um valor booleano. O exemplo a seguir verifica o fim de uma seqncia usando o EndsWith mtodo. C#
string MyString = "Hello World"; Console.WriteLine(MyString.EndsWith("Hello"));

Este exemplo exibe False para o console. IndexOf e LastIndexOf Voc pode usar o String.IndexOf mtodo para determinar a posio da primeira ocorrncia de um caractere especfico dentro de uma seqncia. Este mtodo maisculas de minsculas inicia contagem do incio de uma seqncia e retorna a posio de um caractere utilizando um ndice com base zero passado. Se o caractere no puder ser encontrado, um valor de 1 retornado. O exemplo a seguir usa o IndexOf mtodo para procurar a primeira ocorrncia da. ' l ' caracteres em uma seqncia C#
string MyString = "Hello World"; Console.WriteLine(MyString.IndexOf('l'));

Este exemplo exibe 2 para o console. O String.LastIndexOf mtodo semelhante ao mtodo String.IndexOf exceto que ela retorna a posio da ltima ocorrncia de um caractere especfico dentro de uma seqncia. Ele diferencia maisculas de minsculas e usa um ndice com base zero. O exemplo a seguir utiliza o LastIndexOf mtodo para pesquisar para a ltima ocorrncia da. ' l ' caracteres em uma seqncia C#
string MyString = "Hello World"; Console.WriteLine(MyString.LastIndexOf('l'));

Este exemplo exibe 9 para o console. Ambos os mtodos so teis quando usada em conjunto com o String.Remove mtodo. Voc pode usar um ou LastIndexOf Mtodos para recuperar a posio do caractere, e fornea naquela posio para o Remove mtodo para remover um caractere ou uma palavra que comece com esse caractere. o IndexOf

Visual C# Consolidado

465

Alterando a Caixa
Se voc escrever um aplicativo que aceita entrada de um usurio, nunca pode certificar-que caso ele ou ela usar para inserir os dados. Como os mtodos que comparam seqncias e caracteres diferenciam maisculas de minsculas, voc deve converter caso de seqncias de caracteres inseridos pelos usurios antes comparando-os em valores constantes. Voc pode alterar facilmente caso de uma seqncia. A tabela a seguir descreve dois mtodos alterao caso. Cada mtodo fornece uma substituio que aceita uma cultura. Nome do mtodo String.ToUpper String.ToLower ToUpper O String.ToUpper mtodo altera todos os caracteres em uma seqncia em maisculas. O exemplo seguinte converte a seqncia " World hello! de " Misto caso em maisculo. C#
String MyString = "Hello World!"; Console.WriteLine(MyString.ToUpper());

Uso Converte todos os caracteres em uma seqncia em maisculas. Converte todos os caracteres em uma seqncia em minsculas.

Este exemplo exibe HELLO WORLD! para o console. O exemplo anterior confidenciais culture-por padro. Para executar uma alterao caso cultureinsensitive, use uma sobrecarga do String.Upper mtodo que permite que voc para especificar a cultura para usar, fornecendo um culture parmetro. Para obter um exemplo que demonstra como usar o String.Upper mtodo para executar uma alterao caso culture-insensitive, consulte Executar alteraes caso Insensitive Culture-. ToLower O String.ToLower mtodo semelhante ao mtodo anterior, mas em vez disso converte todos os caracteres em uma seqncia para minsculas. O exemplo a seguir converte a seqncia " World hello! " em minsculas. C#
String MyString = "Hello World!"; Console.WriteLine(MyString.ToLower());

Este exemplo exibe hello world! para o console. O exemplo anterior confidenciais culture-por padro. Para executar uma alterao caso cultureinsensitive, use uma sobrecarga do String.Lower mtodo que permite que voc para especificar a cultura para usar, fornecendo um culture parmetro. Para obter um exemplo que demonstra como usar o String.Lower mtodo para executar uma alterao caso culture-insensitive, consulte Executar alteraes caso Insensitive Culture-.

Visual C# Consolidado

466

Usando a Classe StringBuilder


O String objeto imutvel. Sempre que voc utilizar um dos mtodos da classe System.String, voc criar um novo objeto de seqncia na memria, que requer uma nova alocao de espao para esse novo objeto. Em situaes em que voc precise realizar modificaes repetidas em uma seqncia de caracteres, a sobrecarga associada criando um novo String objeto pode ser caro. A System.Text.StringBuilder classe pode ser usada quando voc deseja modificar uma seqncia sem criar um novo objeto. Por exemplo, usando a StringBuilder classe pode melhorar o desempenho quando concatenao Muitas seqncias juntos em um loop. Voc pode criar uma nova instncia da classe StringBuilder por inicializar a varivel com um dos mtodos sobrecarregados de construtor, conforme ilustrado no exemplo a seguir. C#
StringBuilder MyStringBuilder = new StringBuilder("Hello World!");

Definir a capacidade e comprimento Embora voc pode especificar um valor para o nmero mximo de caracteres que pode conter. um objeto dinmico que permite que voc para expandir o nmero de caracteres na seqncia que ele encapsula, o StringBuilder Esse valor chamada a capacidade do objeto e no deve ser confundido com o comprimento da seqncia de caracteres que mantm o atual StringBuilder. Por exemplo, voc pode criar uma nova instncia da classe StringBuilder com a seqncia " Al ", que possui um comprimento de 5, e voc pode especificar que ele tiver a capacidade mxima de 25. Quando voc modificar ele no no realocar tamanho para si at que a capacidade seja alcanada. o StringBuilder, Quando isso ocorrer, o novo espao distribudo automaticamente e a capacidade duplicada. Voc pode especificar a capacidade da StringBuilder classe usando um dos construtores sobrecarregados. O exemplo a seguir especifica que o MyStringBuilder objeto pode ser expandido para um mximo de 25 espaos. C#
StringBuilder MyStringBuilder = new StringBuilder("Hello World!", 25);

Alm disso, voc pode usar a leitura / gravar Capacidade propriedade para definir o tamanho mximo do objeto. O exemplo a seguir usa a Capacity propriedade para definir o comprimento mximo de objeto. C#
MyStringBuilder.Capacity = 25;

O EnsureCapacity mtodo pode ser usado para verificar a capacidade do atual StringBuilder. Se a capacidade for maior que o valor passado, nenhuma alterao feita; no entanto, se a capacidade for menor que o valor passado, a capacidade atual alterada para corresponder o valor passado. A Comprimento propriedade pode tambm ser exibido ou definido. Se voc definir a Length propriedade para um valor que maior que a Capacity propriedade, a Capacity propriedade automaticamente alterada para o mesmo valor que a Length propriedade. A configurao da Length propriedade para um valor que menor que o comprimento da seqncia de caracteres dentro da atual StringBuilder diminui a seqncia. Modificar a seqncia de caracteres StringBuilder

Visual C# Consolidado

467

A tabela a seguir lista os mtodos que podem ser usados para modificar o contedo de um StringBuilder. Nome do mtodo StringBuilder.Append Uso Acrescenta informaes ao final do atual StringBuilder.

StringBuilder.AppendFormat Substitui um especificador de formato passado em uma seqncia com texto formatado. StringBuilder.Insert Insere uma seqncia ou objeto para o ndice especificado do atual StringBuilder. Remove um nmero especificado de caracteres da atual StringBuilder. Substitui um caractere especificado em um ndice especificado.

StringBuilder.Remove

StringBuilder.Replace Acrescentar

O Append mtodo pode ser usado para adicionar texto ou uma representao seqncia de um objeto ao final de uma seqncia representada por atual StringBuilder. O exemplo a seguir inicializa e ento acrescenta algum texto para o final do objeto. Para " Hello World " um StringBuilder Espao em alocado automaticamente conforme necessrio. C#
StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); MyStringBuilder.Append(" What a beautiful day."); Console.WriteLine(MyStringBuilder);

Este exemplo exibe Hello World! What a beautiful day. para o console.

AppendFormat
Do Formatao seo o AppendFormat mtodo adiciona texto ao final do StringBuilder, mas tambm implementa a IFormattable interface e portanto aceita as seqncias Formato padro descritas em. Voc pode usar esse mtodo para personalizar o formato de variveis e acrescentar esses valores para um StringBuilder. O exemplo a seguir utiliza o AppendFormat mtodo para colocar um valor inteiro formatado como um valor de moeda no final de um StringBuilder. C#
int MyInt = 25; StringBuilder MyStringBuilder = new StringBuilder("Your total is "); MyStringBuilder.AppendFormat("{0:C} ", MyInt); Console.WriteLine(MyStringBuilder);

Este exemplo exibe Your total is $25.00 para o console.

Inserir
O Insert mtodo adiciona uma seqncia ou objeto para uma posio especificada na atual StringBuilder. O exemplo a seguir utiliza esse mtodo para inserir uma palavra na sexta posio de um StringBuilder.

Visual C# Consolidado

468

C#
StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); MyStringBuilder.Insert(6,"Beautiful "); Console.WriteLine(MyStringBuilder);

Este exemplo exibe Hello Beautiful World! para o console.

Remover
Use o Remove mtodo para remover um nmero especificado de caracteres da atual StringBuilder, comeando em um ndice com base zero especificado. O exemplo a seguir utiliza o Remove mtodo para diminuir um StringBuilder. C#
StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); MyStringBuilder.Remove(5,7); Console.WriteLine(MyStringBuilder);

Este exemplo exibe Hello para o console.

Replace
O Replace mtodo pode ser usado para substituir caracteres dentro do StringBuilder objeto com outro caractere especificado. O exemplo a seguir usa o Replace mtodo para localizar um StringBuilder objeto para todas as ocorrncias do caractere ponto de exclamao (!) e substituilos com o caractere ponto de interrogao (?). C#
StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); MyStringBuilder.Replace('!', '?'); Console.WriteLine(MyStringBuilder);

Este exemplo exibe Hello World? para o console. Como Executar Manipulaes sobre Seqncia de Caracteres Usando Operaes Bsicas O exemplo a seguir usa alguns dos mtodos discutidos nos tpicos Bsico operaes String para construir uma classe que executa manipulations de seqncia de uma maneira que pode ser encontrada em um aplicativo do mundo real. A MailToData classe armazena o nome e endereo de uma pessoa em propriedades separadas e fornece uma maneira para combinar o City, State., e Zip campos em uma nica seqncia para exibio para o usurio Alm disso, a classe permite ao usurio para inserir a cidade, estado, e informaes cdigo postal como uma nica seqncia; o aplicativo analisa a seqncia de caracteres nica e insere as informaes adequadas na propriedade correspondente automaticamente. Para simplificar, este exemplo usa um aplicativo de console com uma interface de linha de comando. Exemplo C#
using System; class MainClass { static void Main(string[] args) { MailToData MyData = new MailToData(); Console.Write("Enter Your Name:"); MyData.Name = Console.ReadLine(); Console.Write("Enter Your Address:"); MyData.Address = Console.ReadLine(); Console.Write("Enter Your City, State, and ZIP Code separated by spaces:"); MyData.CityStateZip = Console.ReadLine(); Console.WriteLine("Name: {0}",

Visual C# Consolidado

469

MyData.Name); Console.WriteLine("Address: {0}", MyData.Address); Console.WriteLine("City: {0}", MyData.City); Console.WriteLine("State: {0}", MyData.State); Console.WriteLine("Zip: {0}", MyData.Zip); Console.WriteLine("The following address will be used:"); Console.WriteLine(MyData.Address); Console.WriteLine(MyData.CityStateZip); } } public class MailToData { string name = " "; string address = " "; string citystatezip = " "; string city = " "; string state = " "; string zip = " "; public MailToData() { } public string Name { get{return name;} set{name = value;} } public string Address { get{return address;} set{address = value;} } public string CityStateZip { get { return ReturnCityStateZip(); } set { citystatezip = value; ParseCityStateZip(); } } public string City { get{return city;} set{city = value;} } public string State { get{return state;} set{state = value;} } public string Zip { get{return zip;} set{zip = value;} } private void ParseCityStateZip() { int CityIndex; int StateIndex; // Check for an exception if the user did not enter spaces between // the elements. try { // Find index position of the space between // city and state and assign that value to CityIndex. CityIndex = citystatezip.IndexOf(" "); // Initialize the CityArray to the value of the // index position of the first white space. char[] CityArray = new char[CityIndex]; // Copy the city to the CityArray. citystatezip.CopyTo(0,CityArray ,0, CityIndex); // Find index position of the space between // state and zip and assign that value to CityIndex. StateIndex = citystatezip.LastIndexOf(" "); // Initialize the StateArray to the length of the state. char[] StateArray = new char[StateIndex - CityIndex]; // Copy the state to the StateArray. citystatezip.CopyTo(CityIndex, StateArray, 0, (StateIndex - CityIndex)); // Initialize the ZipArray to the length of the zip. char[] ZipArray = new char[citystatezip.Length - StateIndex]; // Copy the zip to the ZipArray. citystatezip.CopyTo(StateIndex, ZipArray, 0, (citystatezip.Length - StateIndex)); // Assign city to the value of CityArray. city = new String(CityArray); // Trim white spaces, commas, and so on. city = city.Trim(new char[]{' ', ',', ';', '-', ':'}); // Assign state to the value of StateArray. state = new String(StateArray); // Trim white spaces, commas, and so on. state = state.Trim(new char[]{' ', ',', ';', '-', ':'}); // Assign zip to the value of ZipArray. zip = new String(ZipArray); // Trim white spaces, commas, and so on. zip = zip.Trim(new char[]{' ', ',', ';', '-', ':'}); } // If an exception is encountered, alert the user to enter spaces // between the elements. catch(OverflowException) { Console.WriteLine("\n\nYou must enter spaces between elements.\n\n"); } } private string ReturnCityStateZip() { // Make state uppercase. state = state.ToUpper(); // Put the value of city, state, and zip together in the proper manner. string MyCityStateZip = String.Concat(city, ", ", state, " ", zip); return MyCityStateZip; } }

Quando o cdigo anterior executado, o usurio solicitado a digitar sua prpria nome e endereo. O aplicativo coloca as informaes nas propriedades adequadas e exibe as informaes novamente para o usurio, criar uma nica seqncia que exibe a cidade, estado e CEP informaes. Como Converter Tipos de Dados Usando System.Convert A System.Convert classe fornece um conjunto completo de mtodos para converses com suporte. Ele fornece uma maneira idioma neutro para realizar converses e est disponvel para todos os idiomas que direcionar o Common Language Runtime. Enquanto idiomas diferentes podem ter tcnicas diferentes para converter tipos de dados, a Convert classe assegura que todas as converses comuns sero disponveis em um formato genrico. Esta classe executa converses restrio, bem como converses para tipos de dados no relacionadas. Por exemplo, converses de String tipos para tipos numricos, DateTime Tipos a String tipos, e String Tipos para Boolean tipos tm suporte. Do lista de mtodos para obter uma lista de converses disponveis, consulte na classe Convert. A Convert classe executa converses verificados e sempre gera uma exceo se no houver suporte para a converso. A exceo geralmente um OverflowException. Para obter uma lista de converses com suporte, consulte o Digite tabelas de converso.

Visual C# Consolidado

470

Voc pode passar o valor que voc deseja para converter em um dos mtodos apropriados na classe Convert e inicializar o valor retornado para uma nova varivel. Por exemplo, o cdigo a seguir usa a Convert classe para transformar um String valor em um Boolean valor. Exemplo C#
string MyString = "true"; bool MyBool = Convert.ToBoolean(MyString); // MyBool has the value of True.

A Convert classe tambm til se voc tiver uma seqncia que voc deseja converter em um valor numrico. O exemplo de cdigo a seguir converte uma seqncia de caracteres que contm caracteres numricos em um Int32 valor. C#
string newString = "123456789"; int MyInt = Convert.ToInt32(newString); // MyInt has the value of 123456789.

A Convert classe tambm pode ser usada para uma converso restrio que no pode ser executada implicitamente em voc estiver usando o idioma especfico. O exemplo de cdigo a seguir mostra uma converso de restrio em uma menor Int32 utilizando o Convert.ToInt32 Mtodo. um Int64 C#
Int64 MyInt64 = 123456789; int MyInt = Convert.ToInt32(MyInt64); // MyInt has the value of 123456789.

s vezes, executar uma converso restrio com as Convert alteraes de classe o valor do item est sendo convertido. O seguinte cdigo exemplo converte em um Int32 valor. um Double Nesse caso, o valor arredondado de 42.72 para 43 para concluir a converso. C#
Double MyDouble = 42.72; int MyInt = Convert.ToInt32(MyDouble); // MyInt has the value of 43.

Como Remover Caracteres Invlido de uma Seqncia de Caracteres O exemplo de cdigo a seguir usa o mtodo esttico Regex.Replace para tirar de uma seqncia caracteres invlidos. Voc pode usar o CleanInput mtodo definido aqui para retirar potencialmente prejudiciais caracteres que tiver sido inseridos em um campo Texto em um formulrio que aceita entrada do usurio. Retorna CleanInput uma seqncia aps stripping fora todos os caracteres exceto nonalphanumeric @, - (um trao), e. (um perodo). Exemplo C#
String CleanInput(string strIn) { // Replace invalid characters with empty strings. return Regex.Replace(strIn, @"[^\w\.@-]", ""); }

Como Verificar se Seqncias de Caracteres Esto em um Formato de Email Vlido O exemplo de cdigo a seguir usa o mtodo esttico Regex.IsMatch para verificar se uma seqncia est no formato de email vlido. O IsValidEmail mtodo retorna true Se a seqncia contm um endereo de email vlido e false se ele no estiver, mas leva nenhuma outra ao. Voc pode usar IsValidEmail Para filtrar sem endereos de email que contm caracteres invlidos

Visual C# Consolidado

471

antes o aplicativo armazena os endereos em um banco de dados ou exibe-os em uma pgina ASP.NET. Exemplo C#
bool IsValidEmail(string strIn) { // Return true if strIn is in valid e-mail format. return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"); }

Colees e Estruturas de Dados


Dados intimamente relacionados podem ser manuseados com mais eficincia Quando agrupadas juntas para uma coleo. Em vez de escrever cdigo separado para manipular cada objeto individual, voc pode usar o mesmo cdigo para processar todos os elementos de uma coleo. Para gerenciar uma coleo, a Array classe e as System.Collections classes so usadas para adicionar, remover e modificar a elementos individuais da coleo ou um intervalo de elementos. Uma coleo inteira ainda pode ser copiada para outra coleo. Algumas Collections Classes tero Recursos, classificao e a maioria so indexadas. Gerenciamento de memria tratado automaticamente, e a capacidade de uma coleo expandida conforme necessrio. Sincronizao fornece segurana do segmento ao acessar membros da coleo. Algumas Collections classes podem gerar wrappers que tornam a coleo somente leitura ou de tamanho fixo. Qualquer Collections classe pode gerar seu prprio enumerador que torna fcil a percorrer os elementos. No.NET Framework verso 2.0, a coleo genrica classes Fornecer nova funcionalidade e facilitar para criar conjuntos de tipo forte. Do System.Collections.Generic Consulte e System.Collections.ObjectModel espaos de nome.

Definir colees
Uma coleo um conjunto de objetos que so agrupados da mesma forma digitados. Objetos de qualquer tipo podem ser agrupados em uma nica coleo do tipo Object para tirar proveito dos construes que so inerentes no mesmo idioma. Por exemplo, a instruo C# foreach (for each. no Visual Basic) espera todos os objetos na coleo para ser de um nico tipo No entanto, em uma coleo de tipo Object, processamento adicional feito nos elementos individualmente, como boxing e unboxing ou converses, que afetam o desempenho da coleo. Boxing e unboxing geralmente ocorrem se armazenar ou recuperar um tipo de valor em uma coleo de tipo Object. Genricas colees, como List, e altamente digitadas colees nongeneric, como StringCollection, evitar esses acertos de desempenho se o tipo de elemento o tipo que a coleo destinada a (por exemplo, armazenar ou recuperar seqncias de.) um StringCollection Alm disso, conjuntos de tipo forte executar automaticamente validao Tipo de cada elemento adicionado coleo. Todas as colees que direta ou indiretamente implementam a ICollection interface ou a ICollection interface genrico compartilhar vrios recursos, alm de mtodos que adicionar, remover, ou procurar elementos:

Visual C# Consolidado

472

Um enumerador. Um enumerador um objeto que itera atravs de sua coleo associada. Ele pode ser considerado de um ponteiro mvel para qualquer elemento na coleo. Um enumerador pode ser associado a uma coleo, mas um conjunto pode ter vrios enumeradores. A instruo C# foreach (for each. no Visual Basic) usa o enumerador e oculta a complexidade da manipulao o enumerador

Membros de sincronizao. Sincronizao fornece segurana do segmento ao acessar elementos da coleo. As colees so no segmento seguro por padro. Apenas classes de alguns em espaos para nome System.Collections fornecem um Synchronize mtodo que cria um wrapper isenta de segmentos atravs da coleo. No entanto, todas as classes em todos os System.Collections espaos fornecem uma SyncRoot propriedade que pode ser usada para criar seus prprios wrapper isenta de segmentos por classes derivadas. Uma IsSynchronized propriedade tambm fornecida para determinar se a coleo segmento seguro. Sincronizao no est disponvel na interface ICollection genrico.

The CopyTo method. Todas as colees podem ser copiadas para uma matriz usando o CopyTo mtodo; no entanto, a ordem dos elementos na matriz novo est baseado a seqncia em que o enumerador retorna-los. A matriz resultante sempre unidimensional com um limite inferior de zero.

Observe que a ICollection interface genrica tem membros adicionais que no inclui a interface nongeneric. Os seguintes recursos so implementados em algumas classes em espaos para nome System.Collections:

Capacidade e Contagem. A capacidade de uma coleo o nmero de elementos ele pode conter. A contagem de uma coleo o nmero de elementos ele realmente contm. A BitArray um caso especial; sua capacidade o mesmo que seu comprimento, que o mesmo que a contagem. Algumas colees ocultar a capacidade, a contagem ou ambos. Automaticamente todas as colees na System.Collections espaos expanda na capacidade quando a capacidade atual alcanada. A memria realocada, e os elementos so copiados da coleo antiga para a nova OU. Isso reduz o cdigo necessrio para usar a coleo; entretanto, o desempenho da coleo pode ainda ser afetado negativamente. A melhor maneira de evitar desempenho deficiente causado por vrios realocaes para definir a capacidade inicial a ser o tamanho estimado da coleo.

Bound LOWER. O limite inferior de uma coleo o ndice de seu primeiro elemento. Todas as colees indexadas na System.Collections espaos tm um limite inferior de zero. tem Array um limite inferior de zero por padro, mas um limite inferior diferente pode ser definido ao criar uma instncia da Array classe usando CreateInstance.

classes System.Collections geralmente podem ser categorizados em trs tipos:

Normalmente usados colees. Estas so as variaes comuns de coletas de dados, como tabelas hash, filas, pilhas, dicionrios, e listas. Colees comumente usadas ter verses genricos e verses nongeneric.

Bit colees.

Visual C# Consolidado

473

Esses so colees cujos elementos so sinalizadores de bit. Se eles comportar de maneira ligeiramente diferente das outras colees.

Especializado colees. Esses so colees com finalidades, geralmente para lidar com um tipo especfico de elemento, como StringDictionary altamente especficas.

Certifique-se de escolher uma classe coleo cuidadosamente. Como cada coleo tem seu prprio funcionalidade, cada tambm possui seu prprio limitaes. O mais especializada uma coleo , quanto mais limitado ele . Para obter dicas sobre como escolher uma coleo, consulte Selecionar uma Classe de coleo.

Comumente usados tipos da coleo


Tipos de coleo so as variaes comuns de coletas de dados, como tabelas hash, filas, pilhas, dicionrios, e listas. Colees so baseadas na ICollection interface, a IList Interface, interface IDictionary, ou suas contrapartes genricos. A IList interface e a IDictionary interface ambos so derivados a partir da ICollection interface; portanto, todas as colees so baseadas na ICollection interface seja direta ou indiretamente. Nas colees com base na interface IList (.,)) ou diretamente na interface ICollection, cada elemento contm apenas um valor, como Array, ArrayList ou List, como Queue, Stack ou LinkedList (, Nas colees com base na interface IDictionary a Hashtable. e SortedList Classes genricos), cada elemento contm uma chave e um valor, como (e SortedList classes, ou o Dictionary A KeyedCollection classe exclusiva porque uma lista de valores com chaves incorporadas nos valores, e, portanto, ele funciona como uma lista e como um dicionrio. Colees genricas so a melhor soluo para forte digitando. Entretanto, se o idioma no oferece suporte generics, espao para nome System.Collections inclui colees, base, como CollectionBase, ReadOnlyCollectionBase,. e DictionaryBase, quais so classes base abstratas que podem ser estendidos para criar classes coleo que esto digitados altamente Colees podem variar, dependendo em como os elementos so armazenados, como eles so classificados, como pesquisas so executadas, e como comparaes so feitas. A Queue classe e a Queue classe genrica fornecem listas primeiro First-In--Out, enquanto a Stack classe e a Stack classe fornecem listas ltima in primeiro-fora. A SortedList classe e a SortedList classe genrica fornecem classificadas verses de classe Hashtable e a Dictionary classe genrica. Os elementos de uma Hashtable ou uma Dictionary so acessveis somente para a chave do elemento, mas os elementos de uma SortedList ou uma KeyedCollection so acessveis, seja atravs da tecla ou pelo ndice do elemento. Os ndices em todas as colees so base zero, exceto Array, que permite matrizes que so base no zero.

Colees de bits
Colees bits so colees cujos elementos so sinalizadores de bit. Ter porque cada elemento um pouco em vez de um objeto, essas colees comportamento um pouco diferente das outras colees. A BitArray classe uma classe coleo na qual a capacidade sempre o mesmo que a contagem. Elementos so adicionados ao aumentando a Length propriedade; elementos so excludos diminuindo a Length propriedade. um BitArray A BitArray classe oferece mtodos que no so encontrados em outras colees, incluindo aqueles que permitem vrios elementos a ser modificado usando um filtro, como And, Or uma vez, Xor., Not e SetAll

Visual C# Consolidado

474

A BitVector32 classe uma estrutura que oferece a mesma funcionalidade como BitArray, mas com desempenho mais rpido. BitVector32 mais rpido porque um tipo de valor e portanto alocados na pilha, enquanto BitArray um tipo de referncia e, portanto, alocado na pilha. Pode BitVector32 Armazenar exatamente 32 bits, enquanto BitArray pode armazenar um nmero de bits varivel. Armazena BitVector32 os sinalizadores de bit e pequenos nmeros inteiros, tornando assim ideal para dados que no seja expostos para o usurio. No entanto, se o nmero de sinalizadores de bit necessrio desconhecido, varivel, ou maior que 32, use BitArray. BitArray no espao para nome System.Collections; BitVector32 no espao para nome System.Collections.Specialized.

Colees especializados
Colees especializadas so colees com finalidades altamente especficas. NameValueCollection baseado no NameObjectCollectionBase; No entanto, NameValueCollection aceita vrios valores por chave, enquanto NameObjectCollectionBase aceita apenas um valor por chave. Algumas colees altamente digitadas no espao para nome System.Collections.Specialized so StringCollection e StringDictionary, ambos os quais contm valores que so seqncias exclusivamente. A CollectionsUtil classe cria instncias de colees no diferencia maisculas de minsculas. Algumas colees transformar. Por exemplo, a HybridDictionary classe inicia como se tornar grande. e se torna um Hashtable quando um ListDictionary O KeyedCollection uma lista mas ela tambm cria um dicionrio de pesquisa quando o nmero de elementos atinge um limite especificado.

Criando e Manipulating colees


As colees mais comuns so fornecidas pelo .NET Framework. Voc pode usar qualquer uma das-los ou criar sua prprias coleo com base em um deles. Cada coleo foi projetada para finalidades especficas. Os membros includos no cada System.Collections Classe refletem o objetivo da coleo. Alm disso, as colees genricas no System.Collections.Generic tornam mais fcil para criar conjuntos de tipo forte. Se voc optar por implementar seu prprio coleo, use as seguintes diretrizes:

Inicie com a classe base direita e interfaces. Consulte Selecionar uma Classe de coleo Para obter dicas sobre como escolher um tipo de coleo. Considere a possibilidade de fazer sua coleo altamente digitada. Conjuntos de tipo forte fornece validao tipo automtica e evitar processos que afetam negativamente o desempenho, como boxing e unboxing e converses. Se o idioma suporta generics, use um dos tipos System.Collections.Generic. Se o idioma no oferece suporte generics, System.Collections.Specialized contm exemplos de colees de tipo forte. Considere fornecer sincronizao em sua classe. Consulte Colees e sincronizao (segurana do segmento) Para obter detalhes. Considerar a ativao de serializao para sua classe. Consulte Conceitos de serializao Para obter detalhes.

Visual C# Consolidado

475

Selecionando uma Classe de Coleo


Certifique-se Escolha sua System.Collections Classe cuidadosamente. Usando o tipo errado pode restringir o uso da coleo. Considere as seguintes questes:
o

Voc precisa uma lista seqencial onde o elemento normalmente ser descartado aps seu valor recuperado? Caso afirmativo, considere o uso da Queue classe ou a Queue classe genrica se voc precisar comportamento (FIFO) primeiro First-In--fora. Considere o uso da Stack classe ou a Stack classe genrica se voc precisar comportamento (LIFO) ltima in primeiro-Out. Caso contrrio, considere usar as outras colees. Voc precisa acessar os elementos em uma determinada ordem, tais como FIFO, LIFO, ou aleatrios? A Queue classe e a Queue classe genrica oferece acesso fifo. A Stack classe e a Stack classe genrica oferece acesso LIFO. A LinkedList classe genrico permite acesso seqencial originados do topo para o final ou o final para a cabea de. O restante das colees oferecem acesso aleatrio. Voc precisa acessar cada elemento pelo ndice? O ArrayList e StringCollection Classes e a List classe genrica oferecem acesso a seus elementos pelo ndice baseado em zero do elemento. O Hashtable, SortedList e SortedDictionary Classes genricos oferecem acesso a seus elementos pela chave do elemento., ListDictionary e StringDictionary classes, e o Dictionary O NameObjectCollectionBase e SortedList Classes genricos oferecem acesso a seus elementos por um o ndice baseado em zero ou a chave do elemento. e NameValueCollection classes, e o KeyedCollection Cada elemento ir conter um valor, uma combinao de uma chave e um valor, ou uma combinao de uma chave e vrios valores? Um valor: usar qualquer um das colees com base na IList interface ou a IList interface genrica. Uma chave e um valor: usar qualquer um das colees com base na IDictionary interface ou a IDictionary interface genrica. Um valor com chave incorporado: usar a KeyedCollection classe genrica. Uma chave e vrios valores: usar a NameValueCollection classe. Voc precisa classificar os elementos de forma diferente de como eles foram inseridos? A Hashtable classe classifica seus elementos por seus cdigos hash. A SortedList classe com base em implementaes de interface IComparer e a IComparer interface genrica. e SortedDictionary e SortedList Classes genricos classificar seus elementos atravs da tecla, Fornece ArrayList um Sort mtodo que leva uma IComparer Implementao como um parmetro. Sua contraparte genrico, a List classe genrica, fornece um Sort mtodo que leva uma implementao da interface IComparer como um parmetro genrico. Voc precisa pesquisas rpidas e recuperao de informaes?

o o o o o o o

o o o o o o

Visual C# Consolidado

476

ListDictionary mais rpido do que Hashtable para colees pequenos (10 itens ou menos). A SortedDictionary classe genrico oferece pesquisa mais rpida que a Dictionary classe genrica. Voc precisa colees que aceitam somente seqncias? (StringCollection). com base em IList e StringDictionary (com base em IDictionary) esto no espao para nome System.Collections.Specialized Alm disso, voc pode usar qualquer uma das classes a coleo genrica no espao para nome System.Collections.Generic como colees de seqncia de tipo forte, especificando a String classe para seus argumentos tipo genrico.

o o

Enumerar uma coleo


O.NET Framework fornece enumeradores como uma maneira fcil para iterar atravs de um conjunto. Enumeradores somente ler dados na coleo; eles no podem ser usados para modificar a coleo subjacente. Alguns idiomas fornecem uma instruo que oculta a complexidade da usando enumeradores diretamente. A instruo C# foreach, a instruo C++ for each, e a instruo For Each Visual Basic usam enumeradores. Sobre Enumerators Um enumerador flattens uma coleo para que os membros podem ser acessados seqencialmente. Coleo diferentes classes podem ter diferentes seqncias. Por exemplo, um enumerador para um ArrayList preserva um enumerador para um Hashtable exibe os elementos acordo para o cdigo hash do elemento a ordem na qual os elementos so inseridos da coleo, enquanto. Cada enumerador baseado na IEnumerator interface ou a IEnumerator interface genrica, que requer os seguintes membros:

A Current propriedade aponta para o membro atual na coleo. A MoveNext propriedade move o enumerador para o prximo membro na coleo. A Reset propriedade move o enumerador volta para o incio da coleo. Current posicionado antes do primeiro elemento. No est Reset disponvel na interface genrico IEnumerator.

Comportamento de um enumerador Inicialmente, o Enumerador est posicionado antes do primeiro elemento na coleo. Tambm Reset traz o enumerador para essa posio. Nesta posio, Current indefinido. Portanto, voc deve chamar MoveNext para avanar o enumerador para o primeiro elemento da coleo antes de ler o valor da Current. Retorna Current o mesmo objeto at MoveNext ou Reset chamado. Define MoveNextCurrent Como o elemento seguinte. Se MoveNext passagens final da coleo, o Enumerador est posicionado aps o ltimo elemento na coleo e MoveNext retorna false. Quando o enumerador est nesta posio, para MoveNext tambm retornar false chamadas subseqentes. Se a ltima chamada para MoveNext retornado false, Current indefinido. Em colees Generic no-, voc pode chamar Reset seguido por MoveNext para mover o enumerador volta para o incio da coleo.

Visual C# Consolidado

477

Em genricas colees, voc no pode definir Current para o primeiro elemento da coleo novamente; voc deve criar uma nova instncia de enumerador em vez disso. Um enumerador permanece vlida, desde que a coleo permanece inalterada. Se as alteraes forem feitas para a coleo,, como adicionar, modificar ou excluir elementos, o enumerador irrecoverably invalidated e seu comportamento indefinido. O enumerador no no ter acesso exclusivo coleo; portanto, enumerando atravs de um conjunto um procedimento seguro do segmento intrinsically no. Para garantir segurana do segmento durante enumerao, voc pode bloquear a coleo durante toda a enumerao. Para permitir que a coleo para ser acessado por vrios segmentos para leitura e gravao, voc dever implementar sua prprias sincronizao.

Colees e sincronizao (segurana do segmento)


Por padro, classes no System.Collections e espaos para nome relacionados so no segmento seguro. Vrios leitores podem ler a coleo com confiana; no entanto, qualquer modificao para a coleo produz resultados para todos os segmentos que acessar a coleo, incluindo os segmentos de leitor indefinidos. classes System.Collections podem ser feitas segmento seguro usando qualquer um dos seguintes mtodos:

Criar um invlucro isenta de segmentos usando o Synchronized mtodo, e acessar a coleo exclusivamente a esse wrapper. Se a classe no no tiver um Synchronized mtodo, derivar de classe e implementar um Synchronized mtodo usando a SyncRoot propriedade. Usam um mecanismo de bloqueio, como a lock instruo no C# (SyncLock. no Visual Basic, a Monitor classe em C++), sobre a SyncRoot propriedade ao acessar a coleo

Ao implementar o Synchronized mtodo, classes derivadas devem substituir a IsReadOnly propriedade para retornar o valor correto. A Array classe no inclui um Synchronized mtodo e, embora ele possui uma SyncRoot propriedade, a classe no pode ser derivada de. Portanto, uma matriz pode ser feita segmento seguro somente atravs do mecanismo de bloqueio. Classes a coleo genrica no incluir membros de sincronizao; no entanto, alguns genrica classes, como Collection, Dictionary,. explicitamente implementar membros de sincronizao herdados da interface nongeneric ICollection e List,

Comparaes e classifica em colees


As System.Collections Classes realizar comparaes em quase todos os processos envolvidos no gerenciamento colees, se procurar o elemento para remover ou retornando o valor de um par e chave-valor-. Dois construes so usadas para comparaes. O Equals mtodo, herdadas ou derivados Object, simplesmente Retorna um Boolean para indicar se dois objetos so iguais. O IComparable.CompareTo mtodo e o IComparer.Compare mtodo retornar um nmero inteiro que indica como os dois valores comparam em relao uns aos outros. Equals usado para verificaes de igualdade; e System.IComparable.CompareTo( mtodos, so usados para classificar. e System.Collections.IComparer.Compare(System.Object,System.Object) mtodos e

Visual C# Consolidado

478

suas contrapartes nas interfaces genricos, o System.IComparable.CompareTo(System.Object) a System.Collections.Generic.IComparer.Compare( As comparaes podem ser entre elementos da coleo, ou entre um elemento e um valor especificado. Quando no explicitamente comparers so especificados, pelo menos um dos objetos sendo comparadas esperado para implementar a IComparable interface e ser capaz de comparar prprio com o outro objeto. Algumas classes possuem mtodos que aceitam uma IComparer Implementao como um parmetro. Quando esses mtodos so usados e o IComparer parmetro no uma referncia nula (Nothing. no Visual Basic), os objetos esto sendo comparados no so necessrios para implementar IComparable prprios No entanto, ele sempre uma boa prtica para implementar IComparable Em todas as classes que podem ser usados como valores em uma coleo de lista ou chaves em uma coleo do dicionrio. Alguns overloads de construtor para colees do dicionrio aceitar uma IComparer implementao, que usada para comparar chaves sempre que comparaes so necessrias. tem Array overloads de seu Sort mtodo que aceitam uma IComparer implementao, que usada somente para essa chamada especfica para o Sort mtodo. A configurao de cultura atual do sistema pode afetar o comparaes e classifica dentro de uma coleo. Por padro, comparaes e classifica nas Collections classes so confidenciais culture-. Para ignorar a configurao de cultura e portanto obter comparao consistente e classificar resultados, use o InvariantCulture. com overloads membro que aceitam uma CultureInfo Para obter mais informaes, consulte Executar operaes String Insensitive Culture-em colees e Executar operaes String Insensitive Culture-em matrizes.

Quando Usar Colees Genricas


Geralmente usar colees genricas recomendvel, pois voc ganha a vantagem imediata de segurana de tipo sem precisar fazer derivar de um tipo de coleo base e implementar membros especficos do tipo. Alm disso, tipos a coleo genrica geralmente executar melhor que os tipos coleo nongeneric correspondentes (e melhor que tipos derivados de tipos nongeneric coleo Base).. quando os elementos da coleo so tipos valor, porque com generics no existe h necessidade de caixa os elementos Os seguintes tipos genricos correspondem aos tipos de coleo existente:

List a classe genrica correspondente a ArrayList. Dictionary a classe genrica correspondente a Hashtable. Collection a classe genrica correspondente a CollectionBase. Pode Collection Ser usada como uma classe base, mas diferentemente CollectionBase ele no abstrato, tornando ainda mais fcil para usar. ReadOnlyCollection a classe genrica correspondente a ReadOnlyCollectionBase. ReadOnlyCollection No abstrata, e tem um construtor que facilita para expor um existente List como uma coleo somente leitura. O StackQueue,. e SortedList Classes genricos correspondem para as classes nongeneric respectivos com os mesmos nomes

Tipos adicionais Existem vrios tipos a coleo genrica que no tm contrapartes nongeneric:

Visual C# Consolidado

479

LinkedList uma lista vinculada de propsito geral que fornece operaes de insero e remoo O(1). SortedDictionary um dicionrio classificado com O (log n) operaes de insero e recuperao, tornando-uma alternativa til para SortedList. KeyedCollection um hbrido entre uma lista e um dicionrio, que fornece uma maneira para armazenar objetos que contm suas prprias chaves.

Funcionalidade adicional Alguns dos tipos genricos tm funcionalidade no encontrada na coleo nongeneric os tipos. Por exemplo, a List classe, que corresponde da classe nongeneric ArrayList, tem um nmero de mtodos que aceitam representantes genricas, como o Predicate representante que permite que voc se especificar mtodos de pesquisa a lista, o Action representante que representa mtodos que atuam sobre cada elemento da lista, e o Converter representante que permite que voc definir converses entre tipos. A List classe permite-lhe especificar suas prprias IComparer implementaes interface genrica para classificao e pesquisa a lista. O SortedDictionary e SortedList classes tambm possui esse recurso, e em disso permitem os comparers deve ser especificado quando a coleo criada. Do Dictionary de maneira semelhante, e KeyedCollection classes permitem que voc para especificar suas prprias comparers de igualdade.

Classe genrica List


Representa uma lista de objetos que podem ser acessados pelo ndice altamente digitada. Oferece mtodos para pesquisar, classificar e manipular listas. Namespace: System.Collections.Generic Assembly: mscorlib (em mscorlib.dll) Sintaxe C#
[SerializableAttribute] public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable

Parmetros de tipo T O tipo de elementos em Da lista. Comentrios A List classe o equivalente da classe ArrayList genrico. Ele implementa a IList interface genrica usando uma matriz cujo tamanho aumentado dinamicamente conforme necessrio. A List classe usa uma comparer de igualdade e um comparer pedido.

Mtodos, como Contains, IndexOf e Remove Usar um comparer de igualdade para os elementos Lista., LastIndexOf O comparer de igualdade padro para tipo T determinada da seguinte maneira. Se tipo T implementa a IEquatable interface genrica, ento o comparer de igualdade o Equals mtodo de interface; caso contrrio, o comparer de igualdade padro Object.Equals(Object).

Visual C# Consolidado

480

Mtodos, como BinarySearch e Sort use um comparer pedido para os elementos lista. O comparer padro para tipo T determinada da seguinte maneira. Se tipo T implementa a IComparable interface genrica, ento o comparer padro o CompareTo mtodo de interface; caso contrrio, se tipo T implementa a interface nongeneric IComparable, ento o comparer padro o CompareTo mtodo de interface. Se tipo T implementa nenhuma interface, ento no h nenhum comparer padro, e um representante comparer ou comparao deve ser fornecido explicitamente.

O List no garantida a serem classificados. Voc deve classificar a serem classificados. antes de executar operaes (como BinarySearch) que exigem o List o List Elementos nessa coleo podem ser acessados usando um ndice inteiro. ndices nessa coleo so baseada em zero. Aceita Lista null reference (Nothing in Visual Basic) como um valor vlido para tipos de referncia e permite elementos duplicados. Consideraes sobre desempenho A decidir se deseja usar ou ArrayList Classe, ambos os quais tm semelhante funcionalidade, lembrar que a List classe efetua melhor na maioria dos casos e tipo seguro.. o List Se um tipo de referncia for usado para tipo T de classe List, o comportamento das duas classes idntico. No entanto, se um tipo de valor for usado para tipo T, voc precisar considerar implementao e questes boxing. Se um tipo de valor for utilizado para tipo T, o compilador gera uma implementao da classe List especificamente para esse tipo de valor. Isso significa um elemento um lista de um List objeto no tenha que ser Boxed antes do elemento pode ser usado, e Aps cerca de 500 elementos de lista so criados a memria economizada elementos lista boxing no maior que a memria usada para gerar a implementao de classe. Certifique-se o tipo de valor usado para tipo T implementa a IEquatable interface genrico. Caso contrrio, mtodos, como Contains deve chamar o Object.Equals(Object) mtodo, que caixas o elemento lista afetado. Do BinarySearch se o tipo de valor implementa a IComparable interface e voc possuir o cdigo de fonte tambm implementam a IComparable interface genrica para evitar e Sort mtodos de boxing elementos de lista. Se voc no possui cdigo-fonte, passar um IComparer objeto para o BinarySearch e Sort mtodos Ele para sua vantagem em usar a implementao especficos do tipo de classe List em vez de atravs da ArrayList classe ou escrever um conjunto wrapper altamente digitado mesmo. A razo sua implementao deve fazer que o .NET Framework faz por voc j, e o Common Language Runtime pode compartilhar cdigo linguagem intermediria Microsoft e metadados, que no pode sua implementao. Exemplo O exemplo de cdigo a seguir demonstra vrias propriedades e mtodos da classe List genrico. O construtor padro usado para criar uma lista de seqncias com uma capacidade de 0. A Capacity propriedade exibida e depois o Add mtodo usado para adicionar vrios itens. Os itens so listados, e a Capacity propriedade ser exibida novamente, juntamente com a Count propriedade, para mostrar que a capacidade foi aumentou conforme necessrio. O Contains mtodo usado para testar a presena de um item na lista, o Insert mtodo usado para inserir um novo item no meio da lista, e o contedo da lista so exibidos novamente.

Visual C# Consolidado

481

A propriedade padro Item (o indexador em C#) usada para recuperar um item, o Remove mtodo usado para remover a primeira instncia de adicionada anteriormente, o item duplicado e o contedo ser exibido novamente. O Remove mtodo Sempre remove a primeira instncia encontrar. O TrimExcess mtodo usado para reduzir a capacidade para corresponder a contagem, e Capacity. e Count propriedades so exibidas Se a capacidade no utilizada tinha sido menos de 10 % da capacidade total, a lista no seria foram redimensionada. Finalmente, o Clear mtodo usado para remover todos os itens da lista, e Capacity. e Count propriedades so exibidas C#
using System; using System.Collections.Generic; public class Example { public static void Main() { List<string> dinosaurs = new List<string>(); Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity); dinosaurs.Add("Tyrannosaurus"); dinosaurs.Add("Amargasaurus"); dinosaurs.Add("Mamenchisaurus"); dinosaurs.Add("Deinonychus"); dinosaurs.Add("Compsognathus"); Console.WriteLine(); foreach(string dinosaur in dinosaurs) { Console.WriteLine(dinosaur); } Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity); Console.WriteLine("Count: {0}", dinosaurs.Count); Console.WriteLine("\nContains(\"Deinonychus\"): {0}", dinosaurs.Contains("Deinonychus")); Console.WriteLine("\nInsert(2, \"Compsognathus\")"); dinosaurs.Insert(2, "Compsognathus"); Console.WriteLine(); foreach(string dinosaur in dinosaurs) { Console.WriteLine(dinosaur); } Console.WriteLine("\ndinosaurs[3]: {0}", dinosaurs[3]); Console.WriteLine("\nRemove(\"Compsognathus\")"); dinosaurs.Remove("Compsognathus"); Console.WriteLine(); foreach(string dinosaur in dinosaurs) { Console.WriteLine(dinosaur); } dinosaurs.TrimExcess(); Console.WriteLine("\nTrimExcess()"); Console.WriteLine("Capacity: {0}", dinosaurs.Capacity); Console.WriteLine("Count: {0}", dinosaurs.Count); dinosaurs.Clear(); Console.WriteLine("\nClear()"); Console.WriteLine("Capacity: {0}", dinosaurs.Capacity); Console.WriteLine("Count: {0}", dinosaurs.Count); } } /* This code example produces the following output: Capacity: 0 Tyrannosaurus Amargasaurus Mamenchisaurus Deinonychus Compsognathus Capacity: 8 Count: 5 Contains("Deinonychus"): True Insert(2, "Compsognathus") Tyrannosaurus Amargasaurus Compsognathus Mamenchisaurus Deinonychus Compsognathus dinosaurs[3]: Mamenchisaurus Remove("Compsognathus") Tyrannosaurus Amargasaurus Mamenchisaurus Deinonychus Compsognathus TrimExcess() Capacity: 5 Count: 5 Clear() Capacity: 5 Count: 0 */

Hierarquia de herana System.Object System.Collections.Generic.List Segurana de segmentos Esttico pblico (Shared. no Visual Basic) os membros do tipo so segmento seguro Os membros da instncia no so garantidos para ser segmento seguro. Suporte vrios leitores simultaneamente,, desde que a coleo no modificada A List. Enumerando atravs de um conjunto intrinsically no um procedimento isenta de segmentos. No caso raro onde uma enumerao contends com um ou mais acessos de gravao, a nica maneira para garantir segurana do segmento para bloquear a coleo durante toda a enumerao. Para permitir que a coleo para ser acessado por vrios segmentos para leitura e gravao, voc dever implementar sua prprias sincronizao.

Visual C# Consolidado

482

Plataformas Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition O .NET Framework no d suporte a todas as verses de cada plataforma. Para obter uma lista das verses com suporte, consulte Requisitos do sistema. Informaes de verso .NET Framework Compatvel com: 2.0 .NET Compact Framework Compatvel com: 2.0

Classe genrica SortedDictionary


Representa uma coleo de pares chave / valor que so classificadas na chave. Namespace: System.Collections.Generic Assembly: System (em system.dll) Sintaxe C#
[SerializableAttribute] public class SortedDictionary<TKey,TValue> : IDictionary<TKey,TValue>, ICollection<KeyValuePair<TKey,TValue>>, IEnumerable<KeyValuePair<TKey,TValue>>, IDictionary, ICollection, IEnumerable

Parmetros de tipo TKey O tipo das teclas no dicionrio. TValue O tipo dos valores no dicionrio. Comentrios A SortedDictionary classe genrico uma rvore da pesquisa binrio com recuperao O (log n), onde n o nmero de elementos no dicionrio. Neste aspecto, ele semelhante para a SortedList classe genrico. As duas classes tm modelos de objeto semelhantes, e ambas tm O (log n) recuperao. Onde as duas classes diferem est em uso de memria e velocidade de insero e remoo:

Usa SortedList menos memria que SortedDictionary. oferece SortedDictionary mais rpidas operaes de insero e remoo para dados no classificados:. (n O log n) (em oposio ao para SortedList)

Visual C# Consolidado

483

Se a lista estiver preenchida todos de uma vez dos dados SortedList classificados mais rpida que SortedDictionary.

Cada par chave / valor pode ser recuperado como uma KeyValuePair estrutura, ou atravs da interface nongeneric IDictionary. um DictionaryEntry As chaves devem ser imutveis, desde que eles so usados como chaves no SortedDictionary.. o SortedDictionary Cada chave em um SortedDictionary deve ser exclusivo. Uma chave no pode ser a null reference (Nothing in Visual Basic), mas um valor pode ser, se o tipo TValue de valor um tipo de referncia. Requer SortedDictionary uma implementao comparer para realizar comparaes de chave. Voc pode especificar uma implementao da interface IComparer genrica, utilizando um construtor que aceita um comparer parmetro; se voc no especificar uma implementao, o comparer Comparer.Default genrico padro usada. Se tipo TKey implementa a System.IComparable interface genrico, o comparer padro usa essa implementao. A foreach instruo da linguagem C# (for each. em C++, For Each no Visual Basic) requer o tipo de cada elemento na coleo Desde cada elemento do tipo elemento no o tipo da chave ou o tipo do valor. um par chave / valor, o SortedDictionary Em vez disso, o tipo de elemento KeyValuePair. O cdigo a seguir mostra sintaxe C#, C++ e Visual Basic. C#
foreach (KeyValuePair<int, string> kvp in myDictionary) {...}

A foreach instruo um invlucro em torno o enumerador, que permite somente leitura a partir da coleo, no gravar para ele. Exemplo O exemplo de cdigo a seguir cria um vazio SortedDictionary de seqncias com chaves de seqncia e usa o Add mtodo para adicionar alguns elementos. O exemplo demonstra que o Add mtodo gera um ArgumentException quando tentativa de adicionar uma chave duplicada. O exemplo usa a Item propriedade (o indexador em C#) para recuperar valores, demonstrando que acionada quando uma chave solicitado no existir, e mostra que o valor associado a uma chave pode ser substituda. um KeyNotFoundException O exemplo mostra como usar o TryGetValue mtodo como uma forma mais eficiente para recuperar valores se um programa com freqncia deve tentar valores chave que no esto no dicionrio, e ele mostra como usar o ContainsKey mtodo para testar se uma chave existe antes de chamar o Add mtodo. O exemplo mostra como para enumerar as chaves e valores em um dicionrio e como enumerar as chaves e valores sozinho usando a Keys propriedade e a Values propriedade. Finalmente, o exemplo demonstra o Remove mtodo. C#
using System; using System.Collections.Generic; public class Example { public static void Main() { // Create a new dictionary of strings, with string keys. // Dictionary<string, string> openWith = new Dictionary<string, string>(); // Add some elements to the dictionary. There are no // duplicate keys, but some of the values are duplicates. openWith.Add("txt", "notepad.exe"); openWith.Add("bmp", "paint.exe"); openWith.Add("dib", "paint.exe"); openWith.Add("rtf", "wordpad.exe"); // The Add method throws an

Visual C# Consolidado

484

exception if the new key is // already in the dictionary. try { openWith.Add("txt", "winword.exe"); } catch (ArgumentException) { Console.WriteLine("An element with Key = \"txt\" already exists."); } // The Item property is another name for the indexer, so you // can omit its name when accessing elements. Console.WriteLine("For key = \"rtf\", value = {0}.", openWith["rtf"]); // The indexer can be used to change the value associated // with a key. openWith["rtf"] = "winword.exe"; Console.WriteLine("For key = \"rtf\", value = {0}.", openWith["rtf"]); // If a key does not exist, setting the indexer for that key // adds a new key/value pair. openWith["doc"] = "winword.exe"; // The indexer throws an exception if the requested key is // not in the dictionary. try { Console.WriteLine("For key = \"tif\", value = {0}.", openWith["tif"]); } catch (KeyNotFoundException) { Console.WriteLine("Key = \"tif\" is not found."); } // When a program often has to try keys that turn out not to // be in the dictionary, TryGetValue can be a more efficient // way to retrieve values. string value = ""; if (openWith.TryGetValue("tif", out value)) { Console.WriteLine("For key = \"tif\", value = {0}.", value); } else { Console.WriteLine("Key = \"tif\" is not found."); } // ContainsKey can be used to test keys before inserting // them. if (!openWith.ContainsKey("ht")) { openWith.Add("ht", "hypertrm.exe"); Console.WriteLine("Value added for key = \"ht\": {0}", openWith["ht"]); } // When you use foreach to enumerate dictionary elements, // the elements are retrieved as KeyValuePair objects. Console.WriteLine(); foreach( KeyValuePair<string, string> kvp in openWith ) { Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value); } // To get the values alone, use the Values property. Dictionary<string, string>.ValueCollection valueColl = openWith.Values; // The elements of the ValueCollection are strongly typed // with the type that was specified for dictionary values. Console.WriteLine(); foreach( string s in valueColl ) { Console.WriteLine("Value = {0}", s); } // To get the keys alone, use the Keys property. Dictionary<string, string>.KeyCollection keyColl = openWith.Keys; // The elements of the KeyCollection are strongly typed // with the type that was specified for dictionary keys. Console.WriteLine(); foreach( string s in keyColl ) { Console.WriteLine("Key = {0}", s); } // Use the Remove method to remove a key/value pair. Console.WriteLine("\nRemove(\"doc\")"); openWith.Remove("doc"); if (!openWith.ContainsKey("doc")) { Console.WriteLine("Key \"doc\" is not found."); } } } /* This code example produces the following output: An element with Key = "txt" already exists. For key = "rtf", value = wordpad.exe. For key = "rtf", value = winword.exe. Key = "tif" is not found. Key = "tif" is not found. Value added for key = "ht": hypertrm.exe Key = txt, Value = notepad.exe Key = bmp, Value = paint.exe Key = dib, Value = paint.exe Key = rtf, Value = winword.exe Key = doc, Value = winword.exe Key = ht, Value = hypertrm.exe Value = notepad.exe Value = paint.exe Value = paint.exe Value = winword.exe Value = winword.exe Value = hypertrm.exe Key = txt Key = bmp Key = dib Key = rtf Key = doc Key = ht Remove("doc") Key "doc" is not found. */

Hierarquia de herana System.Object System.Collections.Generic.SortedDictionary Segurana de segmentos Esttico pblico (Shared. no Visual Basic) os membros do tipo so segmento seguro Os membros da instncia no so garantidos para ser segmento seguro. Suporte vrios leitores simultaneamente,, desde que a coleo no modificada A SortedDictionary. Mesmo assim, enumerando atravs de um conjunto intrinsically no um procedimento isenta de segmentos. Para garantir segurana do segmento durante enumerao, voc pode bloquear a coleo durante toda a enumerao. Para permitir que a coleo para ser acessado por vrios segmentos para leitura e gravao, voc dever implementar sua prprias sincronizao.

Visual C# Consolidado

485

Plataformas Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition O .NET Framework no d suporte a todas as verses de cada plataforma. Para obter uma lista das verses com suporte, consulte Requisitos do sistema. Informaes de verso .NET Framework Compatvel com: 2.0

Como Usar Excees Especficas em um Bloco Catch


Quando ocorre uma exceo, ele passado a pilha e cada bloco catch fornecido a oportunidade para lidar com ele. A ordem das instrues Catch importante. Colocar blocos catch direcionados a excees especficas antes um bloco catch de Exceo geral ou o compilador pode emitir um erro. O bloco catch adequada determinado pela correspondncia o tipo de exceo para o nome da exceo especificada no bloco catch. Se no houver nenhum especfico catch bloco, a Exceo capturada por um bloco catch gerais, se existir. O exemplo de cdigo a seguir usa um bloco try / catch para capturar um InvalidCastException. O exemplo cria uma classe chamada Employee com uma nica propriedade nvel funcionrio, (Emlevel). Um mtodo , PromoteEmployee, assume um objeto e incrementa o nvel do funcionrio. Um InvalidCastException ocorre quando uma DATETIME instncia passada para o PromoteEmployee mtodo. Exemplo C#
using System; public class Employee { //Create employee level property. public int Emlevel { get { return(emlevel); } set { emlevel = value; } } int emlevel; } public class Ex13 { public static void PromoteEmployee(Object emp) { //Cast object to Employee. Employee e = (Employee) emp; // Increment employee level. e.Emlevel = e.Emlevel + 1; } public static void Main() { try { Object o = new Employee(); DateTime newyears = new DateTime(2001, 1, 1); //Promote the new employee. PromoteEmployee(o); //Promote DateTime; results in InvalidCastException as newyears is not an employee instance. PromoteEmployee(newyears); } catch (InvalidCastException e) { Console.WriteLine("Error passing data to PromoteEmployee method. " + e); } } }

O Common Language Runtime captura excees que no so detectadas por um bloco catch. Dependendo de como o Runtime configurado, ser exibida uma caixa de dilogo de depurao ou executar o programa pra e uma caixa de dilogo com informaes de exceo exibida. Para obter informaes sobre depurao, consulte Depurao e perfil Applications. Como: Usar o bloco Try/Catch para capturar excees Coloque as sees de cdigo que podem descartar excees em um bloco try e colocar cdigo que manipula excees em um bloco catch. O bloco catch uma srie de instrues comeando com a palavra-chave catch, seguida por um tipo de exceo e uma ao a ser executada.

Visual C# Consolidado

486

Observao Praticamente qualquer linha de cdigo pode causar uma exceo, especialmente excees que so geradas pelo Common Language Runtime, como OutOfMemoryException propriamente dito, e StackOverflowException. A maioria dos aplicativos no necessrio para lidar com essas excees, mas voc deve estar ciente dessa possibilidade ao escrever bibliotecas a ser usado por outros. Para obter sugestes sobre quando para definir cdigo em um bloco try, consulte Prticas recomendadas para tratamento de excees. O exemplo de cdigo a seguir usa um bloco try / catch para capturar uma exceo possvel. O Main mtodo contm um bloco try com uma StreamReader instruo que abre um arquivo de dados chamado data.txt e grava uma seqncia a partir do arquivo. Aps o bloco Try um bloco catch que captura qualquer exceo que resulta da bloco try. Exemplo C#
using System; using System.IO; using System.Security.Permissions; // Security permission request. [assembly:FileIOPermissionAttribute(SecurityAction.RequestMinimum, All = @"d:\\data.txt")] public class ProcessFile { public static void Main() { try { StreamReader sr = File.OpenText("data.txt"); Console.WriteLine("The first line of this file is {0}", sr.ReadLine()); } catch(Exception e) { Console.WriteLine("An error occurred: '{0}'", e); } } }

Este exemplo ilustra uma instruo catch bsico que ir detectar qualquer exceo. Em geral, recomendvel programao prtica para capturar um tipo especfico de Exceo em vez de usar a instruo bsica catch. Para obter mais informaes sobre catching excees especficas, consulte Usando excees especficas em um bloco catch. Como Criar Excees Definida pelo Usurio Se voc quiser que os usurios para poder se programaticamente distinguir entre algumas condies de erro, voc pode criar seus prprios excees definida pelo usurio. O.NET Framework fornece uma hierarquia de classes de exceo basicamente derivadas de uma classe Exceo base. Cada um dessas classes define uma exceo especfica, para que em muitos casos voc s precise capturar a exceo. Voc tambm pode criar suas prprias classes de exceo por derivar da classe Exception. Ao criar seu prprio excees, recomendvel codificao prtica para finalizar o nome de classe de exceo definida pelo usurio com a palavra " exceo ". Tambm boa prtica para implementar as trs recomendada construtores comuns, como mostrado no exemplo o seguir. Observao No situaes onde voc estiver usando o Remoting,, voc precisa garantir que os metadados para qualquer exceo definida pelo usurio est disponvel no servidor (chamado) e para o cliente (o objeto proxy ou chamador). Por exemplo, Cdigo chamar um mtodo em um domnio de aplicativos separados deve ser capaz para localizar o conjunto que contm uma Exceo acionada por uma chamada remota. Para obter mais informaes, consulte Prticas recomendadas para tratamento de excees.

Visual C# Consolidado

487

No exemplo a seguir, uma Nova Exceo derivada da Exception classe, EmployeeListNotFoundException. Construtores trs so definidos na classe, cada levando parmetros diferentes. Exemplo C#
using System; public class EmployeeListNotFoundException: Exception { public EmployeeListNotFoundException() { } public EmployeeListNotFoundException(string message) : base(message) { } public EmployeeListNotFoundException(string message, Exception inner) : base(message, inner) { } }

Como Usar Blocos Finally Quando ocorre uma exceo, execuo pra e controle dada ao manipulador de exceo mais prximo. Isso geralmente significa que linhas de cdigo voc pretende sempre ser chamado no sero executadas. Alguns limpeza de recursos, tais como fechar um arquivo, sempre deve ser executada mesmo que uma exceo gerada. Para fazer isso, voc pode usar bloco finally. Um A finalmente bloco ser sempre executado, independentemente de se uma exceo gerada. O exemplo de cdigo a seguir usa um bloco try / catch para capturar um ArgumentOutOfRangeException. O Main mtodo cria duas matrizes e tenta se copiar uma para a outra. A ao gera um ArgumentOutOfRangeException e o erro gravado no console. O finalmente bloco executa independentemente sobre o resultado da ao da cpia. Exemplo C#
using System; class ArgumentOutOfRangeExample { static public void Main() { int[] array1={0,0}; int[] array2={0,0}; try { Array.Copy(array1,array2,-1); } catch (ArgumentOutOfRangeException e) { Console.WriteLine("Error: {0}",e); } finally { Console.WriteLine("This statement is always executed."); } } }

Como Lanar Excees Explicitamente Explicitamente voc pode acionar uma exceo usando a instruo throw. Voc tambm pode descartar uma exceo caught novamente usando a instruo throw. recomendvel codificao prtica para adicionar informaes a uma exceo que rethrown para fornecer mais informaes ao depurar. O exemplo de cdigo a seguir usa um bloco try / catch para detectar um possvel FileNotFoundException. Do FileNotFoundException seguinte bloco Try um bloco catch que captura e grava uma mensagem para o console se o arquivo de dados no for encontrado. A prxima instruo a Instruo throw que gera um novo FileNotFoundException e adiciona informaes de texto para a exceo. Exemplo C#
using System; using System.IO; public class ProcessFile { public static void Main() { FileStream fs = null; try //Opens a text tile. { fs = new FileStream("data.txt", FileMode.Open); StreamReader sr = new StreamReader(fs); string line; //A value is read from the file and output to the console. line = sr.ReadLine(); Console.WriteLine(line); } catch(FileNotFoundException e) { Console.WriteLine("[Data File Missing] {0}", e); throw new FileNotFoundException("[data.txt not in c:\\dev directory]",e); } finally { fs.Close(); } } }

Visual C# Consolidado

488

Como Consumir Eventos em um Aplicativo do Windows Forms Um cenrio comum em aplicativos Windows Forms para exibir um formulrio com controles, e depois executar uma ao especfica com base no que controlam o usurio clicar. Por exemplo, um Button controle gerar um evento quando o usurio clica-lo no formulrio. Ao manipular o evento, o aplicativo pode executar a lgica aplicativo apropriado para que clique de boto. Para obter mais informaes sobre Windows Forms, consulte Guia de introduo ao Windows Forms. Para lidar com um boto clique evento em um formulrio do Windows 1. Criar um formulrio que tem um Button controle do Windows. C#
private Button button; Private WithEvents myButton As Button

2.

Define um manipulador de eventos que corresponda a Click Assinatura de representante de evento. O Click evento usa a EventHandler classe para o tipo delegate e a EventArgs classe para os dados do evento. C#
void Button_Clicked(object sender, EventArgs e) {...} Sub Button_Clicked(sender As Object, e As EventArgs) ... End Sub

3.

Adicione o mtodo do manipulador de eventos para o Click evento do Button. C#


button.Click += new EventHandler(this.Button_Clicked); AddHandler myButton.Click, AddressOf Me.Button_Clicked

Observao Um Designer (tais como Visual Studio 2005) ser fazer esta Cabeamento de evento para voc, gerando cdigo que semelhante ao cdigo, neste exemplo. Exemplo O exemplo de cdigo a seguir manipula o Click evento de para alterar a cor de TextBox Plano de Fundo. um Button Mostrar os elementos em negrito o manipulador de eventos e como ele cabeado para o Click evento do Button. O cdigo, neste exemplo foi escrito sem usar um criador visual (tais como Visual Studio 2005) e contm somente essenciais elementos de programao. Se voc usar um designer, ele ir gerar cdigo adicional. C#
using System; using System.ComponentModel; using System.Windows.Forms; using System.Drawing; public class MyForm : Form { private TextBox box; private Button button; public MyForm() : base() { box = new TextBox(); box.BackColor = System.Drawing.Color.Cyan; box.Size = new Size(100,100); box.Location = new Point(50,50); box.Text = "Hello"; button = new Button(); button.Location = new Point(50,100); button.Text = "Click Me"; // To wire the event, create // a delegate instance and add it to the Click event. button.Click += new EventHandler(this.Button_Clicked); Controls.Add(box); Controls.Add(button); } // The event handler. private void Button_Clicked(object sender, EventArgs e) { box.BackColor = System.Drawing.Color.Green; }

Visual C# Consolidado

489

// The STAThreadAttribute indicates that Windows Forms uses the // single-threaded apartment model. [STAThreadAttribute] public static void Main(string[] args) { Application.Run(new MyForm()); } } Option Explicit Option Strict Imports System Imports System.ComponentModel Imports System.Windows.Forms Imports System.Drawing Public Class MyForm Inherits Form Private box As TextBox Private WithEvents myButton As Button Public Sub New() box = New TextBox() box.BackColor = System.Drawing.Color.Cyan box.Size = New Size(100, 100) box.Location = New Point(50, 50) box.Text = "Hello" myButton = New Button() myButton.Location = New Point(50, 100) myButton.Text = "Click Me" AddHandler myButton.Click, AddressOf Me.Button_Clicked Controls.Add(box) Controls.Add(myButton) End Sub ' The event handler. Private Sub Button_Clicked(sender As Object, e As EventArgs) box.BackColor = System.Drawing.Color.Green End Sub ' The STAThreadAttribute indicates that Windows Forms uses the ' single-threaded apartment model. <STAThreadAttribute()> _ Public Shared Sub Main(args() As String) Application.Run(New MyForm()) End Sub End Class

Compilando o cdigo Salvar o cdigo anterior em um arquivo com (uma extenso. cs) para um arquivo C# e.vb para Visual Basic 2005, compilar, e executar. Por exemplo, se o arquivo de origem for denominado WinEvents.cs (ou WinEvents.vb), execute o seguinte comando: C#
csc /r:System.DLL /r:System.Windows.Forms.DLL /r:System.Drawing.DLL WinEvents.cs vbc /r:System.DLL /r:System.Windows.Forms.DLL /r:System.Drawing.DLL WinEvents.vb

Seu arquivo executvel ser denominado WinEvents.exe. Como Conectar Mtodos de Manipulao de Eventos a Eventos Para consumir eventos definidos na outra classe, voc deve definir e registrar um manipulador de eventos. O manipulador de eventos deve ter a mesma assinatura mtodo como o representante declarado para o evento. Registrar o manipulador de eventos, adicionando o manipulador ao evento. Aps ter adicionado o manipulador de eventos para o evento, o mtodo chamado sempre que a classe gera o evento. Para um exemplo completo que ilustra eventos raising e Handling, consulte Como aumentar e Consume eventos:. Para adicionar um mtodo do manipulador de eventos para um evento 1. Definir um mtodo do manipulador de eventos com a mesma assinatura como o representante de evento. C#
public class WakeMeUp { // AlarmRang has the same signature as AlarmEventHandler. public void AlarmRang(object sender, AlarmEventArgs e) {...}; ... }

2.

Criar uma instncia do representante, usando uma referncia para o mtodo do manipulador de eventos. Quando a instncia de representante chamada, ele por sua vez chama o mtodo do manipulador de eventos. C#

Visual C# Consolidado

490

// Create an instance of WakeMeUp. WakeMeUp w = new WakeMeUp(); // Instantiate the event delegate. AlarmEventHandler alhandler = new AlarmEventHandler(w.AlarmRang);

3.

Adicione a instncia de representante para o evento. Quando o evento gerado, a instncia de representante e seu mtodo do manipulador de evento associado chamado. C#
// Instantiate the event source. AlarmClock clock = new AlarmClock(); // Add the delegate instance to the event. clock.Alarm += alhandler;

O seguinte programa exemplo demonstra elevar um evento em uma classe e manipular o evento no outra classe. A AlarmClock classe define o evento Alarm pblico, e fornece mtodos para aumentar o evento. A AlarmEventArgs classe derivada da EventArgs e define os dados especficos a um Alarm evento. A WakeMeUp classe define o mtodo AlarmRang, que trata um Alarm evento. A AlarmDriver classe usa as classes juntos, como o AlarmRang Mtodo de WakeMeUp manipular o Alarm evento do AlarmClock. Este programa exemplo usa conceitos descritos com detalhes no Eventos e representantes e Elevar um evento. Exemplo C#
// EventSample.cs. // namespace EventSample { using System; using System.ComponentModel; // Class that contains the data for // the alarm event. Derives from System.EventArgs. // public class AlarmEventArgs : EventArgs { private readonly bool snoozePressed ; private readonly int nrings; //Constructor. // public AlarmEventArgs(bool snoozePressed, int nrings) { this.snoozePressed = snoozePressed; this.nrings = nrings; } // The NumRings property returns the number of rings // that the alarm clock has sounded when the alarm event // is generated. // public int NumRings { get { return nrings;} } // The SnoozePressed property indicates whether the snooze // button is pressed on the alarm when the alarm event is generated. // public bool SnoozePressed { get {return snoozePressed;} } // The AlarmText property that contains the wake-up message. // public string AlarmText { get { if (snoozePressed) { return ("Wake Up!!! Snooze time is over."); } else { return ("Wake Up!"); } } } } // Delegate declaration. // public delegate void AlarmEventHandler(object sender, AlarmEventArgs e); // The Alarm class that raises the alarm event. // public class AlarmClock { private bool snoozePressed = false; private int nrings = 0; private bool stop = false; // The Stop property indicates whether the // alarm should be turned off. // public bool Stop { get {return stop;} set {stop = value;} } // The SnoozePressed property indicates whether the snooze // button is pressed on the alarm when the alarm event is generated. // public bool SnoozePressed { get {return snoozePressed;} set {snoozePressed = value;} } // The event member that is of type AlarmEventHandler. // public event AlarmEventHandler Alarm; // The protected OnAlarm method raises the event by invoking // the delegates. The sender is always this, the current instance // of the class. // protected virtual void OnAlarm(AlarmEventArgs e) { AlarmEventHandler handler = Alarm; if (handler != null) { // Invokes the delegates. handler(this, e); } } // This alarm clock does not have // a user interface. // To simulate the alarm mechanism it has a loop // that raises the alarm event at every iteration // with a time delay of 300 milliseconds, // if snooze is not pressed. If snooze is pressed, // the time delay is 1000 milliseconds. // public void Start() { for (;;) { nrings++; if (stop) { break; } else if (snoozePressed) { System.Threading.Thread.Sleep(1000); { AlarmEventArgs e = new AlarmEventArgs(snoozePressed, nrings); OnAlarm(e); } } else { System.Threading.Thread.Sleep(300); AlarmEventArgs e = new AlarmEventArgs(snoozePressed, nrings); OnAlarm(e); } } } } // The WakeMeUp class has a method AlarmRang that handles the // alarm event. // public class WakeMeUp { public void AlarmRang(object

Visual C# Consolidado

491

sender, AlarmEventArgs e) { Console.WriteLine(e.AlarmText +"\n"); if (!(e.SnoozePressed)) { if (e.NumRings % 10 == 0) { Console.WriteLine(" Let alarm ring? Enter Y"); Console.WriteLine(" Press Snooze? Enter N"); Console.WriteLine(" Stop Alarm? Enter Q"); String input = Console.ReadLine(); if (input.Equals("Y") ||input.Equals("y")) return; else if (input.Equals("N") || input.Equals("n")) { ((AlarmClock)sender).SnoozePressed = true; return; } else { ((AlarmClock)sender).Stop = true; return; } } } else { Console.WriteLine(" Let alarm ring? Enter Y"); Console.WriteLine(" Stop Alarm? Enter Q"); String input = Console.ReadLine(); if (input.Equals("Y") || input.Equals("y")) return; else { ((AlarmClock)sender).Stop = true; return; } } } } // The driver class that hooks up the event handling method of // WakeMeUp to the alarm event of an Alarm object using a delegate. // In a forms-based application, the driver class is the // form. // public class AlarmDriver { public static void Main (string[] args) { // Instantiates the event receiver. WakeMeUp w= new WakeMeUp(); // Instantiates the event source. AlarmClock clock = new AlarmClock(); // Wires the AlarmRang method to the Alarm event. clock.Alarm += new AlarmEventHandler(w.AlarmRang); clock.Start(); } } }

Como Manipular Vrios Eventos Usando Propriedades de Evento Para usar propriedades de evento em Visual Basic 2005 (eventos personalizados), voc definir as propriedades de evento na classe que aumenta os eventos, e defina os delegados para as propriedades de evento em classes que manipular os eventos. Para implementar vrias propriedades de evento em uma classe, deve a classe internamente armazenar e manter o representante definido para cada evento. Uma abordagem comum para implementar uma coleo de representante que indexada por uma chave de evento. Para armazenar os delegados para cada evento, voc pode usar a EventHandlerList classe, ou implementar sua prpria coleo A classe coleo deve fornecer mtodos para definir, acessando, e recuperar o representante do manipulador de eventos de acordo com a chave de evento. Por exemplo, voc pode usar uma Tabela de hash classe, ou derivar uma classe personalizada de classe DictionaryBase. Os detalhes da implementao da coleo de representante no precisar ser expostos fora sua classe. Cada propriedade de evento dentro da classe define um mtodo de assessor Add e um mtodo de assessor remover. O acessador de adio para uma propriedade de evento adiciona a instncia de representante entrada coleo de representante. O acessador remover para uma propriedade de evento remove a instncia de representante entrada da coleo de representante. As assessores propriedade de evento usar a chave predefinida para a propriedade de evento para adicionar e remover instncias de uma coleo de representante. Para manipular vrios eventos usando propriedades de evento 1. 2. 3. 4. 5. Definir uma coleo de representante dentro da classe que gera os eventos. Defina uma chave para cada evento. Definir as propriedades de evento na classe que gera os eventos. Use a coleo de representante para implementar a adicionar e remover Mtodos acessadores para as propriedades de evento. Use as propriedades de evento pblica para adicionar e remover representantes do manipulador de eventos nas classes que manipular os eventos.

Exemplo O exemplo C# implementa as propriedades MouseDown de evento e MouseUp, Usando. para armazenar representante cada do evento um EventHandlerList As palavras-chave das construes Propriedade das evento so em negrito.

Visual C# Consolidado

492

Observao No h suporte para propriedades de evento no Visual Basic 2005. C#


// The class SampleControl defines two event properties, MouseUp and MouseDown. class SampleControl: Component { // : // Define other control methods and properties. // : // Define the delegate collection. protected EventHandlerList listEventDelegates = new EventHandlerList(); // Define a unique key for each event. static readonly object mouseDownEventKey = new object(); static readonly object mouseUpEventKey = new object(); // Define the MouseDown event property. public event MouseEventHandler MouseDown { // Add the input delegate to the collection. add { listEventDelegates.AddHandler(mouseDownEventKey, value); } // Remove the input delegate from the collection. remove { listEventDelegates.RemoveHandler(mouseDownEventKey, value); } } // Define the MouseUp event property. public event MouseEventHandler MouseUp { // Add the input delegate to the collection. add { listEventDelegates.AddHandler(mouseUpEventKey, value); } // Remove the input delegate from the collection. remove { listEventDelegates.RemoveHandler(mouseUpEventKey, value); } } }

Como Implementar Eventos em sua Classe Os procedimentos a seguir descrevem como implementar um evento em uma classe. O primeiro procedimento implementa um evento que no no associou dados; ele usa as classes System.EventArgs e System.EventHandler para dados e delegue o manipulador de eventos. O segundo procedimento implementa um evento com dados personalizada; ela define classes para os dados do evento e o manipulador de representante eventos personalizados. Para um exemplo completo que ilustra eventos raising e Handling, consulte Como aumentar e Consume eventos:. Para implementar um evento sem dados eventos especficos 1. Definir um membro de evento pblica na sua classe. Definir o tipo do membro de evento para um System.EventHandler representante. C#
public class Countdown { ... public event EventHandler CountdownCompleted; }

2.

Fornece um mtodo protegido na sua classe que gera o evento. Nome do mtodo OnEventName. Aumentar o evento dentro do mtodo. C#
public class Countdown { ... public event EventHandler CountdownCompleted; protected virtual void OnCountdownCompleted(EventArgs e) { if (CountdownCompleted != null) CountdownCompleted(this, e); } }

3.

Determinar quando para elevar o evento na sua classe. Chamar OnEventName para elevar o evento. C#
public class Countdown { ... public void Decrement { internalCounter = internalCounter - 1; if (internalCounter == 0) OnCountdownCompleted(new EventArgs()); } }

Para implementar um evento com dados eventos especficos

Visual C# Consolidado

493

1.

Definir uma classe que fornece dados para o evento. Nome da classe EventNameArgs, derivar a classe de System.EventArgs, e adicionar os membros especficos eventos-. C#
public class AlarmEventArgs : EventArgs { private readonly int nrings = 0; private readonly bool snoozePressed = false; //Properties. public string AlarmText { ... } public int NumRings { ... } public bool SnoozePressed{ ... } }

2.

Declare um representante para o evento. Nome o representante EventNameEventHandler. C#


public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);

3.

Definir um membro de evento pblica denominado EventName na sua classe. Definir o tipo do membro de evento para o tipo delegate de evento. C#
public class AlarmClock { ... public event AlarmEventHandler Alarm; }

4.

Definir um mtodo protegido na sua classe que gera o evento. Nome do mtodo OnEventName. Aumentar o evento dentro do mtodo. C#
public class AlarmClock { ... public event AlarmHandler Alarm; protected virtual void OnAlarm(AlarmEventArgs e) { if (Alarm != null) Alarm(this, e); } }

5.

Determinar quando para elevar o evento na sua classe. Chamar OnEventName para gerar o evento e passar dados especficos eventos-usando EventNameEventArgs o. C#
Public Class AlarmClock { ... public void Start() { ... System.Threading.Thread.Sleep(300); AlarmEventArgs e = new AlarmEventArgs(false, 0); OnAlarm(e); } }

Visual C# Consolidado

494

Depurao (Como fazer em C#)


Esta pgina possui um link para a Ajuda sobre tarefas de depurao amplamente usadas. Para ver outras categorias de tarefas populares abordadas na Ajuda, consulte Como fazer em C#.

Compilando no Visual Studio


O Visual Studio 2005 fornece ferramentas para testar e depurar aplicativos continuamente medida que eles so compilados. Quando um projeto do Visual Studio criado, so definidas configuraes-padro de projeto e so atribudas configuraes-padro de compilao soluo para fornecer-lhe contexto para quando ele for compilado. As equipes de desenvolvimento podem editar essas configuraes-padro de soluo e projeto conforme necessrio, e criar novas configuraes, salvando cpias modificadas de configuraes-padro.

Compilao Durante o Desenvolvimento de Aplicativos


Uma soluo e seus projetos individuais so normalmente criados e testados usando uma compilao de depurao (Debug). Os desenvolvedores compilaro uma em modo de depurao vrias vezes no decorrer de cada etapa do seu processo de desenvolvimento. A depurao um processo de duas etapas. Primeiramente, erros de tempo de compilao so corrigidos. Esses erros podem incluir sintaxe incorreta, palavras-chave incorretas e inconsistncias entre tipos de dados. Em seguida, o depurador usado para detectar e corrigir problemas tais como erros lgicos e erros semnticos que so detectados em tempo de execuo. Quando um projeto ou soluo estiver totalmente desenvolvido e suficientemente depurado, seus componentes so compilados em uma verso de lanamento (Release). Via de regra, uma compilao de lanamento emprega vrias otimizaes. Compilaes otimizadas so compiladas para serem menores e de execuo mais rpida que compilaes no-otimizadas. Selecionando e Editando Configuraes de Compilao Use a Caixa de Dilogo Configuration Manager para definir configuraes de projeto, que so conjuntos de propriedades para cada combinao suportada de verso e plataforma (por exemplo, Release Win32). Voc pode criar suas prprias compilaes especiais, como uma configurao de compilao de perguntas e respostas para os testadores, ou uma configurao de compilao pessoal para experimentar alguns cdigos preliminares. Voc pode usar o Project Designer para modificar as configuraes de cada combinao de compilao e plataforma. Para mais informaes, consulte Introduo ao Compilador do Projeto. Use a caixa de dilogo Solution Property Pages para definir as propriedades da soluo. As propriedades mais comuns incluem configuraes para o projeto de inicializao e dependncias de projeto. As propriedades de configurao incluem menus suspensos listando tipos de configuraes do projeto e plataformas disponveis, e caixas de seleo para selecionar os projetos a serem criados e a serem implantados (se ativado). A combinao de configurao de projeto e plataforma escolhida determina a configurao de compilao do projeto a ser usada. Para mais informaes, consulte Caixa de Dilogo Solution Property Pages. Use a lista suspensa Solution Configurations na barra de ferramentas Standard para selecionar a configurao compilao soluo ativa, e para abrir a caixa de dilogo Configuration Manager. Voc tambm pode acessar o Configuration Manager selecionando Configuration Manager a partir do menu Build.

Visual C# Consolidado

495

Configuraes de Compilao
Configuraes de compilao fornecem uma maneira de armazenar vrias verses de soluo e propriedades do projeto. A configurao ativa pode ser rapidamente acessada e alterada, permitindo que voc facilmente crie vrias configuraes do mesmo projeto. Por padro, e projetos criados com Visual Studio incluiem configuraes Debug e Release. Configuraes Debug so automaticamente configuradas para depurar um aplicativo, e configuraes Release so configuradas para a verso final do aplicativo. Para mais informaes, consulte COMO: defina configuraes Debug e Verso. Voc tambm pode criar e editar suas prprias configuraes personalizadas de soluo e projeto para atender s necessidades do seu aplicativo. Para mais informaes, consulte Como criar e editar configuraes:. Dois nveis de configuraes de compilao podem ser definidos no Visual Studio: configuraes de soluo e configuraes do projeto. Configuraes de Soluo Um Configurao de soluo especifica como os projetos em uma soluo sero compilados e (se ativado) implantado. Para definir uma nova configurao de soluo, abra a Caixa de Dilogo Configuration Manager . e selecione New da lista Active solution configuration Cada entrada em uma configurao de soluo inclui um nome de projeto, uma configurao, uma configurao de plataforma, uma configurao de compilao, e (se ativado) uma configurao Deploy. A combinao da configurao de soluo e da configurao de plataforma escolhidas determina a configurao do projeto que ser usada. Para obter mais informaes sobre soluo de plataformas, consulte Criar plataformas. Voc pode criar quaisquer nmeros de configuraes de soluo, cada um com um nome exclusivo. O Ambiente integrado de desenvolvimento do Visual Studio (IDE) automaticamente atribui configuraes de soluo sempre que voc:

Adicionar uma plataforma de projeto com Create new solution platforms selecionada. Adicionar uma configurao de projeto com Create new solution configurations selecionada. Adicionar um novo projeto que ir ser implantado em vrias plataformas, um dos quais novo.

Configuraes de soluo tambm fornecem informaes de contexto do projeto em geral para o IDE. Por exemplo, se a configurao de soluo ativa especifica que um projeto ser compilado para um dispositivo mvel, a Caixa de ferramentas exibir somente itens de projeto que podem ser usados em um projeto de dispositivo mvel enquanto voc estiver trabalhando neste projeto. Configuraes do projeto A configurao e plataforma do projeto so usadas juntas para especificar as propriedades a serem usadas ao compilar o projeto. Um projeto pode ter um conjunto de propriedades de projeto definidas para cada combinao exclusiva de uma configurao e plataforma. Propriedades do projeto so editadas com o Project Designer. Determinados painis no Project Designer contm listas suspensas que indicam a configurao e combinao de plataforma do projeto atual. Voc pode definir as propriedades dependentes da configurao em cada configurao de projeto conforme necessrio. Propriedades de projeto podem ser usadas para determinar, por exemplo,

Visual C# Consolidado

496

quais itens de projeto sero includos em uma compilao particular, quais arquivos de sada sero criados, onde os arquivos de sada sero colocados, e como eles sero otimizados. Configuraes de projeto podem diferir bastante. Por exemplo, as propriedades de configurao de um projeto podem especificar que seu arquivo de sada seja otimizado para que o binrio resultante ocupe o espao mnimo, enquanto outro projeto pode ser otimizado de forma que o seu executvel execute com a velocidade mxima. Configuraes do projeto no so armazenadas pelo usurio, mas pela soluo, para que elas possam ser compartilhadas por uma equipe. Embora as dependncias de projeto so independentes da configurao, somente os projetos especificados na configurao de soluo ativa sero compilados. Alterar Configuraes de Solution Quando voc cria uma soluo, o Visual Studio usa a configurao de soluo ativa, que especifica as configuraes do projeto para usar para cada projeto a ser compilado. Voc pode alterar a configurao ativa diretamente na lista suspensaSolution Configurations na barra de ferramentas padro, ou a partir da caixa de dilogo Configuration Manager . Observao Se voc no puder encontrar as configuraes de soluo na barra de ferramentas padro ou no puder acessar o Configuration Manager, voc pode ter as configuraes de desenvolvedor do Visual Basic aplicadas. Para mais informaes, consulte COMO: Gerenciar configuraes de compilao desenvolvedor de configuraes aplicado. Como o IDE atribui configuraes do projeto para serem compiladas Quando voc cria uma nova soluo de configurao (ao invs de copiar a que j exista), o IDE determina as configuraes padro do projeto para os projetos que ele ir compilar usando os seguintes critrios de seleo para cada projeto (avaliados nesta ordem): 1. A nova soluo de configurao criar uma configurao de projeto cujo nome corresponde exatamente ao seu. Os nomes de configurao no diferenciam maisculas de minsculas. Se no houver nenhuma correspondncia de nome exato, a nova configurao de soluo ir compilar uma configurao de projeto cujo nome corresponde parte de configurao do seu nome, mesmo que a parte da plataforma tambm no corresponda. (Lembre-se que a conveno de nomeao <configuration name> <platform-name>.) Se ainda no houver correspondncia, a nova configurao de soluo ir compilar a primeira configurao listada para o projeto.

2.

3.

Como o IDE atribui configuraes de soluo Quando voc cria uma configurao de projeto e marca Create new solution configurations o IDE procura uma configurao de soluo nomeada apropriadamente para compilar o projeto em cada plataforma que ele suporta. Em alguns casos, o IDE ir renomear as configuraes de soluo existentes ou criar novas. A IDE determina como atribuir as configuraes de soluo usando os critrios de seleo a seguir:

Visual C# Consolidado

497

Se uma configurao de projeto no especifica uma plataforma ou especifica uma nica plataforma, ento uma configurao de soluo cujo nome corresponde quele da nova configurao de projeto ser encontrada ou adicionada. Nesse caso, o nome da soluo de configurao padro no inclui um nome de plataforma; ele assume a forma <project configuration name>. Se um projeto suportar vrias plataformas, uma soluo de configurao ser encontrada ou adicionada para cada configurao de projeto para compilar cada projeto em cada plataforma que ele suporta. O nome de cada configurao de soluo inclui o nome de configurao do projeto e o nome da plataforma; ele assume a forma <project configuration name> <platform name>.

Compilar plataformas
Plataformas de compilao fornecem uma maneira de armazenar vrias verses de soluo e propriedades de projeto aplicveis especificamente para direcionar plataformas. Por exemplo, voc pode criar uma configurao do Debug que direciona para uma plataforma x 86, e uma configurao do Debug que direciona para uma plataforma x64. A plataforma ativa pode ser rapidamente acessada e alterada, permitindo que voc facilmente crie um projeto selecionando vrias plataformas. COMO: configurar projetos para plataformas de destino Visual Studio 2005 permite que voc configure seus aplicativos para direcionar para diferentes plataformas, incluindo plataformas de 64 bits. Para obter mais informaes sobre suporte em plataforma de 64 bits no Visual Studio 2005, consulte Aplicativos de 64 bits. Selecionando plataformas com o Gerenciador de configuraes O Configuration Manager fornece uma maneira para voc adicionar rapidamente uma nova plataforma de destino em seu projeto. Se voc selecionar uma das plataformas includas no Visual Studio, as propriedades de seu projeto so modificadas para compil-lo para a plataforma selecionada.

Para configurar um projeto e direcion-lo a uma plataforma de 64 bits


1. 2. 3. No menu Build, clique em Configuration Manager. Na lista de soluo de plataforma Active, selecione a plataforma de 64 bits para o direcionamento da soluo. Se a plataforma no existir na lista, selecione New. Na caixa de dilogo New Solution Platform, selecione a plataforma de 64 bits para o direcionamento da soluo. Observao Se voc criar um novo nome para sua configurao, voc pode ter que modificar as configuraes em Project Designer para direcionar a plataforma correta. 4. Se voc deseja copiar as configuraes de uma configurao de plataforma atual, selecione a configurao da plataforma para copiar configuraes, e clique em OK.

As propriedades para todos os projetos direcionados para uma plataforma de 64 bits so atualizadas, e a prxima compilao do projeto ser otimizada em plataformas de 64 bits. Direcionando plataformas no criador de projeto

Visual C# Consolidado

498

O Project Designer tambm fornece uma maneira de direcionar para diferentes plataformas em seu projeto. Se selecionar uma das plataformas includas na lista da caixa de dilogo New Solution Platform no funcionar para sua soluo, voc pode criar um nome de configurao personalizado e modificar as configuraes no Project Designer para direcionar a plataforma correta. Observao Projetos Visual J# no podem ser configurados para direcionar para diferentes plataformas. Executar esta tarefa varia de acordo com a linguagem de programao que voc estiver usando. Consulte os seguintes links para obter mais informaes:

Para Visual Basic projetos, consulte COMO: Otimizar um aplicativo para um Tipo especfico de CPU. Para projetos Visual C#, consulte PAGE compilao, Designer projeto c (#). Para projetos Visual C++, consulte COMO: configurar projetos Visual C++ para direcionar para plataformas de 64 bits.

COMO: Configurar projetos para direcionar para vrias plataformas


Visual Studio 2005 permite que uma soluo direcione para vrias arquiteturas de CPU diferentes, ou plataformas, de uma vez. As propriedades para definir isto so acessados atravs da Caixa de Dilogo do Configuration Manager. Selecionando uma plataforma A Caixa de dilogo Configuration Manager permite que voc crie e defina configuraes e plataformas no nvel de soluo e de projeto. Cada combinao de configuraes no nvel de soluo e destinos pode ter um conjunto exclusivo de propriedades associadas a ela, permitindo que voc facilmente alterne entre, por exemplo, uma configurao Release que direciona uma plataforma x64, uma configurao Release que direciona uma plataforma x 86, e uma configurao Debug que direciona uma plataforma x 86.

Para definir a configurao para direcionar diferentes plataformas


1. 2. No menu Build, clique em Configuration Manager. Em Active solution platform box, selecione a plataforma que voc deseja direcionar a soluo, ou selecione <New> para criar uma nova plataforma. Para obter informaes sobre como usar a caixa de dilogo New Solution Platform, consulte a New Solution Platform Dialog Box.. Visual Studio. ir compilar seu aplicativo para direcionar a plataforma que definida como a plataforma ativa na caixa de dilogo Configuration Manager

Remover uma plataforma Se voc percebe que no tem necessidade de uma plataforma, pode remov-la usando a caixa de dilogo Gerenciador de configuraes. Este procedimento remover todas as configuraes de soluo e projeto que voc configurou para essa combinao de configurao e de destino.

Para remover uma plataforma


1. No menu Build, clique em Configuration Manager.

Visual C# Consolidado

499

2. 3.

Em a Active solution platform box, selecione <Edit>. A Edit Solution Platforms Caixa de dilogo aberta. Clique na plataforma voc deseja remover, e clique em Remove.

Selecionando vrias plataformas com uma soluo Porque voc pode alterar as configuraes com base na combinao de configurao e configuraes de plataforma, voc pode configurar uma soluo que pode selecionar mais de uma plataforma.

Para direcionar vrias plataformas


1. 2. 3. 1. 2. Use o Configuration Manager para adicionar pelo menos duas plataformas destino para a soluo. Selecione a plataforma que voc deseja direcionar a partir da lista Active solution platform. Compilar uma soluo. Use o Configuration Manager para adicionar pelo menos duas plataformas destino para a soluo. Use a janela Batch Build para criar vrias configuraes de soluo de uma vez. Para mais informaes, consulte a caixa de dilogo compilao em lotes.

Para criar vrias configuraes de soluo de uma nica vez

possvel ter uma plataforma no nvel de soluo como, por exemplo, x64, e no ter projetos nesta soluo direcionando para a mesma plataforma. Tambm possvel ter vrios projetos na sua soluo, cada um direcionado para diferentes plataformas. recomendvel que se voc tiver uma dessas situaes, voc crie uma nova configurao com um nome descritivo para evitar confuso. COMO: Preparar e gerenciar Compilaes Visual Studio 2005 oferece uma variedade de formas para ajud-lo a organizar quais arquivos esto includos em uma compilao de uma soluo ou projeto, qual conjunto de propriedades do projeto est em vigor enquanto compila, e em que ordem os projetos sero compilados. Esta seo contm tpicos que explicam vrios procedimentos para preparar e gerenciar compilaes. A seguir esto os procedimentos comuns do Visual Studio para preparar e gerenciar compilaes. Observao As opes disponveis nas caixas de dilogo, e os nomes e locais do menu de comandos que voc v, podem diferir do que descrito na Ajuda dependendo das configuraes ou edio ativas. Esta pgina Ajuda foi escrita com base no General Development settings. Para exibir ou alterar as configuraes, escolha Import and Export Settings no menu Tools. Para mais informaes, consulte Configuraes do Visual Studio. Para compilar, recompilar, ou limpar uma soluo inteira 1. 2.
o

Em Solution Explorer, selecione ou abra a soluo desejada. No menu Build, escolha Build Solution, Rebuild Solution,. ou Clean Solution Escolha Build ou Build Solution para compilar somente os arquivos e componentes de projetos que foram alterados desde a ltima compilao.

Visual C# Consolidado

500

Observao O comando Build passa a ser Build Solution quando uma soluo inclui mais de um projeto.
o o

Escolha Rebuild Solution para " Limpar " a primeira soluo, e ento compilar todos os arquivos e componentes de projeto . Escolha Clean Solution para excluir quaisquer arquivos intermedirios e de sada, deixando somente os arquivos e componentes de projeto, dos quais novas ocorrncias de arquivos intermedirios e de sada podem ser compiladas. Em Solution Explorer, selecione ou abra o projeto desejado. No menu Build, escolha Build [Project Name] ou Rebuild [Project Name]. Escolha Build [Project Name] para criar somente esses componentes de projeto que foram alterados desde a ltima compilao. Escolha Rebuild [Project Name] para " Limpar " o projeto primeiro, e ento compilar os arquivos de projeto e todos os seus componentes. No menu Tools, escolha Options. Na caixa de dilogo Options, expanda a pasta Projects and Solutions, e escolha Build and Run. A caixa de dilogo Compilar e executar, projetos e solues, Opes aberta. Selecione a opo Only build startup projects and dependencies on Run. Quando esta opo estiver selecionada, somente o projeto de inicializao atual e suas dependncias so criados quando voc:

Para criar ou reconstruir um nico projeto 1. 2.


o o

Para criar somente o projeto de inicializao e suas dependncias 1. 2.

3.

Escolhe Start (F5) a partir do Menu Debug. OuEscolhe Build Solution (CTRL+SHIFT+B) a partir do Menu Build. Quando esta opo estiver desmarcada, o comando anterior no compila todos os projetos, suas dependncias, e os arquivos de soluo. Por padro, esta opo no selecionada.

Para compilar somente o projeto Visual C++ selecionado


o o o

Somente para projetos em Visual C++, um submenu Project Only do menu Build exibe trs comandos especficos do projeto: Criar somente projname < > Reconstruir somente projname < > Limpar somente projname < > Esses trs comandos compilam, limpam e compilam, ou limpam o Projeto Visual C++ atualmente selecionado no Solution Explorer, sem compilar ou limpar quaisquer dependncias do projeto ou arquivos de soluo.

Para compilar em lotes vrias configuraes do projeto 1. 2. 3. No menu Build, escolha Batch Build. Marque as caixas de seleo para as configuraes do projeto que deseja criar. Escolha Build ou Rebuild.

Para definir opes de salvar para os comandos de compilao

Visual C# Consolidado

501

1. 2.

No menu Tools, escolha Options. Na caixa de dilogo Options, expanda a pasta Projects and Solutions, e escolha Build and Run. A caixa de dilogo Opes, Criar e executar, projetos e solues abre. Selecione uma opo na lista Before building. No menu Tools, escolha Options. Na caixa de dilogo Options, expanda a pasta Projects and Solutions, e escolha General. A caixa de dilogo Opes, Geral, projetos e solues abre. Se desejar que a janela de sada venha para a frente e mostre o andamento da compilao, selecione Show Output window when build starts. Se voc desejar para ver todos os erros de uma compilao na lista a tarefas quando a compilao terminado, selecione Always show Error List if build finishes with errors.

3. 1. 2.

Para mostrar comentrios sobre compilaes

3. 4.

COMO: Alterar a pasta de sada de compilao Visual Studio fornece uma maneira para que voc modifique a localidade de sada gerada pelo seu projeto. Devido a diferenas no Project Designers para as diferentes linguagens, o procedimento para modificar a pasta de sada de compilao varia. Projetos do Visual Basic Para projetos Visual Basic, a alterao da pasta de sada de compilao feita atravs do Compile Pane. do Project Designer. Para mais informaes, consulte COMO: alterar o local de compilao para um aplicativo. ,Projetos Visual C# e Visual J#

Para alterar o diretrio de sada de compilao:


1. 2. 3. No menu Project, clique em Properties. Clique na guiaBuild. Clique no boto Browse ao lado da caixa Output e selecione uma nova pasta de sada de compilao.

Visual projetos C++

Para alterar o diretrio de sada da compilao:


1. 2. 3. No menu Project, clique em Properties. Expanda a guia Configuration Properties e clique em General. Altere a caixa Output Directory para a nova pasta de sada.

COMO: compilar para uma pasta de sada comum Por padro, o Visual Studio 2005 cria cada projeto em uma soluo na sua prpria pasta dentro da soluo. Voc pode alterar os caminhos de sada de compilao dos projetos para forar que todas as sadas sejam colocadas na mesma pasta. Para colocar todas as sadas de soluo em uma pasta comum 1. Clique em um projeto na soluo.

Visual C# Consolidado

502

2. 3. 4.

No menu Project, clique em Properties. Dependendo do tipo de projeto, clique na guia Compile ou na guia Build, e defina o Output path para uma pasta que ser usada por todos os projetos na soluo. o Repita as etapas de 1 a 3 para todos os projetos na soluo.

COMO: Personalizar Eventos de Compilao


Eventos de compilao especificam comandos executados antes do inicio da compilao ou depois que a compilao termina. Eventos de compilao so executados somente se a compilao atingir esses pontos com xito no processo de compilao. Devido a diferenas na elaborao do projeto para os diferentes idiomas, o procedimento para personalizar eventos de compilao varia. Projetos do Visual Basic Para obter informaes sobre como personalizar eventos de compilao para projetos do Visual Basic, consulte Especificando eventos de compilao:. Projetos Visual C# e Visual J# Para obter informaes sobre como personalizar eventos de compilao para Projetos Visual C# e Visual J# , consulte COMO: especificar eventos de compilao (c #, j #). Projetos Visual C++ Para obter informaes sobre como personalizar eventos de compilao para projetos Visual C++ , consulte Especificando eventos de compilao. COMO: definir vrios projetos de inicializao Visual Studio 2005 permite que voc especifique como mais de um projeto executado quando voc inicia o depurador. Para definir vrios projetos de inicializao 1. 2. 3. 4. Em Solution Explorer, selecione a soluo. No menu Project, clique em Properties. O A caixa de dilogo de pginas de Propriedades da Soluo abre. Expanda o n Common Properties, e clique em Startup Project. Clique em Multiple Startup Projects e defina as aes do projeto. Para mais informaes, consulte Projetos de inicializao, Propriedades Comuns, Caixa de dilogo de Pginas de Propriedades de Soluo.

COMO: Criar e Remover Dependncias de Projeto


Ao criar uma soluo que contm vrios projetos, pode ser necessrio criar determinados projetos primeiro, para gerar cdigo usado por outros projetos. Quando um projeto consome cdigo executvel gerado pelo outro projeto, o projeto que gera o cdigo conhecido como uma

Visual C# Consolidado

503

dependncia de projeto do projeto que consome o cdigo. Essas relaes de dependncia podem ser definidas na Caixa de Dilogo Project Dependencies. Para atribuir dependncias a projetos 1. 2. Em Solution Explorer, selecione um projeto. No menu Project, escolha Project Dependencies. A caixa de dilogo Project Dependencies aberta. Observao A opo Project Dependencies somente estar disponvel em solues contendo mais de um projeto. 3. 4. Na aba Dependencies , selecione um projeto a partir do menu suspenso Project. No campo Depends on, selecione a caixa de seleo de qualquer outro projeto que deve ser compilado antes deste projeto. Em Solution Explorer, selecione um projeto. No menu Project, escolha Project Dependencies. A caixa de dilogo Project Dependencies aberta. Observao A opo Project Dependencies somente estar disponvel em solues contendo mais de um projeto. 3. 4. Na aba Dependencies, selecione um projeto a partir do menu suspenso Project. No campo Depends on, desmarque as caixas de seleo ao lado de outros projetos que no sejam mais dependncias deste projeto.

Para remover dependncias de projetos 1. 2.

Compilar elementos de interface do usurio


Esses elementos de interface do usurio ajudam-no a compilar seus aplicativos e controlar o andamento da compilao.

Caixa de Dilogo Batch Build


Use esta caixa de dilogo para criar vrias configuraes de projeto todas ao mesmo tempo. Voc pode decidir, por exemplo, compilar todas as configuraes de projeto para um projeto com um comando. Voc pode acessar esta caixa de dilogo a partir do menu Build. Verifique as configuraes de compilao do projeto Cada entrada inclui os seguintes campos: Projeto

Visual C# Consolidado

504

Exibe nomes de projetos na soluo atual. Podem aparecer vrias entradas para o mesmo projeto, uma para cada configurao de projeto. Todas as entradas de todos os projetos so listados numa nica lista simples. Configurao Exibe o tipo de compilao do projeto especificado pela configurao de soluo selecionado (Solution Config). Plataforma Exibe o nome da plataforma na qual o projeto ser executado Soluo Config Exibe a configurao de compilao da soluo que ir fornecer o contexto como este tipo de configurao do projeto compilado para a plataforma especificada. Por exemplo, suponha que projeto P1 dependa de recursos de outro projeto, P2. A configurao da soluo especificar que a configurao de projeto de P1 para esta plataforma seja compilada, e que a configurao de projeto de P2 que fornecer os recursos dos quais P1 precisa tambm seja compilada. Para alterar uma configurao de soluo, use a Caixa de Dilogo Configuration Manager para editar a configurao da soluo ou criar uma nova configurao. Aps alterar uma configurao de soluo, clique em Rebuild nesta caixa de dilogo para a compilao em lotes de todas as configuraes do projeto. Criar Especifica se a configurao de projeto especificada deve ser includa na compilao em lotes. Botes Criar Compila apenas os itens de projeto para as combinaes selecionadas de configurao do projeto e plataforma que foram alterados desde a ltima compilao. Recriar Faz uma compilao completa a partir do zero de todos os itens para os itens de projeto selecionado para as combinaes selecionado de configurao do projeto e plataforma. Limpar Exclui todos os arquivos intermedirios e pastas de sada para as combinaes selecionadas de configurao do projeto e plataforma. Selecione Tudo Marca cada configurao de projeto a ser includa na compilao em lotes. Desmarcar tudo Remove cada configurao de projeto da compilao em lotes.

Visual C# Consolidado

505

Fechar Fecha a caixa de dilogo Batch Build.

Janela de sada
Esta janela pode exibir mensagens de status para vrios recursos no ambiente de desenvolvimento integrados (IDE). Para exibir a janela Output , selecione Output a partir do menu View. Para fechar a janela Output e voltar o foco para o editor, pressione a tecla Escape (ESC). Toolbar Show output from Exibe um ou mais painis de sada para serem visualizados. Vrios painis de informaes podem estar disponveis, dependendo de quais ferramentas do IDE tiverem usado a janela Output para enviar mensagens para o usurio. Find Messsage in Code Move o ponto de insero no Editor de Cdigos para a linha que contm o erro de compilao selecionado. Go to Previous Message Altera o foco na janela Output para o erro de compilao anterior e move o ponto de insero no Editor de Cdigos para a linha que contm esse erro de compilao. Go to Next Message Altera o foco na janela Output para o prximo erro de compilao e move o ponto de insero no Editor de Cdigos para a linha que contm esse erro de compilao. Clear all Limpa todo o texto a partir do Painel Output. Toggle Word Wrap Ativa e desativa o recurso quebra automtica de linha no painel Output. Quando a quebra automtica de linha estiver ativada, a continuao de textos que se estendem alm rea de visualizao so exibidos na linha seguinte. Painel Output O painel Output escolhido na lista Show output from exibe a sada a partir da origem indicada. Direcionando mensagens para a janela output Para exibir a janela Output sempre que voc criar um projeto, selecione a opo Show Output window when build starts na caixa de dialogo General, Projects and Solutions Option. Em

Visual C# Consolidado

506

seguida, com um arquivo de cdigo aberto para edio, clique nos botes Go To Previous Message e Go to Next Message na barra de ferramentas da janela Output para selecionar as entradas do painel Output. Na medida em que voc faz isso, o ponto de insero no editor de cdigo saltar para a linha do cdigo onde o problema selecionado ocorre. Certos recursos do IDE (Integrated Development Enviroments, ambiente de desenvolvimento integrado) e comandos chamados na Janela de Comando entregam suas sadas para a janela Output. Sadas de ferramentas externas como arquivos .bat e .com, normalmente exibidas na janela do DOS, sero roteadas para um painel Output quando voc seleciona a opo Use Output Window na caixa de dilogo External Tools. Muitos outros tipos de mensagens tambm podem ser exibidas nos painis Output. Por exemplo, quando a sintaxe TSQL em um procedimento armazenado verificada em um banco de dados de destino, os resultados sero exibidos na janela Output. Voc tambm pode programar seus prprios aplicativos para escreverem mensagens de diagnstico em tempo de execuo em um painel Output. Para fazer isso, use membros da classe Debug ou Trace no espao para nome da System.Diagnostics da .NET Framework Class Library Reference. Membros de classe Debug exibem a sada quando voc compila as configuraes de depurao da sua soluo ou projeto; membros da classe Trace exibem a sada quando voc compila tanto as configuraes de depurao quanto as de criao de verso. Para mais informaes, consulte Mensagens de diagnstico na janela de sada. No Visual C++, voc pode criar etapas personalizadas de compilao e criar eventos cujos avisos e erros so exibidos e contados no painel Output. Pressionando F1 em uma linha de sada ser exibido um tpico da Ajuda apropriado. Para mais informaes, consulte Formatao da sada de uma etapa de compilao personalizada ou evento de compilao.

Caixa de Dilogo Configuration Manager


Use esta caixa de dilogo para criar e editar configuraes de compilao de solues e configuraes de projeto. Quaisquer alteraes feitas em configuraes de compilao de solues so refletidas na pgina Configuration da caixa de dilogo Solution Property Pages. Voc pode acessar o Configuration Manager a partir do menu Build, da caixa de dilogo Solution Property Pages, ou da lista suspensa de configuraes de soluo na barra de ferramentas principal. Configurao de soluo ativo Exibe as configuraes de compilao de soluo disponveis. Use esta lista suspensa ou a lista suspensa Configuration na barra de ferramentas principal para alterar a configurao de soluo ativa. Para criar novas configuraes de soluo e modificar configuraes existentes, escolha <New...> ou <Edit...> na lista suspensa. Plataforma soluo ativo Exibe as plataformas disponveis para as quais compilar a soluo. Quando voc altera a plataforma de soluo ativa, a alterao aplicada para todos os projetos na soluo. Para criar novas plataformas de soluo e modificar plataformas existentes, escolha <New...> ou <Edit...> na lista suspensa. Contextos projeto Cada entrada em Project contexts na configurao de compilao da soluo selecionada inclui um nome de projeto, para selecionar os projetos a ser criado listas suspensas de tipos de configurao e plataformas, e caixas de seleo e (se ativado). A

Visual C# Consolidado

507

combinao de tipo e plataforma escolhida determina a configurao do projeto que ser usada. Clique nos cabealhos de coluna para classificar as colunas na grade. Projeto Exibe os nomes dos projetos encontrados na soluo atual. Configurao Exibe o tipo de compilao de projeto desejada, e lista todos os tipos disponveis de compilao. Para criar um novo tipo de compilao para o projeto ou renomear um tipo existente, escolha <New...> ou <Edit...> desta lista suspensa. Plataforma Exibe a plataforma na qual a compilao desejada deve executar e lista todas as plataformas disponveis para o projeto. Para adicionar uma nova plataforma ou editar um arquivo existente, escolha <New...> ou <Edit...> desta lista suspensa. O tipo de projeto com o qual voc estiver trabalhando determina se voc pode adicionar mais de uma plataforma e que plataformas esto disponveis para que voc adicione ao projeto. Quando voc adicionar uma plataforma a um projeto, uma nova configurao de projeto ser criada. Criar Especifica se o projeto ser compilado pela configurao de soluo atual. Projetos no selecionados no so compilados, ainda que haja qualquer dependncia de projeto recaindo sobre eles. Projetos no selecionados para serem compilados so, ainda assim, includos na depurao, execuo, embalagem, e implantao da soluo. Implantar Se ativado, especifica se o projeto ser implantado quando os comandos Run ou Deploy forem usados com a configurao selecionada de compilao da soluo. Esta caixa de seleo aparece somente para projetos implantveis.

Depurao no Visual Studio


Voc criou o seu aplicativo e resolveu os erros de compilao. Agora voc deve corrigir esses erros de lgica que evitam que seu aplicativo ou procedimentos armazenados sejam executados corretamente. Voc pode fazer isso com o desenvolvimento integrado de funes de depurao do ambiente. Eles permitem que voc se parar em locais de procedimento, inspecionar memria e registrar valores, alterar variveis, observar trfego de mensagens, e obter uma viso de perto do que seu cdigo faz.

O que h de novo no depurador Visual Studio 2005


O depurador Visual Studio 2005 foi aprimorado pela adio dos seguintes recursos:

Edit and Continue para Visual Basic e Visual C#. Voc pode alterar seu cdigo do Visual Basic e C# durante a depurao de seu aplicativo, e continuar a executar o aplicativo ao mesmo tempo. Este recurso aumenta sua produtividade, permitindo-lhe a correo de erros rapidamente, testar novas funcionalidades, e modificar

Visual C# Consolidado

508

funcionalidades existentes. Para obter mais informaes, consulte Editar e continuar (Visual Basic) e Edio e continuao (Visual C#).

Depurao remota mais segura com configurao mais simples. Configurar a depurao remota, copiando um nico executvel para o computador remoto sem instrues de instalao complexas ou registro. A depurao remota agora mais segura e robusta. Alm disso, agora voc pode depurar aplicativos no gerenciados e gerenciados de 64-bit. Para obter mais informaes, consulte Instalao de depurao remota.

Visualizadores. Ferramentas eficientes permitem voc exibir dados em um formato natural e intuitivo. Voc pode iniciar um visualizador em uma janela Watch ou a partir do novo DataTips aprimorado. Por exemplo, agora voc pode exibir uma seqncia de caracteres como um documento HTML ou XML. Voc pode usar os visualizadores existentes ou escrever seus prprios. Para obter mais informaes, consulte Visualizadores.

Depurador de DataTips aprimorado. O depurador de DataTips foi aperfeioado. Voc pode percorrer o contedo de estruturas de dados complexas no editor de cdigo-fonte. Voc pode abrir um visualizador de um DataTip para visualizar os dados em um formato intuitivo e natural. Para obter mais informaes, consulte HOW TO: Use DataTips.

Depurao Just My Code Esse recurso habilita voc a focalizar apenas o cdigo que voc tenha escrito e ignorar cdigo no qual voc no esteja interessado. Para obter mais informaes, consulte Como: etapa INTO apenas meu cdigo.

Tracepoints e pontos de interrupo UI aprimorados. Pontos de interrupo no so mais para interromper apenas. Tracepoints so uma nova maneira de usar pontos de interrupo para executar uma ao personalizada. Com tracepoints, voc pode imprimir uma mensagem ou executar uma macro de automao do Visual Studio, e voc determina se o depurador interrompe ou continua quando ele acerta um tracepoint. A interface com o usurio aprimorada para tornar a definio de todos os pontos de interrupo mais fcil e rpida. Para obter mais informaes, consulte Pontos de interrupo e Tracepoints.

Melhores ferramentas para depurao de multiprocessos. A nova janela Processes mostra todos os processos aos quais voc est conectado para depurao. Filtros de ponto de interrupo permitem voc anexar um ponto de interrupo a processos, segmentos e computadores especificados. A caixa de dilogo Attach to Process simplificada para facilidade de uso, com informaes de processos movidas a partir da caixa de dilogo para a janela Processes. Para obter mais informaes, consulte Como: Anexar a um Processo em Execuo: e Como: Usar Processes Window:.

Assistente de Exceo para Visual Basic, C# e Visual J#. A nova caixa de dilogo Exception Assistant fornece melhores informaes quando ocorre uma exceo em um programa do Visual Basic, C# ou Visual J#. Para obter mais informaes, consulte Assistente de exceo.

Suporte aprimorado para gerenciar informaes da depurao. Melhor suporte para smbolo de servidor e mensagens de diagnstico para solucionar problemas de informaes da depurao.

Depurao do cdigo em tempo de criao. Voc pode depurar seu aplicativo Visual Basic, C# ou Visual J# enquanto voc est o criando. Utilizando a janela Immediate, voc pode testar e depurar suas funes e mtodos sem ter que executar o aplicativo.

Visual C# Consolidado

509

o o o o

Suporte a novos recursos no SQL Server 2005, incluindo: Depurao de tipos de objetos de banco de dados gerenciado. Depurao de aplicativos multicamadas, passando entre as camadas do aplicativo e do banco de dados SQL Server. Depurao para frente e para trs entre cdigo gerenciado e T-SQL. Suporte para depurao em plataformas de 64 bits. Alteraes no Depurador do Visual Studio .NET 2003

O depurador do Visual Studio .NET 2003 foi aprimorado pela adio dos seguintes recursos:

Aprimoramentos de segurana, incluindo uma nova restrio na depurao Just-In-Time, que melhora a segurana impedindo a depurao Just-In-Time entre computadores. Para obter mais informaes, consulte Depurao Just-In-Time. Depurao remota usando pipes, uma nova alternativa para depurao TCP/IP que ajuda e proporciona mais segurana. Para obter mais informaes, consulte Depurao Remota Usando Pipes. A capacidade de carregar despejos contendo informaes gerenciadas. Despejos gerenciados podem ser depurados usando a ferramenta SOS de depurao, que executada a partir da janela Command. Depurao automtica em servios XML da Web. Para obter mais informaes, consulte Depurao em Servios XML da Web. Suporte para fazer o download automaticamente de smbolos de depurao a partir de um smbolo de servidor. Para obter mais informaes, consulte Servidor de Smbolo. Mensagens de erro aprimoradas especialmente para erros que ocorrem durante a depurao de aplicativos da Web. Uma nova pseudovarivel $exception para recuperar informaes sobre excees C#. Alteraes no Depurador do Visual Studio .NET 2002

O Visual Studio .NET 2002 fornecia um nico depurador integrado para todas as linguagens do Visual Studio. Uma nova e unificada interface combinou recursos de antigos depuradores do Visual C++ e Visual Basic, bem como muitos novos recursos. As principais melhorias para depurao incluem:

Depurao de linguagens cruzadas do Visual Basic . NET, Visual C++ .NET, Visual C# . NET, Managed Extensions for C++, script, e SQL. Depurao de aplicativos escritos para o Common Language Runtime do Microsoft .NET Framework, bem como aplicativos nativos Win32. Anexar a um programa em execuo, tanto no computador host ou remoto. Anexar automaticamente a processos do servidor para aplicativos ATL Server, aplicativos ASP.NET da Web, e servios ASP.NET da Web quando estiverem depurando. Depurao de vrios programas diferentes, iniciando vrios programas em uma nica soluo do Visual Studio, ou anexando a outros programas que j esto sendo executados. Usar verificao de erros em tempo de execuo no Visual C++ para detectar erros comuns em tempo de execuo, tais como corrupo do ponteiro da pilha, saturaes de matrizes locais, corrupo de pilha, dependncias ao inicializar variveis locais, e perda de dados em uma atribuio a uma varivel mais curta. Verificar a segurana de buffer dos aplicativos do Visual C++ com a opo /GS. Voc pode usar esta opo para detectar saturaes de buffer, o que substitui o endereo do remetente

Visual C# Consolidado

510

Definir um ponto de interrupo em uma DLL que ainda no foi carregada. O ponto de interrupo automaticamente tornar-se-a ativo quando a DLL carregar. Voc no precisar especificar DLLs que voc deseja depurar em uma caixa de dilogo Additional DLLs, como voc fez no depurador do Visual C++. Depurao de clientes de servios XML da Web aos servios XML da Web, com um pilha de chamadas integrada entre aplicativos cliente e servidor. Janelas no restritas substituram caixas de dilogo restritas para pontos de interrupo e segmentos, o que fornece maior flexibilidade no controle e acesso de recursos na sua rea de trabalho.

Segurana do Depurador
A capacidade de depurar um outro processo lhe concede poderes extremamente grandes que voc no teria de outro modo, especialmente quando estiver depurando remotamente. Um depurador mal-intencionado poderia inflingir danos amplos no computador que est sendo depurado. Devido a isso, h restries sobre quem pode fazer a depurao. Para obter mais informaes, consulte Permisses de depurao remota. Muitos desenvolvedores no entanto, no percebem que a ameaa de segurana tambm pode fluir na direo oposta. possvel que o cdigo mal-intencionado do processo de depurao comprometa a segurana do computador de depurao: existe uma gama de vulnerabilidades de segurana que devem ser protegidas. Prticas Recomendadas de Segurana No h um relacionamento de confiana implcito entre o cdigo que voc est depurando, e o depurador. Se voc estiver disposto a depurar algo, voc tambm deve estar disposto a executlo. A linha inferior que voc deve ser capaz de confiar naquilo que voc est depurando. Se voc no puder confiar, ento voc no deve depurar, ou voc deve depurar a partir de um computador que voc possa se responsabilizar a se comprometer, e em um ambiente isolado. Para reduzir a superfcie do ataque em potencial, a depurao deve ser desativada em computadores de produo. Pelo mesmo motivo, a depurao nunca deve ser ativada indefinidamente. Segurana de Depurao Gerenciada Aqui esto algumas recomendaes gerais que se aplicam a toda depurao gerenciada.

Tenha cuidado ao se anexar a processo de um usurio no confivel: quando voc fizer isso, voc assume que ele confivel.Quando voc tenta se anexar a um processo de usurio no confivel, uma caixa de dilogo de aviso de confirmao, ser exibida perguntando se voc deseja se anexar ao processo. " Usurios Confiveis " incluem voc, e um conjunto de usurios padro normalmente definidos em computadores que tm o .NET Framework instalados, como aspnet, localsystem, networkservice, e localservice. Para obter mais informaes, consulte Aviso de Segurana: Attaching para um processo no confiveis pode ser Dangerous. Tenha cuidado ao fazer download de um projeto de fora da Internet e ao carreg-lo no Visual Studio . Isso muito arriscado para fazer mesmo sem depurao. Quando voc fizer isso, voc est presumindo que o projeto e o cdigo que ele contm so confiveis.

Segurana em Depurao Remota A depurao local geralmente mais segura do que a depurao remota. A depurao remota aumenta a rea tatal de superfcie que pode ser investigada.

Visual C# Consolidado

511

O Monitor de Depurao Remota do Visual StudioMonitor (msvsmon.exe) usado na depurao remota, e h vrias recomendaes de segurana para configur-lo. A maneira preferida para configurar o modo de autenticao a Autenticao do Windows, pois o modo No Authentication (no-autenticao) no seguro. Ao usar o modo de Autenticao do Windows, esteja ciente que conceder uma permisso de usurio no confivel para se conectar ao msvsmon perigoso, conforme ser indicado por um aviso de Caixa de Dilogo. No depure um processo desconhecido em um computador remoto: h possveis vulnerabilidades que podem afetar a mquina que encontra-se executando o depurador, ou que pode comprometer msvsmon.exe, o Remote Monitor depurao Visual Studio. Se voc deve depurar um processo desconhecido de qualquer forma, tente depur-lo localmente, e use um firewall para manter quaisquer ameaas em potencial localizadas. Segurana de Depurao de Servios da Web mais seguro depurar localmente, mas uma vez que, provavelmente, voc no tenha o Visual Studio instalado no servidor da Web, a depurao local pode no ser prtica. Geralmente, a depurao de Servios da Web feita remotamente, exceto durante o desenvolvimento, portanto as recomendaes de segurana de depurao remota tambm se aplicam a depurao de servios da Web. Aqui esto algumas recomendaes adicionais. Para obter mais informaes, consulte Depurao Servios XML da Web.

No ative a depurao em um servidor da Web que foi comprometido. Certifique-se de que voc sabe que o servidor Web seguro antes de depur-lo. Se voc no tiver certeza de que ele seguro, no faa a depurao. Tome cuidado principalmente se voc estiver depurando um servio da Web que est exposto na Internet.

Componentes Externos Esteja ciente dos status de confiana de componentes externos com que o programa interage, especialmente se voc no tiver escrito o cdigo. Tambm esteja ciente de componentes que o Visual Studio ou o depurador possa usar. Smbolos e Cdigo Fonte Duas ferramentas do Visual Studio que exigem preocupao com a segurana so as seguintes:

Source Saver, que lhe fornece verses de cdigo fonte provenientes de um repositrio de cdigo fonte. Ele til quando voc no tiver a verso atual do cdigo fonte de um programa. Para obter mais informaes, consulte Como: Obter cdigo fonte usando Source Server e Aviso de Segurana: depurador deve executar comando no confiveis. Symbol Server, que usado para fornecer os smbolos necessrios para depurar uma falha durante um chamada do sistema. Para obter mais informaes, consulte Como especificar um caminho smbolo: e Como usar um servidor smbolo:.

Preparao e configuraes de depurao


Esta seo descreve as configuraes de propriedades relacionadas ao depurador, e a preparao necessria para depurar o programa com o depurador do Visual Studio. Se voc criar seu programa no Visual Studio usando os modelos de projeto, essas configuraes so definidas corretamente para voc na configurao Debug. Para obter mais informaes, consulte HOW TO: definir depurao e configuraes de verso.

Visual C# Consolidado

512

Configuraes do Projeto do Depurador


Determinadas configuraes do projeto tambm afetam a depurao. Essas configuraes determinam tais itens em quais diretrios o depurador examina o comando e argumentos de comando usados para iniciar o programa e o tipo de informao da depurao criada para o programa. Voc pode alterar essas configuraes na caixa de dilogo Property Pages. Esta seo descreve quais opes esto disponveis e como defini-las.

Requisitos de software depurao SQL


Este tpico se aplica a: Edio do Visual Studio Express Padro Pro / Team Visual Basic No No Sim C# No No Sim C++ No No Sim J# No No No Visual Web Developer No No No

Esta seo descreve o software necessrio para depurar o cdigo em um banco de dados do SQL Server. H requisitos adicionais quando estiver depurando um aplicativo de mltiplas camadas do SQL Server. Para obter mais informaes, consulte Depurao de aplicao multi-camada de banco de dados. Requisitos de Softwares de Camadas de Banco de Dados A depurao em SQL com o Microsoft Visual Studio 2005 requer o seguinte software no servidor:

O Microsoft Windows 2000 ou posterior recomendado. O SQL Server 2005 ou o SQL Server 2000 com o Service Pack 3 necessrio.

Requisitos de Softwares de Camadas de Banco de Dados (somente CLR do SQL) A depurao da CLR do SQL requer os seguintes softwares adicionais no servidor:

O monitor de depurao remota (msvsmon) necessrio estar executando quando voc depurar. Se voc estiver executando o SQL Server 2005, o programa de instalao que instalar o msvsmon j est no servidor em in <sql server install dir>\ 90\Shared\rdbgsetup.exe. Execute este programa para instal-lo, e o SQL Server o iniciar sempre que voc entrar em ou atingir um ponto de interrupo. Todoos os outros requisitos desta pgina aplicam-se CLR do SQL, bem como do TSQL.

Requisitos Adicionais de Softwares de Mltiplas Camadas Com o Visual Studio 2005, voc pode depurar aplicativos de vrias camadas que faam conexes com banco de dados do SQL Server e que executem procedimentos armazenados em SQL. Para fazer isso, a camada do aplicativo deve conectar-se ao bancos de dados usando um dos seguintes procedimentos:

Visual C# Consolidado

513

Cliente SQL OLE DB, ODBC, ou DBLIB. Uma tecnologia como ADO ou ADO.NET que foi construda a cima do OLE DB ou do ODBC. O adaptador de dados gerenciado para o SQL Server.

Ambiente de Desenvolvimento Para obter informaes sobre requisitos de sistema do Visual Studio 2005 por favor consulte Requisitos de hardware do Visual Studio. Depurao em SQL com o Microsoft SQL Server 2005 requer uma das seguintes edies do Visual Studio 2005 :

Visual Studio 2005Pro Visual Studio Tools for Office Visual Studio 2005 Team Edition for Architects Visual Studio 2005 Team Edition for Developers Visual Studio 2005 Team Edition for Testers Visual Studio 2005 Team Suite

HOW TO: definir depurao e configuraes de verso


Um projeto Visual Studio tem configuraes separadas para liberao e depurao de verses do seu programa. Como os nomes sugerem, voc cria a Verso de depurao para depurao e a verso de lanamento para a distribuio da verso final. Se voc criar seu programa no Visual Studio, Visual Studio automaticamente cria essas configuraes e define opes padro apropriadas e outras configuraes. Com as configuraes padro:

A configurao de depurao do seu programa compilada com informao de depurao toda simblica e Sem otimizao. Otimizao complica a depurao, j que a relao entre cdigo fonte e instrues geradas mais complexa. A configurao para lanamento do seu programa totalmente otimizada e no contm nenhuma informao da depurao simblica. Informao sobre depurao pode ser gerada em Arquivos PDB (C++) dependendo das opes do compilador usadas. (Criar Arquivos PDB pode ser muito til se voc precisar depurar a verso de lanamento posteriormente.)

Voc pode alternar entre verses de lanamento e de depurao usando a barra de ferramentas padro ou o Gerenciador de configurao. Para obter mais informaes consulte COMO Criar e Editar Configuraes:. Observao Quando voc instalou o Visual Studio, voc solicitado a escolher um conjunto de configuraes de desenvolvimento para a linguagem de programao primria. Se voc escolher as configuraes de desenvolvimento do Visual Basic, a ferramenta para escolher a configurao de

Visual C# Consolidado

514

depurao ou de lanamento no aparece na barra de ferramentas. Em vez disso, Visual Studio escolhe automaticamente a configurao de depurao quando voc escolhe Start a partir do menu Debug e as configuraes de lanamento quando voc usa o menu Build. Se voc desejar alterar as configuraes de desenvolvimento, consulte Como: Restaurar comandos ocultos do depurador. Procedimentos

Para alternar para a configurao de depurao ou de lanamento

Na barra de ferramentas Standard, clique em Debug ou Release da caixa de listagem Solution Configurations.

Voc pode mudar as definies para uma configurao usando o <Project> Property Pages. Dependendo do tipo de projeto, esta janela ser uma caixa de dilogo contendo um controle de rvore no canto esquerdo para Categorias de navegao Visual C++ e sites da Web ou uma janela com guias no painel editor de texto do Visual Studio.

Para alterar as definies para a configurao de depurao ou de lanamento


1. 2. 3. 4. 5. No Solution Explorer, selecione o projeto. No menu View, clique em Property Pages. Ou voc pode clicar com o boto direito do mouse no nome do projeto no Solution Explorer, e selecionar Property Pages. Na pgina de propriedades <Project> , selecione se a guia Debug ou, se o tipo de projeto um site da Web, Start Options. Na caixa de listagem Configuration, clique em Debug ou Release. Edite o valor das configuraes que voc deseja alterar. Nem todas as propriedades relacionadas ao depurador esto contidas na pgina Debug, h mais na pgina Build. A exibio exata das guias ir variar de acordo com o tipo de projeto.

Configuraes do projeto para um C++ depurar configurao


Voc pode alterar as configuraes de projeto para uma configurao de depurao C ou C++ na caixa de dilogo Property Pages, conforme discutido em HOW TO: definir depurao e configuraes de verso. As tabelas a seguir mostram onde encontrar configuraes relacionadas de depurador na caixa de dilogo Property Pages. Especifique qual depurador usar na caixa de listagem Debugger to launch. Sua escolha ir afetar quais propriedades so visveis. Automaticamente cada configurao da propriedade de depurao sero gravadas e salvas para o arquivo (.suo) "por usurio" para sua soluo sempre que salvar sua soluo. Pasta de propriedades de configurao (categoria de depurao) Pasta de configurao de propriedades (categoria de depurao) Setting Debugger to launch Description

Especifica o depurador a ser executado, com as seguintes opes: Local Windows Debugger Remote Windows Debugger Web Service Debugger MPI Cluster Debugger

Visual C# Consolidado

515

Command (Local Windows Debugger) Remote Command (Remote Windows Debugger) Application Command (MPI Cluster Debugger)

Especifica o comando para iniciar o programa que voc est depurando na mquina local. O caminho para o .exe conforme ilustrado pelo computador remoto.

Especifica argumentos para o comando especificado acima. Command Arguments (Local Windows Voc pode usar os seguintes operadores de redirecionamento na Debugger e Remote caixa: Windows Debugger) < file L stdin do arquivo. Application Arguments (MPI Cluster Debugger) > file Grava stdout em arquivo. >> file Anexa stdout ao arquivo. 2> file Grava stderr em arquivo. 2>> file Anexa stderr ao arquivo. 2> &1 Envia as sadas stderr (2) ao mesmo local que stdout (1). 1> &2 Envia sadas stdout (1) ao mesmo local que stderr (2). Na maioria dos casos, esses operadores so aplicveis somente a aplicativos do console. Working Directory Especifica a pasta de trabalho do programa que est sendo depurado, relativo ao diretrio do projeto onde o seu EXE est localizado. Se voc deixar isto em branco, a pasta de trabalho ficar o diretrio do projeto. Para depurao remota, o diretrio do projeto ser ativado no servidor remoto. Especifica a iniciar ou anexar para o aplicativo. A Configurao padro No. Especifica o nome de um computador (diferente do seu) no qual voc deseja depurar um aplicativo ou um Nome do servidor Msvsmon. Voc tambm pode selecionar isso a partir da caixa de dilogo Processes (para obter mais informaes, consulte Selecionando um computador remoto). Se voc especificar o nome da mquina aqui, tambm dever especificar o tipo de conexo em Connection. O macro RemoteMachine Build definido para o valor da propriedade; para obter mais informaes, consulte Macros para construir comandos e propriedades. Permite que voc alterne entre depurao local e remota. Especifique um nome de computador remoto na caixa Remote Server Name. Tipos de conexo incluem: Remote with Windows Authentication Remote with No Authentication (Native Only) Observao A depurao remota com No Authentication pode deixar o computador remoto vulnervel a violaes de segurana. O Modo de Autenticao do Windows mais seguro. Para obter mais informaes, consulte Instalao de depurao

Attach (Local Windows Debugger and Remote Windows Debugger) Remote Server Name (Remote Windows Debugger and MPI Cluster Debugger)

Connection (Remote Windows Debugger and MPI Cluster Debugger)

Visual C# Consolidado

516

remota. HTTP URL (Web Service Especifica a URL onde o projeto que voc est depurando est Debugger) localizado. Debugger Type Especifica o tipo de depurador a ser usado: Native Only, Managed Only, Mixed ou Auto (padro). Native Only para cdigo C++ no gerenciado. Managed Only para cdigo que executado com o Common Language Runtime (cdigo gerenciado). Mixed dispara depuradores para cdigo gerenciado e no gerenciado. Auto determina o tipo de depurador com base no compilador e informaes EXE. Especifica variveis de ambiente para o programa que voc est depurando. Essas variveis substituem o ambiente do sistema ou so mescladas com o ambiente do sistema, dependendo da configurao Merge Environment. Quando voc clica na coluna configuraes, um boto ( ) elipse aparece. Clique no boto ( variveis de ambiente. Merge Environment (Local Windows Debugger) SQL Debugging (todos menos MPI Cluster Debugger) ) elipse para editar

Environment (Local Windows Debugger)

Determina se as variveis especificadas na caixa Environment sero mescladas com o ambiente definido pelo sistema operado. A configurao padro Sim. Ativa a depurao de procedimentos SQL de seu aplicativo Visual C++. A configurao padro No.

Pasta C/C++ (Categoria geral) Configurao Debug Information Format (/Z7, /Zd, Zi, /ZI) Descrio Especifica o tipo de informaes de depurao a serem criadas para o projeto. A opo padro (/ZI) cria um banco de dados do programa (PDB) em formato compatvel Edio e Continuao. Para obter mais informaes, consulte /Z7, /Zd, /Zi, /ZI (formato de informaes de depurao). Para obter detalhes, consulte Arquivos PDB e Arquivos DBG

Pasta C/C++ (categoria de otimizao) Configurao Descrio Optimization Especifica se o compilador deve otimizar o cdigo que ele produz. A otimizao altera o cdigo que executado. O cdigo otimizado no corresponde mais ao cdigo fonte, portanto a depurao difcil. A opo padro (Disabled (/0d) suprime a otimizao. Voc pode desenvolver com otimizao suprimida, e em seguida, ativ-la ao criar a verso de produo do seu cdigo.

Pasta vinculadora (Categoria de depurao) Configurao Generate Debug Info (/DEBUG) Generate Program Descrio Informa o vinculador para incluir informaes da depurao, que tero o formato especificado por /Z7, /Zd, Zi, ou /ZI. Especifique o nome de um arquivo PDB nesta caixa. Voc deve

Visual C# Consolidado

517

Database File (/PDB:nome) selecionar ZI ou /Zi para formato de informaes de depurao. Strip Private Symbols (/PDBSTRIPPED:filename) Especifique o nome de um arquivo PDB nesta caixa se voc no desejar incluir smbolos particulares no arquivo PDB. Esta opo cria um segundo arquivo (PDB) de banco de dados de programa quando voc cria sua imagem de programa com qualquer uma das opes de compilador ou vinculador que geram um arquivo PDB (/DEBUG, /Z7, /Zd, ou /Zi). Esse segundo arquivo PDB omite smbolos que voc no desejaria enviar para seus clientes. Para obter mais informaes consulte /PDBSTRIPPED (smbolos Private Faixa). Informa o vinculador para gerar um arquivo de mapa durante a vinculao. A configurao padro No. Para obter mais informaes consulte /MAP (Gerar Mapfile). Se voc escolher gerar arquivo de mapa, voc pode especificar o arquivo de mapa nesta caixa. Para obter mais informaes consulte /MAP (Gerar Mapfile). Inclui funes exportadas no arquivo de mapa. A configurao padro No. Para obter mais informaes consulte /MAPINFO (inclui informaes em Mapfile). Especifica configuraes para a opo Linker /ASSEMBLYDEBUG. Possveis valores so: No debuggable attribute emitted. Runtime tracking and disable optimizations (/ASSEMBLYDEBUG); esta a configurao padro, No runtime tracking and enable optimizations(/ASSEMBLYDEBUG:DISABLE). <inherit from parent or project defaults>. Para obter mais informaes consulte /ASSEMBLYDEBUG (Adicionar DebuggableAttribute).

Generate Map File (/MAP)

Map File Name (/MAP:nome) Map Exports (/MAPINFO:EXPORTS) Debuggable Assembly (/ASSEMBLYDEBUG)

Voc pode alterar essas configuraes na pasta Configuration Properties (categoria de depurao) programaticamente usando a interface Microsoft.VisualStudio.VCProjectEngine.VCDebugSettings. Para obter mais informaes, consulte VCDebugSettings.

Como definir permisses SQL Server para depurao:


Este tpico se aplica a: Edio do Visual Studio Express Standard Pro/Team Visual Basic No No Sim C# No No Sim C++ No No Sim J# No No No Visual Web Developer No No No

Esta seo descreve as permisses necessrias para depurao SQL. Essas permisses so apenas aqueles impostas pela depurao do SQL; no pode ser outra permisso necessria em

Visual C# Consolidado

518

outro lugar. Por exemplo, para depurar um processo em execuo como um usurio diferente do que sua conta de logon do Windows, a conta deve ser de um membro do grupo de administradores do sistema para o computador. Para obter mais informaes, consulte Permisses de depurao remota. H duas contas de usurio que voc necessita considerar

A conta do aplicativo a conta de usurio que Visual Studio ou o aplicativo cliente que estiver executando sob. Esta conta uma conta de usurio do Windows e deve ser um membro do grupo sysadmin no SQL Server que est sendo depurado. A conta de conexo a identidade usada para fazer a conexo ao SQL Server. Esta a conta que voc insere quando define a conexo no Server Explorer ou que voc especifica na seqncia de conexo quando o aplicativo se conecta a um banco de dados. Esta conta pode ser uma conta de usurio do Windows, usando a autenticao do Windows, nesse caso, a mesma conta como a conta do Windows na qual Visual Studio est sendo executado. Ou a conta de conexo pode ser uma conta de logon do SQL Server. Para depurao SQL Server 2005, a conta de conexo deve ser um membro da funo sysadmin. Um usurio que j tenha privilgios SysAdmin deve executar o seguinte:
sp_addsrvrolemember 'Domain\Name', 'sysadmin'

Para adicionar uma conta de logon do Windows como sysAdmin

onde Domain\Name representa a conta de logon do Windows. Observao Por padro, os administradores do Windows em um computador que executam o SQL Server so SQL Server sysadmins nessa mquina.

Configuraes do projeto para uma configurao de depurao no Visual Basic


Voc pode alterar as configuraes do projeto para uma configurao de depurao do Visual Basic na janela Property Pages, conforme discutido em Configuraes de depurao e de lenamento. As tabelas a seguir mostram onde localizar configuraes relacionadas a depurador sna janela Property Pages. Guia Depurao Configurao Configuration Start Action Descrio Define o modo para compilar o aplicativo. Escolha entre Active (Debug), Debug, Release, All Configurations. Este grupo de controles especifica a ao que ir ocorrer quando voc escolher iniciar no menu Depurar. Start project o padro e inicia o projeto de inicializao para depurao. Para obter mais informaes, consulte Escolhendo o projeto de inicializao. Start external program permite a voc iniciar e anexar a um programa que no faz parte de um projeto Visual Studio. Para obter mais informaes, consulte Anexar a um programa em execuo. Start browser in URL permite a voc depurar um aplicativo da Web.

Visual C# Consolidado

519

Especifica argumentos de linha de comando para o programa a ser Argumentos da linha de comando depurado. O nome do comando o nome do programa especificado no programa externo Iniciar. Se a Ao Iniciar definida para iniciar URL, argumentos de linha de comando sero ignorados. Diretrio de trabalho Usar mquina remota Especifica a pasta de trabalho do programa que est sendo depurado. No Visual Basic, a pasta de trabalho o diretrio de que aplicativo iniciado, \bin, por padro. Quando a caixa de seleo estiver marcada, a depurao remota ativado. Na caixa de texto, voc pode digitar nome de um computador remoto onde o aplicativo ser executado para fins de depurao ou um Nome do servidor Msvsmon. O local do EXE no computador remoto especificado pela propriedade Output Path na guia construir. O local deve ser um diretrio compartilhvel no computador remoto. Permite a voc depurar chamadas para cdigo nativo (no gerenciado) de Win32 de seu aplicativo gerenciado. Isso tem o mesmo efeito de que selecionar misto para tipo de depurador em um projeto Visual C++. Permite a depurao de objetos de banco de dados do SQL Server.

Depurao de cdigo no gerenciado Depurao do SQL Server

Guia Compilar: Pressione boto Opes avanadas de compilao Configurao Ativar otimizaes Descrio Esta opo deve ser desmarcada. Otimizao faz com que o cdigo que realmente executado seja diferente do cdigo fonte visto no Visual Studio, e assim torna difcil depurao. Se o cdigo otimizado, smbolos no so carregados por padro quando estiver depurando com Just My Code. Definidos por padro nas verses de lanamento e de depurao, esta configurao (equivalente a opo do compilador /debug) cria informaes da depurao ao tempo de compilao. O depurador usa essas informaes para mostrar nomes de variveis e outras informaes em um formulrio til quando voc est depurando. Se voc compila seu programa sem essas informaes, a funcionalidade do Depurador ser limitada. Para obter mais informaes, consulte /Debug.

Gerar informaes de depurao

Definir constante Definir esse smbolo permite compilao condicional das funes de sada da classe de depurao. Com esse smbolo definido, mtodos de classe de DEBUG depurao geram a sada para a Janela de sada. Sem esse smbolo, mtodos da classe de depurao no so compilados e nenhuma sada gerada. Este smbolo deve ser definido na Verso de depurao e no definido na verso de lanamento. Definir esse smbolo em uma verso de lanamento cria desnecessrio cdigo que torna o programa lento. Definir constante Definir esse smbolo permite a compilao condicional das funes de sada da classe Rastrear. Com esse smbolo definido, os mtodos de classe de Trace rastreamento geram a sada para a Janela de sada. Sem esse smbolo, mtodos de classe de rastreamento no so compilados e nenhuma sada de rastreamento gerada. Esse smbolo definido por padro para as verses de depurao e de lanamento.

Visual C# Consolidado

520

Arquivos PDB (C++)


Um arquivo (PDB) de banco de dados de programa contm informaes de estado que permite vinculao incremental de uma configurao de seu programa de depurao. Um arquivo PDB criado quando voc cria com /ZI ou /Zi (para C/C++). No Visual C++, a opo /Fd nomeia o arquivo PDB criado pelo compilador. Quando voc cria um projeto em Visual Studio usando assistentes, a opo /Fd definida para criar um PDB chamado project.PDB. Se voc criar seu aplicativo C/C++ usando um makefile, e voc especificar /ZI ou /Zi sem /Fd, voc finaliza com dois arquivos PDB:

VC80.PDB (Mais geralmente, VC x 0.PDB onde x representa a verso do Visual C++). Esse arquivo armazena todas as informaes de depurao para os arquivos OBJ individuais e reside no mesmo diretrio que o project makefile. Esse arquivo armazena todas as informaes da depurao para o arquivo .exe. Para C/C++, ele reside na subpasta \debug.

Sempre que ele cria um arquivo OBJ, o compilador C/C++ mescla informaes da depurao no VC x 0.PDB. As informaes inseridas incluem informaes de tipo mas no inclui informaes smbolo, como definies de funo. Ento, mesmo que todos os arquivos de origem incluam arquivos de cabealho como <windows.h>, os typedefs daqueles cabealhos so armazenados apenas uma vez, especialmente estando em todo arquivo OBJ. O vinculador cria project.PDB, que contm informaes da depurao para o arquivo EXE do projeto. O arquivo do project.PDB contm informaes completas da depurao, incluindo prottipos de funo, no apenas as informaes encontradas em VC x 0.PDB Os dois arquivos PDB permitem atualizaes incrementais. O vinculador tambm incorpora o caminho para o arquivo .pdb no arquivo .exe ou .dll que ele cria. O depurador Visual Studio usa o caminho para o PDB no arquivo EXE ou DLL para localizar o arquivo do project.PDB. Se o depurador no pode localizar o arquivo PDB naquele local ou se o caminho for invlido (por exemplo, se o projeto foi movido para outro computador), o depurador pesquisa o caminho que contm o EXE, os caminhos smbolo especificados na caixa de dilogo Options (pasta Debugging, n Symbols). O depurador no carregar um PDB que no coincide com o binrio que est sendo depurado.

Arquivos DBG
Este tpico se aplica a: Visual Studio Express Padro Pro / Team Visual Basic No No No C# No No No C++ Sim Sim Sim J# No No No Dev Web No No No

Visual C# Consolidado

521

Os arquivos DBG so formatos de arquivos executveis portveis (PE) que contm informaes da depurao no formato Codeview para o depurador no Visual Studio (e possivelmente outros formatos, dependendo de como o DBG foi criado). Quando voc no tem origem para determinados cdigos, tais como bibliotecas ou APIs do Windows, os arquivos DBG permitem a depurao. Os arquivos DBG tambm permitem voc para fazer depurao do OLE RPC. Arquivos DBG podem ter sido substitudos por arquivos PDB, que agora so mais comumente usados na depurao. Voc pode usar o utilitrio REBASE.EXE para tirar informaes da depurao de um executvel no formato PE e armazen-lo em um arquivo DBG. O campo de caracterstica do arquivo IMAGE_FILE_DEBUG_STRIPPED no cabealho do arquivo PE informa o depurador que as informaes do Codeview foram extradas para um arquivo DBG separado. Voc pode baixar e instalar arquivos DBG que contm smbolos de depurao de chamadas para as APIs Windows do sistema. Para obter mais informaes, consulte Instalar smbolos de depurao do sistema. Quando voc depurar utilizando smbolos de um arquivo DBG, voc deve usar os nomes totalmente decorados. Por exemplo, para definir um ponto de interrupo em uma chamada para a funo sndPlaySound do Windows, voc precisar especificar o _sndPlaySoundA@8. O depurador do Visual Studio no foi criado para depurao no modo protegido do cdigo no Kernel, mesmo com smbolos DBG. Para modo de depurao do usurio, o Visual Studio requer os seguintes arquivos:

Uma mquina Windows 2000, e os arquivos DBG e PDB no diretrio \winNT\SYMBOLS\DLL. Um computador Windows XP, e os arquivos PDB no diretrio \Windows\SYMBOLS\DLL.

Para obter mais informaes sobre arquivos DBG, consulte o artigo no KB a seguir:

Q121366, INFO: Arquivos PDB e DBG - O que so e como eles funcionam

Voc pode encontrar artigos do KB na Biblioteca do MSDN.

Instalando smbolos para sistema de depurao chamada Crashes


Para depurar uma falha que ocorre durante uma chamada para uma DLL de sistema ou biblioteca de terceiros, voc geralmente precisar dos arquivos DBG ou PDB do sistema, que contm smbolos para DLLs Windows, EXEs, e drivers de dispositivo. Voc pode obter esses smbolos de diversos lugares:

O CD-ROM do Visual Studio contm arquivos de smbolos para verses do Windows selecionadas. O CD-ROM de ferramentas de suporte do sistema operacional contm arquivos de smbolos para Windows 2000 e Windows XP. Voc pode baixar os smbolos mais recentes para sua verso do Windows em http://www.microsoft.com/whdc/ddk/debugging/symbolpkg.mspx#Windows symbol packages.

Visual C# Consolidado

522

Voc pode baixar smbolos automaticamente a partir do Microsoft symbol server em http://msdl.microsoft.com/download/symbols ou de um servidor local de smbolos que esteja configurado em sua intranet. (http://msdl.microsoft.com/download/symbols para download de smbolos somente. No navegvel.) Para obter detalhes, consulte Usando um servidor de smbolos.

O fornecedor de terceiros pode tornar os smbolos disponveis.

Depurao de projetos DLL


Vrios modelos de projeto do Visual Studio criam DLLs, que so depurados de forma diferente de aplicativos autnomos. A depurao de DLLs muito semelhante a depurao de aplicativos autnomos. Os seguintes modelos criam DLLs:

(C++): MFC ActiveX Control Controles ActiveX so controles que podem ser baixados atravs da Internet para um computador cliente, e exibidos e ativados em pginas da Web. A depurao deles semelhante a depurao de outros tipos de controles em que no possvel executar como autnomo, mas devem ser incorporados em uma pgina da Web em HTML. Para obter mais informaes, consulte Como depurar um controle ActiveX:.

(C++): MFC DLL Para obter mais informaes, consulte Tcnicas de depurao MFC. (C++): MFC ISAPI Extension DLL (C++): ATL Project Para obter mais informaes, consulte Tcnicas de depurao atl. (C++): Class Library (C++): Windows Control Library A depurao de uma biblioteca de controles do Windows semelhante a depurao de um projeto de biblioteca de classes. Na maioria dos casos, voc chamar o controle do Windows a partir de outro projeto. Quando voc depurar o projeto de chamada, voc pode entrar em cdigo do seu controle do Windows, definir pontos de interrupo, e realizar outras operaes de depurao. Para obter mais informaes, consulte Controles de Formulrios Windows.

(C#, J#, and Visual Basic): Class Library (C#, J#, and Visual Basic): Windows Control Library (C#, J#, and Visual Basic): Web Control Library Para obter mais informaes, consulte Web Control Library (Cdigo Gerenciado).

Esta seo tambm contm informaes sobre os seguintes tpicos:


Como depurar do um Project DLL: HOW TO: Depurar no modo misto

Este tpico contm as sees a seguir, que fornecem consideraes sobre a preparao para depurar bibliotecas de classes:

Visual C# Consolidado

523

Building a Debug Version Mixed-Mode Debugging Changing Default Configurations Ways to Debug the DLL The Calling Application Controls on a Web Page The Immediate Window

Criando uma verso de depurao No importa como voc inicie a depurao, certifique-se de criar a verso de depurao da DLL primeiro e certifique-se que a verso de depurao est no local onde o aplicativo espera localizlo. Isso pode parecer bvio, mas se voc esquecer desta etapa, o aplicativo pode localizar uma verso diferente da DLL e carreg-la. O programa ento continuar a ser executado, enquanto voc fica imaginando por que o ponto de interrupo nunca foi atingido. Quando voc estiver depurando, voc pode verificar quais DLLs seu programa carregou abrindo o depurador na janela Modules. A janela Modules lista cada DLL ou EXE carregados no processo que voc est depurando. Para obter mais informaes, consulte Como: Usar a Janela Mdules (Mdulos). Para o depurador anexar a cdigos escritos em C++, o cdigo precisa emitir DebuggableAttribute. Voc pode adicionar isso ao seu cdigo automaticamente por meio da vinculao com a opo de linker /ASSEMBLYDEBUG. Modo misto de depurao O aplicativo que chama sua DLL pode ser escrito em cdigo gerenciado ou cdigo nativo. Se a DLL gerenciada chamado pelo cdigo nativo e voc precisar depurar ambos, os depuradores gerenciado e nativo devem ambos estar habilitados. Voc pode verificar isso na caixa de dilogo ou janela <Project> Property Pages. Como fazer isso depende de como voc iniciou a depurao do projeto de DLL ou o projeto do aplicativo que chama. Para obter mais informaes, consulte HOW TO: Depurar no modo misto. Alterando configuraes padro Quando voc cria um projeto de aplicativo console com o modelo de projeto, o Visual Studio cria automaticamente as configuraes necessrias para as configuraes Debug e Release. Se necessrio, voc pode alterar essas configuraes. Para obter mais informaes, veja Configuraes do projeto para uma configurao de depurao no Visual Basic, Configuraes do projeto para um C++ depurar configurao, Configuraes de projeto para depurar C# e J# e HOW TO: definir depurao e configuraes de verso. Maneiras de depurar a DLL Cada um dos projetos nesta seo cria uma DLL. No possvel executar uma DLL diretamente; ela deve ser chamada por um aplicativo (geralmente um EXE). Para obter mais informaes, consulte Criando e gerenciando projetos Visual C++. O aplicativo de chamada pode:

Ser criado em outro projeto na mesma soluo Visual Studio que contm a biblioteca de classes. Um programa existente j implantado em um computador de teste ou produo. Ser localizado na Web e acessado atravs de um URL. Ser um aplicativo da Web que contm uma pgina da Web que incorpore a DLL.

Visual C# Consolidado

524

Depurando o aplicativo de chamada


Para depurar uma DLL, inicie depurando o aplicativo de chamada, geralmente um executvel ou um aplicativo da Web. H vrias maneiras para depurar.

Se voc tiver um projeto para o aplicativo de chamada, voc pode abrir esse projeto e comear a execuo a partir do menu Debug. Para obter mais informaes, consulte Como iniciar execuo:. Se o aplicativo de chamada um programa existente j implantado em um computador de teste ou produo e j est sendo executado voc pode anexar a ele. Use este mtodo se a DLL for um controle hospedado pelo Internet Explorer, ou um controle em uma pgina da Web. Para obter mais informaes, consulte Como: Anexar a um Processo em Execuo:. Voc pode depur-la a partir do projeto de DLL. Para obter mais informaes, consulte Como depurar do um Project DLL:. Voc pode depur-la a partir da janela Visual Studio Immediate: neste caso a janela Immediate atua no papel de aplicativo.

Antes de iniciar a depurao do aplicativo de chamada, voc geralmente desejar definir um ponto de interrupo na biblioteca de classes. Para obter mais informaes, consulte Pontos de interrupo e Tracepoints. Quando o ponto de interrupo alcanado, voc pode depurar o cdigo, observando a ao em cada linha, at que voc isole o problema. Para obter mais informaes, consulte Cdigo Overview Stepping.

Controles em uma pgina da Web


Para depurar um controle de pgina da Web, crie uma pgina ASP.NET que o incorpore, se essa pgina j no existir. Voc ento coloca pontos de interrupo no cdigo da pgina da Web, bem como no cdigo do controle. Voc ento chama a pgina da Web do Visual Studio. Antes de iniciar a depurao do aplicativo de chamada, voc geralmente desejar definir um ponto de interrupo na DLL. Quando o ponto de interrupo alcanado, voc pode depurar o cdigo, observando a ao em cada linha, at que voc isole o problema. Para obter mais informaes, consulte Pontos de interrupo e Tracepoints e Cdigo Overview Stepping.

A janela Immediate
Voc pode avaliar funes ou mtodos na DLL sem ter um aplicativo de chamada, fazendo depurao em tempo de design utilizando a janela Immediate. Para depurar dessa forma, faa o seguinte enquanto o projeto DLL est aberto: 1. 2. Abra a janela Immediate do depurador. Para testar um mtodo denominado Test na classe Class1, instancie um objeto do tipo Class1, digitando o cdigo C# a seguir na janela Immediate, esse procedimento funciona para outras linguagens gerenciadas (C++, VB, J#,) com alteraes de sintaxe apropriadas:
Class1 obj = new Class1();

Em C#, todos os nomes devem ser totalmente qualificados. Alm disso, quaisquer mtodos ou variveis devem estar no escopo atual e no contexto da sesso de depurao. 3. Supondo que Test usa um parmetro int, avalie Test utilizando a janela Immediate:
?obj.Test(10)

O resultado ser impresso na janela Immediate.

Visual C# Consolidado

525

4.

Voc pode continuar a depurao de Test colocando um ponto de interrupo dentro dele e depois avaliando a funo novamente:
?obj.Test(10);

O ponto de interrupo ser atingido e voc poder andar pelo cdigo Test. Depois da execuo deixar Test, o depurador estar novamente no modo de design.

Preparao da depurao: Projetos de console


A preparao para depurar um projeto de console semelhante a preparao para depurar um projeto do Windows, com algumas consideraes adicionais. Para obter mais informaes, veja Depurao preparao: Applications formulrios Windows (.NET) e Preparao para depurao: Aplicativos de Windows Forms. Devido semelhana de todos os aplicativos de console, este tpico aborda os seguintes tipos de projeto:

Aplicativo de console do C# Aplicativo de console do Visual Basic Aplicativo de console do J# Aplicativo de console do C++ (.NET) Aplicativo de console do C++ (Win32)

Voc talvez precisar especificar os argumentos para seu aplicativo de console na linha de comando. Para obter mais informaes, consulte Configuraes do projeto para um C++ depurar configurao, Configuraes do projeto para depurar a configurao no Visual Basic , ou Configuraes de projeto para depurar C# e J#. Como todas as propriedades do projeto, esses argumentos persistem entre as sesses de depurao e entre as sesses do Visual Studio. Ento, se o console da aplicao foi debugado anteriormente, lembre-se que talvez alguns argumentos de sesses anteriores foram adicionados na caixa de dilogo <Project> Property Pages. Um aplicativo de console usa a janela Console para aceitar uma entrada e para exibir mensagens de sada. Para escrever na janela Console, o aplicativo deve usar o objeto Console em vez do objeto Debug. Para escrever na janela Visual Studio Output, use o objeto Debug como de costume. Verifique se voc sabe onde o aplicativo est gravando ou voc pode estar procurando por mensagens no lugar errado. Para obter mais informaes, consulte Classe console, Depurar a classe e Janela de sada. Quando estiver depurando um aplicativo de console, convm iniciar o aplicativo do prompt de comando e no da Visual Studio. Nesse caso, voc pode iniciar o aplicativo do prompt de comando e conectar o depurador do Visual Studio a ele. Para obter mais informaes, consulte Anexando a processos em execuo. Quando voc inicia um aplicativo do Visual Studio, a janela Console s vezes aparece por trs da janela Visual Studio. Se voc tentar de iniciar seu aplicativo de console do Visual Studio, e nada parece acontecer, tente mover a janela Visual Studio.

Preparao de Depurao: Tipos de Projeto do Visual C++


Esta seo descreve como depurar os tipos de projeto bsico criados pelos modelos de projeto Visual C++.

Visual C# Consolidado

526

Observe que esses tipos de projeto que criam DLLs como sua sada esto sendo agrupados em Depurao de projetos DLL devido aos recursos comuns que eles compartilham. Dois tipos de projeto do Visual C++ (ATL Server Web Service e ATL Server Projects) esto includos na Aplicativos da Web depurao preparao: porque as tcnicas de depurao usadas com eles tm mais em comum com aplicativos da Web.

Preparao da Depurao: Configuraes de Propriedades Recomendveis


Certas propriedades devem ser definidas da mesma maneira para todos os cenrios de depurao no gerenciados. As tabelas a seguir exibem configuraes de propriedades recomendadas. Configuraes no listadas aqui podem variar entre os tipos diferentes de projetos no gerenciados. Propriedades de Configurao | C/C++ | N de Otimizao Property Name

Setting

Optimization Defina como Disabled (/0d). O cdigo otimizado mais difcil para depurar, porque as instrues geradas no correspondem diretamente ao seu cdigo fonte. Se voc encontrar o programa que possui um erro que aparece somente no cdigo otimizado, voc pode ativar esta configurao, mas lembre que o cdigo mostrado na janela Disassembly gerado de fonte otimizada que pode no corresponder ao que voc v nas suas janelas de origem. Outros recursos, como depurao, podem no se comportar conforme o esperado. Propriedades de Configurao | Vinculador |N de Depurao Property Name Generate debugging information Setting Voc deve sempre definir esta opo para Yes (/DEBUG) para criar arquivos necessrios para depurao e smbolos de depurao. Quando o aplicativo entra em produo, voc pode definir ela como off.

Depurao preparao: Applications formulrios Windows (.NET)


O modelo de aplicativo Windows Forms (.NET) cria um aplicativo Visual C++ de Windows Forms. Para obter mais informaes, consulte How to: Create a Windows Application Project. A depurao desse tipo de aplicativo no Visual Studio semelhante ao de aplicativos gerenciados Windows Forms. Quando voc cria um projeto Windows Forms com o modelo de projeto, o Visual Studio cria automaticamente as configuraes necessrias para Debug e Release. Se necessrio, voc pode alterar essas configuraes na caixa de dilogo <project name> Property Pages. Para obter mais informaes, consulte Configuraes para Debug e Release.

Visual C# Consolidado

527

Para obter mais informaes, consulte Alterando as configuraes de projeto para depurao C ou C++. Outra maneira de depurar um aplicativo de Windows Forms consiste em iniciar o aplicativo fora do Visual Studio e anexar a ele. Para obter mais informaes, consulte Anexando a um programa em execuo ou a vrios programas. Para configuraes de projeto recomendadas, consulte Preparao da Depurao: Configuraes de Propriedades Recomendveis. Para depurar um aplicativo de Windows Forms do Visual C++ 1. 2. 3. Abra o projeto no Visual Studio. No menu Debug, clique em Start. Depure usando as tcnicas discutidas em Usando o depurador.

Projetos Win32 depurao preparao:


Aplicativos Win32 so programas tradicionais Windows escritos em C ou C++. A Depurao desse tipo de aplicativo no Visual Studio simples. Aplicativos Win32 incluem aplicativos MFC e projetos ATL. Eles usam APIs Windows e podem usar MFC ou ATL, mas no usam Common Language Runtime (CLR). No entanto, eles podem, chamar cdigo gerenciado que usa o CLR. O procedimento a seguir explica como depurar um projeto Win32 a partir do Visual Studio. Outra maneira para depurar um aplicativo Win32 consiste em iniciar o aplicativo fora do Visual Studio e anex-lo. Para obter mais informaes, consulte Anexando a processos em execuo. Para depurar um aplicativo C ou C++ Win32 1. 2. 3. Abra o projeto no Visual Studio. No menu Debug, escolha Start. Depurao usando as tcnicas discutidas no Explicao detalhada sobre o depurador. Quando voc cria um projeto do Windows Application com o assistente, o Visual Studio cria automaticamente configuraes necessrias para as configuraes Debug e Release. Se necessrio, voc pode alterar essas configuraes. Para obter mais informaes, consulte HOW TO: definir depurao e configuraes de verso. Para definir uma configurao Debug manualmente 1. 2. 3. 4. No menu View, clique em Property Pages. Clique no n Configuration Properties para abri-lo se ele no estiver aberto. Selecione General, e defina o valor da linha Output para Debug. Abra o n C/C++, e selecione General. Na linha Debug voc especifica o tipo de informaes de depurao a ser gerado pelo compilador. Voc pode escolher os valores que incluem Program Database (/Zi) ou Program Database for Edit & Continue (/ZI). 5. Selecione Optimization, e na linha Optimization, selecione Disabled (/0d) da lista suspensa. Cdigo otimizado mais difcil de depurar, desde que as instrues geradas no correspondam diretamente s de seu cdigo fonte. Se voc encontrar um erro no seu programa que aparece somente no cdigo otimizado, voc pode ativar esta configurao,

Visual C# Consolidado

528

mas lembrar que o cdigo mostrado na janela Disassembly foi gerado de fonte otimizada que pode no corresponder ao que voc v nas suas janelas de origem. Recursos, tal como depurao provavelmente mostram pontos de interrupo e ponto de execuo incorretamente. 6. Abra o n Linker, e selecione Debugging. Na primeira linha Generate, selecione Yes (/DEBUG) na lista drop-down. Sempre defina isto quando voc estiver depurando. Para obter mais informaes, consulte Configuraes do projeto para um C++ depurar configurao.

Preparao da Depurao: Web Services XML (C++)


Quando voc cria um servio XML da Web com o Visual C++, Visual Studio cria o padro de configuraes do projeto para depurao. Quando voc escolhe o Start a partir do menu Debug essas configuraes podem causar que o Visual Studio inicie o navegador selecionado na <Project> Properties Pages e gere dinamicamente uma pgina de teste. Na pgina de teste, voc pode digitar comandos e observar os dados que so retornados pelo servio XML da Web Observao Para o depurador anexar o cdigo C++ compilado com o /clr, o cdigo precisa emitir DebuggableAttribute. Voc pode adicionar isso para que seu cdigo automaticamente por meio da vinculao com a opo /ASSEMBLYDEBUG do vinculador. Depurao de uma chamada para o servio XML da Web de um aplicativo cliente Quando um aplicativo cliente chama um servio XML da Web, o depurador se anexa ao aplicativo cliente e o processo ASP.NET, Aspnet_wp.exe, e o controle de chamadas SOAP, aps a cadeia da pilha de chamadas para o processo do servio XML da Web. Para obter mais informaes, consulte Servios XML da Web no cdigo gerenciado. Alterando as configuraes padro Quando voc cria um projeto Servio XML da Web com o modelo de projeto, o Visual Studio cria automaticamente as configuraes necessrias para as configuraes de Debug e Release. Se necessrio, voc pode alterar essas configuraes. Para obter mais informaes, consulte Alterando as Configuraes do Projeto para configuraes de debug no C ou C++ e Configuraes de Debug e Release.

Preparao para depurao: tipos de projeto C#, J# e Visual Basic


Os tpicos nesta seo descrevem como depurar os tipos de projeto C# e Visual Basic criados pelos modelos de projeto do Visual Studio. Observe que aqueles tipos de projeto que criam DLLs como sada so agrupados em Depurao de projetos DLL devido aos recursos comuns que eles compartilham.

Aplicativos da Web depurao preparao:


Esta seo descreve como depurar os tipos de projeto bsicos criados pelos modelos de projeto paras sites da Web.

Visual C# Consolidado

529

Dois dos tipos de projeto (ATL Server Web Service e ATL Server Projects) so na verdade tipos Visual C++, mas so includas aqui porque as tcnicas de depurao usadas com eles tm mais em comum com aplicativos da Web.

Preparao para depurao : Aplicativos ASP.NET da Web


O modelo ASP.NET de Site da Web cria um aplicativo de formulrio da Web. Quando voc cria um site da Web usando esse modelo, Visual Studio cria as configuraes padro para depurao. Na caixa de dilogo Project Properties, voc pode especificar se deseja que pgina da Web seja uma pgina de inicializao. Quando voc inicia a depurao um ASP.NET site da Web com essas configuraes padro, Visual Studio inicia o Internet Explorer e anexa o depurador ao processo ASP.NET de trabalho (Aspnet_wp.exe ou W3wp.exe). Para obter mais informaes, consulte Requisitos do sistema ASP.NET depurao:. Para criar um aplicativo de formulrios da Web 1. 2. 3. 1. 2. No menu File, escolha New Web Site. Na caixa de dilogo New Web Site, selecione ASP.NET Web Site. Clique em OK. Defina um ou mais pontos de interrupo nas suas funes e manipuladores de eventos. Para obter mais informaes, consulte Pontos de interrupo e Tracepoints. Quando um ponto de interrupo pressionado, depure cdigo dentro a funo, observando a execuo do seu cdigo at que voc isole o problema. Para obter mais informaes, consulte Cdigo Overview Stepping e Depurar aplicativos da Web. Alterando configuraes padro Caso voc precise alterar a depurao padro e configuraes de verso criadas por Visual Studio, poder fazer isso. Para obter mais informaes, consulte HOW TO: definir depurao e configuraes de verso. Para alterar a configurao de depurao padro 1. 2. 3. 4. Clique com o boto direito do mouse no site da web no Solution Explorer, e selecione Property Pages para abrir a caixa de dilogo Property Pages. Clique em Start Options. Defina Start Action como a pgina da Web que primeiro deve ser exibida. Em Debuggers, certifique-se de que ASP.NET debugging verificada. Para obter mais informaes, consulte Configuraes de Property Pages para Projetos da Web.

Para depurar o seu formulrio da Web

Projetos Servio da Web XML depurao preparao:


O modelo de projeto de XML Web Services cria as configuraes de projeto padro para a depurao. Para obter mais informaes, consulte COMO: Criar Projetos de Servio da Web ASP.NET.

Visual C# Consolidado

530

Tambm necessrio configurar o arquivo web.config para ativar a depurao. Isso pode ser configurado manualmente ou automaticamente. Para obter mais informaes, consulte Como ativar depurao para aplicativos ASP.NET:. Para iniciar a depurao, escolha Start no menu Debug. Se voc no ativou manualmente a depurao, a caixa de dilogo Debugging Not Enabled ser exibida, o que lhe dar a opo de ter um arquivo web.config automaticamente criado com depurao ativada, ou executando sem depurao. Depois de esta caixa de dilogo fechar, as configuraes de projeto fazem com que o Visual Studio inicie o navegador selecionado em <Project> Properties Pages e gere dinamicamente uma pgina de teste. Na pgina de teste, voc pode digitar comandos e observar os dados que so retornados pelo seu XML Web Services. Depurao de um XML Web Services de um aplicativo cliente H dois mtodos para depurar um XML Web Services de um aplicativo cliente. Para depurar por um aplicativo cliente e servidor Web XML (mtodo 1) 1. 2. No Visual Studio, crie um novo projeto de XML Web Services. Para obter mais informaes, consulte COMO: Criar Projetos de Servio da Web ASP.NET. No menu Debug, clique em Start para executar o XML Web Services. Esta etapa no somente permite que voc teste se o servio da Web est funcionando, como tambm cria o arquivo web.config, que necessrio para a depurao. 3. 4. 5. 6. 7. 8. 9. No menu Debug, clique em Stop Debugging. Crie um projeto de aplicativo cliente na mesma soluo que seu projeto de XML Web Services. Para fazer isso, no menu Debug, clique em Add New Project. No Solution Explorer, clique com o boto direito do mouse no projeto do cliente e clique em Properties no menu de atalho. Na janela Solution <Name> Properties, abra o n Common Properties e selecione Startup Project. Clique em Multiple Startup Projects. Em Multiple Startup Projects, v para a coluna Action e defina a ao como Start para ambos os projetos. Clique em OK para fechar a janela Solution <Name> Properties.

10. No menu Debug, clique em Start para depurar o aplicativo cliente e o servidor Web XML. Para depurar passando de um aplicativo cliente para um servidor Web XML 1. 2. No Visual Studio, crie um novo projeto de XML Web Services. Para obter mais informaes, consulte COMO: Criar Projetos de Servio da Web ASP.NET. No menu Debug, clique em Start para executar o XML Web Services. Esta etapa no somente permite que voc teste se o servio da Web est funcionando, como tambm cria o arquivo web.config, que necessrio para a depurao. 3. 4. 5. No menu Debug, clique em Stop Debugging. Crie um projeto de aplicativo cliente, na mesma soluo que seu projeto de XML Web Services ou em uma soluo diferente. Em seu projeto do cliente, adicione uma referncia da Web e uma chamada sncrona para o servio da Web.

Visual C# Consolidado

531

6. 7.

No Solution Explorer, clique com o boto direito do mouse no projeto do cliente e clique em Set As Startup Project no menu de atalho. No menu Debug, clique em Start para executar o aplicativo cliente. Quando o aplicativo cliente chama o XML Web Services, o depurador automaticamente entra e inicia a depurao do XML Web Services.

Preparao para depurao: Servios da Web ATL Server


O projeto ATL Server Web Services oferece uma maneira fcil de gerar aplicativos XML Web services que usam ATL Server, um conjunto de classes no gerenciadas de C++ projetadas para tais aplicativos. A depurao de um aplicativo de servios da Web ATL Server muito semelhante depurao de um aplicativo Win32, com alguns fatores adicionais a serem considerados. Servios da Web ATL Server so implementados como extenses ISAPI.

Preparao para depurao: Projetos ATL Server


O Projeto ATL Server oferece uma maneira fcil de gerar aplicativos da Web que usam ATL Server, um conjunto de classes C++ projetadas para tais aplicativos no gerenciados. Depurando um aplicativo ATL Server muito semelhante a depurar um aplicativo Win32, com alguns fatores adicionais a serem considerados. Aplicativos ATL Server so implementados como extenses ISAPI. Para obter mais informaes, consulte Tcnicas de depurao atl. Como depurar uma parte de uma soluo Visual Studio no executvel: s vezes, convm depurar um executvel que no faz parte de um projeto Visual Studio . Pode ser um executvel criado por voc fora do Visual Studio ou um executvel que voc recebeu de outra pessoa. A resposta normal para este problema iniciar o executvel fora do Visual Studio e anexar a ele usando o depurador Visual Studio. Para obter mais informaes, consulte Anexando a processos em execuo. Anexar a um aplicativo requer algumas etapas manuais, portanto leva alguns segundos. Esse pequeno atraso significa que anexar no ajudar se voc estiver tentando depurar um problema que ocorre durante a inicializao. Alm disso, se voc estiver depurando um programa que no espera uma entrada de usurio e termina rapidamente, voc pode no ter tempo para anexar a ele. Se voc tiver o Visual C++ instalado, voc pode criar um projeto EXE para esse programa. Para criar um projeto EXE para um executvel existente 1. 2. 3. No menu Open, clique em File e selecione Project. Na caixa de dilogo Open Project, clique na seta Files of type, e selecione Executable Files. Localize o executvel, e clique em OK. Isso cria uma soluo temporria que contm o executvel. Como alternativa, voc pode importar um executvel para uma soluo Visual Studio existente.

Visual C# Consolidado

532

Para importar um executvel para uma soluo Visual Studio 1. 2. 3. 4. No menu File, clique em Add Project e, em seguida, clique em Existing Project. Na caixa de dilogo Add Existing Project, localize e selecione o executvel. Clique em OK. Inicie o executvel, escolhendo um comando de execuo, como Start, no menu Debug. Observao Nem todas as linguagens de programao oferecem suporte a projetos EXE. Instale o Visual C++ se voc precisar usar este recurso. 5. Quando voc estiver depurando um executvel sem o cdigo fonte, os recursos de depurao disponveis so limitados, anexando a um executvel em execuo ou adicionando o executvel a uma soluo Visual Studio. Se o executvel foi criado sem informaes de depurao em um formato compatvel, os recursos disponveis sero mais limitados. Se voc tiver o cdigo fonte, a melhor abordagem importar o cdigo-fonte no Visual Studio e criar um compilao para depurao do executvel no Visual Studio.

Instalao de depurao remota


Este tpico se aplica a: Visual Studio Edition Express Edition Standard Edition Pro/Team Edition Visual Basic No No Sim C# No No Sim C++ No No Sim J# No No Sim Web Dev No No Sim

Visual Studio oferece suporte remoto de depurao de uma mquina para outra. Quando voc estiver realizando depurao remota, o computador host pode ser qualquer plataforma que oferece suporte Visual Studio. O computador remoto pode ser uma plataforma 32 bits (Windows 98/Me, Windows 2000, Windows XP ou Windows Server 2003) ou 64 bit (IA64, IA64 modo WOW, x64 ou x64 modo WOW).

Como: Depurar com Fonte Premium do Centro do Cdigo


Com o depurador do Visual Studio, voc pode depurar fonte compartilhada segura do Microsoft MSDN Code Center Premium. Este tpico explica como configurar e depurar o cdigo fonte Code Center Premium no Visual Studio. Para configurar o centro de cdigo premium 1. 2. Insira seu carto Code Center Premium no leitor SmartCard conectado ao seu computador. Insira o Code Center Premium Welcome Kit CD na unidade de CD-ROM.

Visual C# Consolidado

533

3. 4. 5. 1. 2. 3. 4. 5. 6.

Se o disco no Autorun, localize e execute o arquivo de instalao: Bem-vindo Kit CD\Source Code\CDROM_FILES\install.exe Para procurar fonte Code Center Premium, inicie o Internet Explorer e digite: https://codepremium.msdn.microsoft.com Navegue at localizar o cdigo fonte que deseja. Especifique um diretrio local para a fonte compartilhada segura Code Center Premium, conforme descrito abaixo. Inicie o Visual Studio. A partir do menu Tools, escolha Options. Na caixa de dilogo Options, abra o n Debugging e selecione Symbols. Na caixa Symbol File Locations, adicione o seguinte local: https://codepremium.msdn.microsoft.com/symbols Na caixa Cache symbols from symbol servers in this directory, digite um local onde Code Center Premium pode armazenar smbolos. Por exemplo:
c:\symbols

Para depurar a fonte do cdigo central premium

Se voc anteriormente tiver armazenado smbolos no mesmo local, talvez no precise limpar o cache, o qual pode conter verses mais antigas dos smbolos sem informaes Code Center Premium. 7. 8. 9. Abra o projeto no Visual Studio. No Solution Explorer, clique com o boto direito do mouse no nome da soluo e escolha Properties a partir do menu de atalho. Na caixa de dilogo Solution Property Pages, abra o n de propriedades comuns e selecione Debug Source Files.

10. Entre na caixa Directories containing source code, digite o local do cdigo fonte Code Center Premium. Voc pode localizar a origem por navegao https://codepremium.msdn.microsoft.com no Internet Explorer, copiando o local de sua barra de endereos do Internet Explorer. O local que voc digita deve ser como este: https://codepremium.msdn.microsoft.com/Source/windows XP/SP1 (Este exemplo para cdigo fonte Windows XP SP1.) 11. Clique em OK. 12. Quando voc comear a depurao fonte Code Center Premium e o depurador inserir o modo de interrupo, uma caixa de dilogo solicita que voc digite o nmero SmartCard PIN. 13. Digite o nmero PIN que voc recebeu com o Code Center Premium Welcome Kit. O depurador baixa a fonte Code Center Premium. Especificando o Diretrio Local para Code Center Premium Source Antes que voc possa depurar a Code Center Premium secure shared source, voc deve especificar um diretrio local para a fonte em sua mquina. Voc pode alterar este local, editando uma chave do registro.

Para alterar o diretrio local padro para code center premium source Visual C# Consolidado 534

1. 2.

Saia do Visual Studio, se ele estiver sendo executado. No prompt de comando do Windows, digite:
regedt32

3. 4. 5.

Na janela Registry Editor , abra: HKEY_CURRENT_USER\Software\MSFT\VisualStudio\8.0\Debugger Na coluna Name, clique duas vezes em SecureSourceLocalDirectory. Edite a Value data (inicialmente uma seqncia vazia) para o local desejado para usar como um diretrio local. Se voc alterar as configuraes IDE do Visual Studio, voc pode precisar repetir este processo.

Como: Depurar um aplicativo de confiana parcial Este tpico se aplica a: Visual Studio Edition Express Padro Pro / Team Visual Basic Sim Sim Sim C# Sim Sim Sim C++ No No No J# Sim No Sim

Se aplica a aplicaes Windows e de console. No vlido para dispositivos inteligentes. Implantao de ClickOnce torna fcil de implantar aplicativos parcialmente confiveis que se beneficiam de Code Access Security para limitar o acesso a recursos em uma mquina. Depurar um aplicativo confiana parcial-pode ser um desafio, aplicativos de confiana parcial tem diferentes permisses de segurana (e portanto tem um comportamento diferente) dependendo da onde eles esto instalados. Se instalado a partir da Internet, um aplicativo com confiana parcial ter algumas permisses. Se instalado de uma intranet local, ter mais permisses, e se instalado no computador local, ela ter permisses totais. Voc tambm pode ter personalizado zonas, com permisses personalizadas. Convm depurar um aplicativo com confiana parcial em qualquer ou todas essas condies. Felizmente, Visual Studio facilita isso tambm. Antes de iniciar uma sesso de depurao no Visual Studio, voc pode escolher a zona que voc deseja simular um aplicativo instalado. Quando voc iniciar a depurao, o aplicativo ter permisses apropriadas para um aplicativo com confiana parcial instalado a partir dessa zona. Isso permite que voc veja o comportamento do aplicativo como ele apareceria a um usurio que baixou ele da zona. Se o aplicativo tenta executar uma ao que no tem permisso, ocorrer uma exceo. Nesse momento, o assistente de exceo oferece a oportunidade de adicionar uma permisso extra que permite voc reiniciar a sesso de depurao com permisses suficientes para evitar o problema. Posteriormente, voc poder voltar atrs e consultar quais permisses voc adicionou durante a depurao. Se voc teve que adicionar uma permisso durante a depurao, provavelmente isso indica que voc precisar adicionar um User Consent Prompt nesse ponto no seu cdigo.

Visual C# Consolidado

535

Observao Visualizadores do depurador exigem maior privilgios que so permitidos por um aplicativo parcialmente confivel. Visualizadores no sero carregados quando voc est parado no cdigo com confiana parcial. Para depurar usando um visualizador, voc deve executar o cdigo com confiana total. Para escolher uma zona para seu aplicativo com confiana parcial 1. 2. 3. 4. No menu Project escolha Projectname Properties. Nas pginas da propriedade Projectnameclique na pgina Security. Selecione Enable ClickOnce Security Settings. Em Zone your application will be installed from, clique na caixa de listagem e escolha a zona que voc deseja simular o aplicativo que est sendo instalado. A grade Permissions required by the application mostra todas as permisses disponveis. A marca de seleo indica permisses concedidas ao seu aplicativo 5. 6. 1. 2. 3.
o

Se a zona que voc escolher for (Custom), selecione correto as configuraes personalizadas na coluna Setting da grade Permissions. Clique OK para fechar as pginas de propriedades. A caixa de dilogo Exception Assistant ser exibida com a mensagem: SecurityException
was unhandled.

Para adicionar uma permisso extra quando uma exceo de segurana ocorre

Na caixa de dilogo Exception Assistant em Actions, clique em Add Permission to the Project. A caixa de dilogo Restart Debug ser exibida. Se voc desejar reiniciar a sesso de depurao com a nova permisso, clique em Yes. Se voc no desejar reiniciar ainda, clique em No. No menu Project escolha Projectname Properties. Nas pginas de propriedades Projectname clique na pgina Security. Procure na grade Permissions required by the application. Qualquer permisso extra que voc adicionou possui dois cones na coluna Included: a marca de seleo normal, que todas permisses includas possuem e um cone adicional que parece com um balo contendo a letra " i ". Use a barra de rolagem vertical para exibir a grade inteira Permissions required by the application.

Para exibir as permisses adicionadas durante a depurao extra 1. 2. 3.

4.

Como: depurar um aplicativo de cluster remoto Este tpico se aplica a: Edio do Visual Studio Express Visual Basic No C# No C++ No J# No Visual Web Developer No

Visual C# Consolidado

536

Padro Pro / Team

No No

No No

No Sim

No No

No No

O Visual Studio agora oferece suporte a depurao de cluster MPI. Esse recurso permite que voc depure programas paralelos executados em um cluster de computadores que se comunicam atravs da Message Passing Interface (MPI). Pr-requisitos para depurao MPI

A MPI deve ser instalada e configurada em cada mquina no cluster. A MPI est includa no Windows Server 2003, Compute Cluster Edition. Outras implementaes da MPI esto disponveis. O MPIShim.exe deve ser instalado em cada mquina no cluster. MPIShim est includo no Visual Studio 2005 e instalado com os componentes de depurao remota para ativar a depurao paralela. O MPIShim pode ser instalado em qualquer diretrio, mas deve estar no mesmo diretrio em cada mquina no cluster. Um caminho possvel :
c:\windows\system32\mpishim

Como alternativa, ele pode ser instalado em um diretrio local ao alvo de depurao.

O Remote Debugging Monitor (msvsmon) deve estar em cada mquina no cluster. Consulte Como: executar o monitor de depurao remota:. O hospedeiro do Visual Studio (o computador de onde voc est depurando) deve ser configurado com uma conta que tenha os privilgios apropriados para depurar os computadores do cluster. (Consulte Permisses de depurao remota.) 1. 2. 3. 4. 5. Abra a soluo que contm o aplicativo paralelo no Visual Studio. No Solution Explorer, clique com o boto direito do mouse no projeto e escolha Properties a partir do menu de atalho. Na caixa de dilogo Project Properties , selecione Debugging. Na caixa de listagem Debugger to Launch, escolha MPI Cluster Debugging. Na caixa MPIRun command, digite a localizao do MPIRun ou MPIExec (que inicia o aplicativo MPI) na mquina do cluster. Por exemplo:
c:\windows\system32\mpiexec.exe

Para preparar um projeto do Visual Studio para depurao MPI

6.

Na caixa MPIRun arguments, digite os argumentos que voc deseja passar para MPIRun ou MPIExec. Por exemplo:
-np 2

7.

Na caixa MPIRun working directory, digite a pasta de trabalho para MPIRun ou MPIExec. Por exemplo:
c:\temp

8.

Na caixa Application Command, digite o caminho para o aplicativo que o MPI ir executar em cada mquina cluster (que tambm o aplicativo cujo projeto est aberto no Visual Studio). O caminho pode ser um compartilhamento ou um caminho local em cada mquina no cluster. Se ele for um caminho local, o caminho deve ser idntico em cada mquina. Por exemplo:
$(TargetPath)

Visual C# Consolidado

537

9.

Na caixa Application Arguments, digite quaisquer argumentos que voc deseja passar para o aplicativo.
c:\windows\system32\mpishim

10. Na caixa MPIShim location, digite o caminho para o MPIShim.exe. Por exemplo: 11. Voc pode deixar a caixa de listagem Debugger Type definida como auto (o padro) e o depurador ir escolher o tipo de depurador correto para o cdigo que est executando. Como alternativa, voc pode escolher o tipo correto (native, managed ou mixed code) para seu aplicativo. 12. Feche a caixa de dilogo Project Properties. 13. A partir do menu Tools, escolha Options. 14. Na caixa de dilogo Options, selecione o n Debugging, categoria General. 15. Localize a caixa de seleo When one process breaks, break all other processes. Marque ou desmarque a caixa de seleo de acordo com o comportamento desejado durante a sesso de depurao. (Como essa uma opo de Tools, essa configurao permanecer em vigor para todos os projetos at voc alter-la.) Para obter mais informaes, consulte Como interromper a execuo:. 16. Clique OK para fechar a caixa de dilogo Options. Para depurar o aplicativo paralelo 1. No menu Debug, clique em Start para iniciar a depurao. Se voc tiver configurado o projeto corretamente, o aplicativo comear executando em todos os computadores no cluster. Se voc tiver definido pontos de interrupo no seu cdigo, a execuo interromper no primeiro ponto de interrupo. 2. No menu Debug, clique Windows, e clique em Processes. A janela Processes. Voc pode usar esta janela para definir um processo ativo. Para passar somente pelo nico processo ativo, use os botes na parte superior da janela. Voc pode usar DataTips para obter valores de variveis enquanto estiver depurando um aplicativo paralelo. Os valores de variveis que voc v nas DataTips sero baseados no processo ativo atual definido na janela Processes. Como: Depurar Aplicativos de 64 bits: Este tpico se aplica a: Edio do Visual Studio Express Standard Pro / Team Visual Basic Sim Sim Sim C# Sim Sim Sim C++ Sim Sim Sim J# No No No

Voc pode depurar um aplicativo de 64 bits que esteja executando no computador local ou em um computador remoto com oVisual Studio 2005.

Visual C# Consolidado

538

Se voc estiver depurando localmente, o Visual Studio 2005 executado no WOW64, o emulador de 32 bits x86 que permite que que aplicativos de 32 bits do Windows sejam executados no Windows 64-Bits.A depurao local no WOW64 suportada somente no x64 . Se voc estiver depurando remotamente, o Visual Studio 2005 pode ser executado no WOW64 ou em uma mquina de 32 bits. Voc pode depurar tanto aplicativos do IA64 e do x64, bem como aplicativos de 32 bits em execuo no modo WOW do x64 ou em plataformas de 32 bits. Para depurar um aplicativo de 64 bits que esteja executando em um computador remoto, voc precisar instalar o depurador remoto de 64 bits no computador remoto. O depurador remoto de 64 bits est disponvel no ltimo disco do seu conjunto instalao do Visual Studio 2005. Se voc depurar um aplicativo de 64 bits na mquina local, o Visual Studio 2005 usa depurao remota para realizar a conexo entre o WOW64 e o aplicativo de 64 bits na mesma mquina. Para obter mais informaes, consulte Depurao na uma plataforma de 64 bits. Os componentes de depurao remota sero instalados automaticamente quando voc instalar o Visual Studio 2005 no computador. Em ambos os casos, a instalao da depurao remota em uma mquina de 64 bits instala as verses de 32 bits e 64 bits do Monitor de Depurao Remota. Para depurar um aplicativo de 64 bits, use a verso correta, que Remote Debugger (x64) no menu Start. A depurao do cdigo de 64 bits quase idntica a depurao do cdigo de 32-bits. No entanto, existem duas diferenas:

Editar e Continuar no esto disponveis para a depurao de 64 bits. Voc no pode depurar no modo misto, realizar chamadas de cdigo nativo para cdigo gerenciado, ou vice-versa, no cdigo de 64 bits. 1. Clique em Start, aponte para All Programs, aponte para Microsoft Visual Studio 2005, aponte para Visual Studio Tools, e clique em Remote Debugger (x64) ou Remote Debugger (IA64) OuNo Command Prompt do Windows, execute o comando Install path\Microsoft Visual Studio 8\Common7\IDE\Remote Debugger\x64 ou o comando Install path\Microsoft Visual Studio 8\Common7\IDE\Remote Debugger\ia64. 2.
o o

Para iniciar o Monitor de Depurao Remota de 64 bits

Configure a Remote Debugging Monitor para depurao remota Para configurar a depurao remota no Windows Authentication mode, consulte Como configurar modo Autenticao do Windows:. Para configurar a depurao remota, somente para cdigo nativo, no No Authentication mode, consulte Como: Configurar " sem autenticao " modo. O modo No Authentication mode permite uma depurao mais rpida em redes lentas, mas ele no seguro e deve ser usado somente em redes seguras.

Depurao na uma plataforma de 64 bits


Este tpico se aplica a: Visual Studio Edition Visual Basic C# C++ J#

Visual C# Consolidado

539

Express Standard Pro/Team

Sim Sim Sim

Sim Sim Sim

Sim Sim Sim

No No No

O Visual Studio 2005 pode ser executado em uma plataforma de 64 bits x64 no WOW64, que o emulador de 32 bits x86 que permite que aplicativos do Windows de 32 bits sejam executados no Windows de 64 bits. O Visual Studio 2005 no d suporte a IA64 WOW. Voc pode depurar um aplicativo IA64, mas deve faz-lo remotamente. (Consulte Como: Depurar Aplicativos de 64 bits:.) Quando voc executa o Visual Studio 2005 no modo WOW para depurar um aplicativo de 64 bits na mesma mquina, o Visual Studio 2005 parece fazer depurao local normal. No entanto, o Visual Studio 2005 est realmente usando o mecanismo de depurao remota para conectar-se do WOW para o aplicativo de 64 bits. Portanto, todas as consideraes que se aplicam depurao remota tambm se aplicam depurao local em uma plataforma de 64 bits. Isso significa que a janela do console externo no funciona em uma plataforma de 64 bits. Para obter mais informaes sobre como depurar aplicativos de 64 bits, consulte Como depurar um despejo de aplicativos de 64 bits:.

Depurao e o processo Hosting


O processo de hospedagem do Visual Studio melhora o desempenho do depurador e permite novos recursos do depurador, como depurao de confiana parcial e avaliao de expresses em tempo de design. Voc pode desativar o processo de hospedagem, caso voc precise. Para obter mais informaes, consulte Como: Desativar o processo de hospedagem. As sees a seguir descrevem algumas diferenas entre a depurao com e sem o processo de hospedagem. Depurao de Confiana Parcial e Segurana de Click-Once A depurao de confiana parcial requer o processo de hospedagem. Se voc desativar o processo de hospedagem, a depurao de confiana parcial no ir funcionar mesmo que esteja ativada na pgina Security de Project Properties. Para obter mais informaes, consulte Como: Desativar o processo de hospedagem e Como: Depurar um aplicativo de confiana parcial. Avaliao de Expresses em Tempo de Design As expresses em tempo de design sempre utilizam o processo de hospedagem. Desativar o processo de hospedagem na Project Properties desativa a avaliao de expresses em tempo de design para projetos da Class Library. Para outros tipos de projeto, a avaliao de expresses em tempo de design no desativada. Em vez disso, o Visual Studio inicia o executvel real e utiliza a avaliao em tempo de design sem o processo de hospedagem. Essa diferena pode produzir resultados diferentes. Diferenas no AppDomain.CurrentDomain.FriendlyName
AppDomain.CurrentDomain.FriendlyName retorna resultados diferentes, dependendo se o processo de hospedagem estiver ativado ou no. Se voc chamar AppDomain.CurrentDomain.FriendlyName com o processo de hospedagem ativado, ele retorna app_name.vhost.exe. Se voc o chamar com o processo de hospedagem desativado, ser retornado app_name.exe.

Visual C# Consolidado

540

Diferenas no Assembly.GetCallingAssembly().FullName
Assembly.GetCallingAssembly().FullName retorna resultados diferentes, dependendo se o processo de hospedagem estiver ativado ou no. Se voc chamar Assembly.GetCallingAssembly().FullName com o processo de hospedagem ativado, ele retorna mscorlib. Se voc chamar Assembly.GetCallingAssembly().FullName com o processo de hospedagem desativado, ser

retornado o nome do aplicativo. Como: Especificar uma verso do .NET Framework para depurao O depurador Visual Studio 2005 oferece suporte a depurao de verses mais antigas do .NET Framework, bem como a verso 2.0 atual. Se voc iniciar um aplicativo no Visual Studio, o depurador sempre poder identificar a verso correta do .NET Framework para o aplicativo que voc est depurando. Se o aplicativo j est sendo executado e voc usar Attach to, o depurador pode no ser capaz de identificar uma verso mais antiga do .NET Framework. Se isso acontecer, voc receber uma mensagem de erro que diz, O depurador fez uma suposio incorreta sobre a verso do Microsoft .NET Framework que seu aplicativo estar usando. Nesses casos raros, voc pode definir uma chave do registro para indicar ao depurador a verso a ser usada. Para especificar uma verso do .NET Framework para depurao 1. Examine a pasta Windows\Microsoft .NET\Framework para localizar as verses do .NET Framework instaladas no computador. O aspecto dos nmeros de verso algo assim:
V1.1.4322

Identifique o nmero da verso correta e tome nota dele. 2. 3. 4. Iniciar o Registry Editor (Regedit). Na Registry Editor, abra a pasta HKEY_LOCAL_MACHINE. Navegue at: HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\AD7Metrics\Engine\{449EC4 CC-30D2-4032-9256-EE18EB41B62B Se a chave no existir, clique com boto direito mouse HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\AD7Metrics\Engine, e clique em New Key no menu de atalho. Nomeie a nova chave {449EC4CC-30D2-4032-9256EE18EB41B62B}. 5. Aps navegar at {449EC4CC-30D2-4032-9256-EE18EB41B62B}, procure na coluna Name, e encontre a chave CLRVersionForDebugging. 1. Se a chave no existir, clique com o boto direito do mouse em {449EC4CC-30D24032-9256-EE18EB41B62B}, e clique New String Value no menu de atalho. Ento clique o boto direito do mouse no novo valor, clique Rename, e digite CLRVersionForDebugging.

6. 7. 8. 9.

Clique duas vezes em CLRVersionForDebugging. Na caixa Edit String, digite o nmero de verso do .NET Framework na caixa Value. Por exemplo: V1.1.4322 Clique em OK. Feche o Registry Editor. Se voc ainda receber uma mensagem de erro quando voc iniciar a depurao, verifique se voc inseriu o nmero da verso corretamente no registro. Tambm verifique se voc est

Visual C# Consolidado

541

usando uma verso do .NET Framework suportada pelo Visual Studio. O depurador compatvel com o .NET Framework verso 2.0 e verses anteriores, mas pode no ser diretamente compatvel com verses futuras.

Explicao detalhada sobre o depurador


O depurador do Visual Studio uma ferramenta poderosa que permite a voc observar o comportamento em tempo de execuo do seu programa e localizar erros de lgica. O depurador funciona com todas as linguagens de programao do Visual Studio e suas bibliotecas associadas. Com o depurador voc pode interromper, ou suspender, a execuo do seu programa para examinar seu cdigo, avaliar e editar variveis no seu programa, exibir registros, consultar as instrues criadas no seu cdigo fonte, e exibir espao de memria usado pelo seu aplicativo. Com a Edio e Continuao, voc pode fazer alteraes em seu cdigo durante a depurao, e depois continuar a execuo. O depurador do Visual Studio fornece um menu Debug para acesso a ferramentas do depurador. As janelas e caixas de dilogo do depurador exibem informaes sobre o programa e permitem a voc inserir informaes adicionais. Voc pode obter ajuda sobre qualquer janela ou caixa de dilogo pressionando F1.

Depurando o cdigo gerenciado


Esta seo aborda problemas comuns de depurao e tcnicas para aplicativos gerenciados ou aplicativos escritos em linguagens que visam Common Language Runtime, como Visual Basic, C#, J#, e C++. As tcnicas descritas aqui so tcnicas de alto nvel. Para obter mais informaes, consulte Viso geral sobre Common Language Runtime ou Usando o depurador.

Diagnstico de mensagens na janela de sada


Voc pode escrever mensagens em tempo de execuo para a janela Output usando a classe Debug ou a classe de Trace, que fazem parte da biblioteca de classes System.Diagnostics. Use a classe Debug se voc quiser mensagens apenas na verso de depurao do seu programa. Use a classe Trace se voc quiser mensagens nas verses de depurao e de publicao. Mtodos de sada As classes Trace e Debug fornecem os seguintes mtodos de sada:

Vrios mtodos Write, que fornecem sada de informaes sem interromper a execuo. Esses mtodos substituem o mtodo Debug.Print usado nas verses anteriores do Visual Basic. Os mtodos System.Diagnostics.Debug.Assert(System.Boolean) e System.Diagnostics.Trace.Assert(System.Boolean) que interrompem a execuo e fornecem sada de informaes se uma condio especificada falhar. Por padro, o mtodo Assert exibe as informaes em uma caixa de dilogo. Para obter mais informaes, consulte Assertivas em cdigo gerenciado. Os mtodos System.Diagnostics.Debug.Fail(System.String) e System.Diagnostics.Trace.Fail(System.String) os quais sempre interrompem a execuo e fornecem sada de informaes. Por padro, os mtodos Fail exibem as informaes em uma caixa de dilogo.

Alm de informaes partindo do seu aplicativo, a janela Output pode exibir informaes sobre:

Os mdulos que depurador tenha carregado ou descarregado.

Visual C# Consolidado

542

Excees que so lanadas. Processos que terminam. Threads que terminam.

Assero no cdigo gerenciado


Uma assero, ou instruo Assert, testa uma condio, que voc especifica como um argumento para a instruo Assert. Se a condio for avaliada como True, nenhuma ao ocorre. Se a condio for avaliada como False, a declarao falhar. Se voc estiver executando com uma compilao para depurao, seu programa insere modo de interrupo. No Visual Basic e Visual C#, use o mtodo Assert do Debug ou do Trace, que esto no namespace System.Diagnostics. Mtodos de classe Debug no so includos em uma verso de lanamento do seu programa, para que eles no aumentem o tamanho ou reduzam a velocidade do seu cdigo de entrega. C++ no d suporte a mtodos de classe Debug. Voc pode obter o mesmo efeito, usando a classe Trace com compilao condicional, tais como #ifdef DEBUG... #endif. O mtodo Debug.Assert Use o mtodo System.Diagnostics.Debug.Assert(System.Boolean) livremente para testar condies que deve permanecer True se o cdigo est correto. Por exemplo, suponha que voc tenha escrito uma funo de diviso de inteiros. Pelas regras de matemtica, o divisor nunca pode ser zero. Voc pode testar isso usando uma declarao: [C#]
int IntegerDivide ( int dividend , int divisor ) { Debug.Assert ( divisor != 0 ); return ( dividend / divisor ); }

Quando voc executar este cdigo no depurador, a instruo de assero avaliada, mas na verso de lanamento, a comparao no feita, portanto, no existir nenhuma sobrecarga adicional. Veja outro exemplo. Voc tem uma classe que implementa uma conta checking, da seguinte forma: [C#]
float balance = savingsAccount.Balance; Debug.Assert ( amount <= balance ); savingsAccount.Withdraw ( amount );

Antes que retirar dinheiro da conta, voc deseja verificar se o saldo da conta suficiente para cobrir a quantidade que voc est preparando para saque. Voc pode escrever uma assero para verificar o saldo: [C#]
float balance = savingsAccount.Balance; Trace.Assert ( amount <= balance ); savingsAccount.Withdraw ( amount );

Observe que chamadas ao mtodo System.Diagnostics.Debug.Assert(System.Boolean) desaparecem quando voc cria uma verso de lanamento do seu cdigo. Isso significa que a

Visual C# Consolidado

543

chamada que verifica o saldo desaparece na verso de lanamento. Para solucionar esse problema, voc deve substituir System.Diagnostics.Debug.Assert(System.Boolean) por System.Diagnostics.Trace.Assert(System.Boolean), que no desaparece na verso de lanamento: Chamadas para System.Diagnostics.Trace.Assert(System.Boolean) Adicionam sobrecarga a sua verso de lanamento, diferentemente de chamadas para System.Diagnostics.Debug.Assert(System.Boolean). Efeitos colaterais de Debug.Assert Quando voc usar System.Diagnostics.Debug.Assert(System.Boolean), certifique-se de que qualquer cdigo dentro do Assert no altera os resultados do programa se Assert for removido. Caso contrrio, voc pode introduzir um erro que aparece somente na verso de lanamento do seu programa acidentalmente. Tome cuidado principalmente com asseres que contm chamadas de funo ou procedimento, como o exemplo a seguir: [C#]
// unsafe code Debug.Assert (meas(i) != 0 );

Este uso de System.Diagnostics.Debug.Assert(System.Boolean) pode parecer seguro a princpio, mas suponha que a meas da funo atualiza um contador sempre que ela chamada. Quando voc cria a verso de lanamento, esta chamada para meas eliminada, para o contador no ser atualizado. Este um exemplo de uma funo com um efeito colateral. Eliminar uma chamada para uma funo que tem efeitos colaterais pode resultar em um erro que aparece apenas na verso de lanamento. Para evitar esses problemas, no posicione chamadas de funo em uma instruo System.Diagnostics.Debug.Assert(System.Boolean). Use uma varivel temporria: [C#]
temp = meas( i ); Debug.Assert ( temp != 0 );

Mesmo quando voc usa System.Diagnostics.Trace.Assert(System.Boolean), ainda convm evitar fazer chamadas de funo dentro de uma instruo Assert. Essas chamadas devero ser seguro, pois instrues System.Diagnostics.Trace.Assert(System.Boolean) no so eliminados em uma criao para lanamento. No entanto, se voc evitar tais construes como uma questo de hbito, menos provvel que voc cometa um erro quando voc usa System.Diagnostics.Debug.Assert(System.Boolean). Requisitos de Depurao e Rastreamento Se voc criar o projeto usando os assistentes Visual Studio, o smbolo Trace definido por padro em Configuraes de lanamento e de depurao. O smbolo Debug definido por padro somente na compilao de depurao. Caso contrrio, para mtodos Trace funcionarem, o programa deve ter uma das opes a seguir na parte superior do arquivo de origem:
#Const TRACE = True no Visual Basic #define TRACE Em Visual C++ e C#

Ou o programa deve ser criado com a opo Trace:

Visual C# Consolidado

544

/d:TRACE=True No Visual Basic /d:TRACE Em Visual C# e C++

Se voc precisa usar os mtodos de depurao em uma criao de verso C# ou Visual Basic, voc dever definir o smbolo Debug em sua configurao de lanamento. C++ no d suporte a mtodos de classe Debug. Voc pode obter o mesmo efeito, usando a classe Trace com compilao condicional, tais como #ifdef DEBUG... #endif Voc pode definir esses smbolos na caixa de dilogo <Project> Property Pages. Para obter mais informaes, consulte Alterando configuraes do projeto para configurao de depurao no Visual Basic ou Alterando Configuraes do projeto para configurao de depurao em C ou C++. Declarar argumentos System.Diagnostics.Trace.Assert(System.Boolean) e System.Diagnostics.Debug.Assert(System.Boolean) levam at trs argumentos. O primeiro argumento, que obrigatrio, a condio que deseja verificar. Se voc chamar System.Diagnostics.Trace.Assert(System.Boolean) ou System.Diagnostics.Debug.Assert(System.Boolean) com apenas um argumento, o mtodo Assert verificar a condio e, se o resultado False, mostra o contedo da pilha de chamadas na janela Output. O exemplo a seguir Mostra System.Diagnostics.Trace.Assert(System.Boolean) e System.Diagnostics.Debug.Assert(System.Boolean): [C#]
Debug.Assert ( stacksize > 0 ); Trace.Assert ( stacksize > 0 );

Os argumentos segundo e terceiro, se houver, devem ser seqncias. Se voc chamar System.Diagnostics.Trace.Assert(System.Boolean) ou System.Diagnostics.Debug.Assert(System.Boolean) com dois ou trs argumentos, o primeiro argumento uma condio. O mtodo verifica a condio e, se o resultado for FALSO, mostra a segunda e terceira seqncias. O exemplo a seguir mostra System.Diagnostics.Debug.Assert(System.Boolean,System.String) e System.Diagnostics.Trace.Assert(System.Boolean,System.String) usado com dois argumentos: [C#]
Debug.Assert ( stacksize > 0, "Out of stack space" ); Trace.Assert ( stacksize > 0, "Out of stack space" );

O exemplo a seguir Mostra Assert e Assert: [C#]


Debug.Assert ( stacksize > 100, "Out of stack space" , "Failed in inctemp" ); Trace.Assert ( stacksize > 0, "Out of stack space", "Failed in inctemp" );

Personalizando comportamento de declarao Se voc executar o aplicativo no modo de interface do usurio, o mtodo Assert exibe a caixa de dilogo Assertion Failed quando a condio falhar. As aes que ocorrem quando uma declarao falha so controladas pela propriedade Listeners ou Listeners. Voc pode personalizar o comportamento de sada adicionando um objeto TraceListener coleo Listeners, removendo um TraceListener da coleo Listeners, ou substituindo o mtodo

Visual C# Consolidado

545

System.Diagnostics.TraceListener.Fail(System.String) de um TraceListener existente para faz-lo comportar-se de maneira diferente. Por exemplo, voc pode substituir o mtodo System.Diagnostics.TraceListener.Fail(System.String) para gravar em um log de eventos em vez de exibir a caixa de dilogo Assertion Failed. Para personalizar a sada dessa forma, o programa deve conter uma escuta, e voc deve herdar de TraceListener e substituir seu mtodo System.Diagnostics.TraceListener.Fail(System.String). Para mais informaes, consulte Rastrear Listeners. Definindo asseres em arquivos de configurao Voc pode definir itens em seu arquivo de configurao de programa, bem como em seu cdigo. Para obter mais informaes, consulte System.Diagnostics.Trace.Assert(System.Boolean) ou System.Diagnostics.Debug.Assert(System.Boolean).

Parar instrues no Visual Basic


A instruo Stop do Visual Basic fornece uma alternativa de cdigo para definir um ponto de interrupo. Quando o depurador encontrar uma instruo Stop, ele interrompe a execuo do programa (entra modo de interrupo). Os programadores C# podem obter o mesmo efeito usando uma chamada para System.Diagnostics.Debugger.BREAK. Voc define ou remove uma instruo Stop editando seu cdigo fonte. Voc no pode definir ou limpar instrues Stop usando comandos do depurador, como voc faria com um ponto de interrupo. Diferentemente de uma instruo End, a instruo Stop no redefine variveis ou retorna voc ao modo de design. Voc pode escolher Continue no menu Debug para continuar executando o aplicativo. Quando voc executar um aplicativo do Visual Basic fora do depurador, uma instruo Stop iniciar o depurador se a depurao Just-in-Time estiver ativada. Se a depurao Just-in-Time no estiver ativada, a instruo Stop se comporta como se fosse uma instruo End, encerrando a execuo. Nenhum evento QueryUnload ou Unload ocorrer, portanto voc deve remover todas as instrues de Stop da verso final do seu aplicativo Visual Basic. Para obter mais informaes, consulte Depurao Just-in-Time. Para evitar a necessidade de remover instrues Stop, voc pode usar compilao condicional:
#If DEBUG Then Stop #Else ' Don't stop #End If

Outra alternativa usar uma instruo Assert em vez da instruo Stop. Uma instruo Debug.Assert interrompe a execuo somente quando uma condio especificada no for atendida e removida automaticamente quando voc criar uma verso Release. Para obter mais informaes, consulte Itens no cdigo gerenciado. Se voc desejar que uma instruo Assert sempre interrompa a execuo na verso de depurao, voc pode fazer isso:
Debug.Assert(false)

Ainda outra alternativa usar o mtodo DEBUG.Fail:

Visual C# Consolidado

546

Debug.Fail("a clever output string goes here")

Passo-a-passo: Depurao de um formulrio do Windows Um formulrio do Windows uma das mais comuns aplicativos gerenciados. Um formulrio do Windows cria um aplicativo do Windows padro. Voc pode concluir essa explicao passo a passo usando Visual Basic, C#, J#, ou C++. Primeiro, voc deve fechar quaisquer solues abertas. Para preparar para essa explicao passo a passo

Se voc j tiver uma soluo aberta, feche-a. (No menu File, selecione Close Solution.) Criar um novo formulrio do Windows

Em seguida, voc criar um novo formulrio do Windows.

Para criar o formulrio do Windows para essa explicao passo a passo


1. 2. No menu File, escolha New e clique Project. A caixa de dilogo New Project ser exibida. No painel tipos de projeto, abra o n Visual C#Visual Basic, Visual J# ou Visual C++, em seguida, 1. 2. 3. 4. 5. Para Visual Basic, Visual C# ou Visual J#, selecione a Windows., em seguida, marque Windows Application no painel Templates. Para Visual C++, selecione o CLR.

No painel Templates, selecione Windows Application. Na caixa Name, d ao projeto um nome exclusivo (por exemplo, Walkthrough_SimpleDebug). Clique em OK. Visual Studio cria um novo projeto e exibe um novo formulrio no Windows Forms . PaDesignerra obter mais informaes, consulte Windows Forms Designer.

6. 7. 8. 9. 10.

No menu View, selecione Toolbox. Abre a caixa de ferramentas. Para obter mais informaes, consulte Caixa de ferramentas. Na caixa de ferramentas, clique sobre o controle Button e arraste o controle para a superfcie de projeto de formulrio. Solte o boto no formulrio. Na caixa de ferramentas, clique sobre o controle TextBox e arraste o controle para a superfcie de projeto de formulrio. Solte a TextBox no formulrio. Na superfcie de projeto de formulrio, clique duas vezes no boto. Isso leva voc para a pgina de cdigo. O cursor deve estar no button1_Click. Na funo button1_Click., adicione o seguinte cdigo:
' Visual Basic textBox1.Text = "Button was clicked!" // C# textBox1.Text = "Button was clicked!"; // J# textBox1.set_Text("Button was clicked!"); // C++ textBox1->Text = "Button was clicked!";

11.

No menu Build, selecione Build Solution. O projeto deve criar-se com erros. Depurar seu formulrio

Visual C# Consolidado

547

Agora, voc est pronto para iniciar a depurao.

Para depurar o formulrio do Windows criado para essa explicao passo a passo
1. Na janela de origem, clique na margem esquerda na mesma linha quo o texto foi adicionado:
' Visual Basic textBox1.Text = "Button was clicked!" // C# textBox1.Text = "Button was clicked!"; // J# textBox1.set_Text("Button was clicked!"); // C++ textBox1->Text = "Button was clicked!";

Um ponto vermelho aparece e o texto na linha realado em vermelho. O ponto vermelho representa um ponto de interrupo. Para obter mais informaes, consulte Pontos de interrupo. Quando voc executa o aplicativo sob o depurador, o depurador interromper a execuo nesse local quando o cdigo controntado. Voc pode exibir o estado do seu aplicativo e depur-lo. 2. 3. A partir do menu Debug, escolha Start. O formulrio do Windows comea a ser executado. No formulrio do Windows, clique no boto que voc adicionou. No Visual Studio, isso leva voc para a linha onde voc define o ponto de interrupo na pgina de cdigo. Esta linha deve ser realada em amarelo. Agora voc pode exibir as variveis no seu aplicativo e controlar sua execuo. Agora o aplicativo foi interrompido quando executava, aguardando uma ao de voc. Observao Se voc tiver definido a Active Solution Configuration como Release, a execuo no ser paralisada no ponto de interrupo. Isso simula o comportamento de um programa na verso real. O crculo que marca o ponto de interrupo ir conter um ponto de interrogao branco. Se necessrio, use a caixa de dilogo Configuration Manager para alterar essa configurao novamente para Debug. 4. 5. No menu Debug, escolha Windows, em seguida Watch, e clique em Watch1. Na janela Watch1, clique em um linha em branco. Na coluna Name, digite textBox1.Text (se voc estiver usando Visual Basic, Visual C#, ou J#) ou textBox1->Text (se voc estiver usando C++), pressione ENTER. A janela Watch1 mostra o valor dessa varivel entre aspas como:
""

6.

A partir do Menu Debug, escolha Step Into. O valor de textBox1.Text muda na janela Watch1 para:
Button was clicked!

7. 8. 9. 10.

A partir do Menu Debug, escolha Continue para continuar a depurao do programa. No formulrio do Windows, clique no boto novamente. Visual Studio quebra a execuo novamente. Clique no ponto vermelho que representa o ponto de interrupo. Isso remove o ponto de interrupo do seu cdigo. A partir do Menu Debug, escolha Stop Debugging. Anexar ao seu formulrio para depurao

Visual C# Consolidado

548

No Visual Studio 2005, voc pode anexar o depurador a um processo em execuo. Se voc estiver usando um Edition Express, no h suporte para este recurso.

Para anexar ao formulrio do Windows para depurao


1. No projeto criado acima, clique Na margem esquerda para definir mais uma vez um ponto de interrupo na linha que voc adicionou:
' Visual Basic textBox1.Text = "Button was clicked!" // C# textBox1.Text = "Button was clicked!" // J# textBox1.set_Text("Button was clicked!"); // C++ textBox1->Text = "Button was clicked!";

2.

No menu Debug, selecione Start Without Debugging. O formulrio do Windows inicia executando sob Windows, como se voc tivesse clicado duas vezes seu executvel. O depurador no est anexado.

3.

No menu Debug, selecione Attach to Process. (Este comando tambm est disponvel a partir do menuTools.) A caixa de dilogo Attach to Process ser exibida. No painel Available Processes, localize o nome do processo (Walkthrough_SimpleDebug.exe) na coluna Process e clique nele. Clique no boto Attach. No seu formulrio do Windows, clique em um e somente um boto. O depurador quebra a execuo do formulrio do Windows no ponto de interrupo.

4. 5. 6.

Depurar o mtodo OnStart como:


Voc pode depurar o construtor do Windows Service, depurando em uma instncia do servio. Voc pode depurar o prprio Windows Service iniciando o servio e anexando o depurador ao processo do servio. No entanto, para depurar o mtodo OnStart de um Windows Service, voc deve adicionar algumas linhas de cdigo para simular o servio. Para obter mais informaes, consulte System.ServiceProcess.ServiceBase.OnStart(System.String[]). Para depurar um problema no mtodo OnStart

Crie uma simulao do servio (um aplicativo de console, por exemplo) para determinar onde o problema est. Por exemplo, suponha que voc tenha um Visual C# Windows Service parecido com este:
public class ManagedWindowsService : System.ServiceProcess.ServiceBase { // // designer and user generated methods and properties // public static int main(String[] args) { ServiceBase.Run( new ManagedWindowsService() ); } }

Adicione as linhas de cdigo a seguir para depurar o mtodo OnStart:


public static int main(String[] args) { (new ManagedWindowsService()).OnStart(); // allows easy debugging of OnStart() ServiceBase.Run( new ManagedWindowsService() ); }

O servio no poder executar nesse modo, mas voc pode depurar o mtodo OnStart e verificar se ele est se comportando conforme esperado. Para obter mais informaes, consulte Depurando Aplicativos do Windows Service. Como: Depurar Aplicativos de Modo Misto

Visual C# Consolidado

549

Um aplicativo de modo misto qualquer aplicativo que combine cdigo nativo (C++) com cdigo gerenciado (como Visual Basic, Visual C# ou C++ que executado no Common Language Runtime). Depurao de aplicativos de modo misto amplamente transparente no Visual Studio; ela no muito diferente da depurao de um aplicativo de modo nico. H algumas consideraes especiais, entretanto. Observao Visual Studio no d suporte de depurao de modo misto no Windows 95, Windows 98 ou Windows Millennium Edition. Avaliao da Propriedade em Aplicativos de Modo Misto Em um aplicativo de modo misto, a avaliao das propriedades pelo depurador uma operao cara. Como um resultado, operaes de depurao, como uma etapa poder parecer lenta. Para obter mais informaes, consulte Stepping. Se voc tiver um desempenho ruim em depurao de modo misto, convm desativar a avaliao da propriedade nas janelas do depurador. Observao As caixas de dilogo e comandos de menu que voc v podem diferir daquelas descritas na Ajuda dependendo da sua configurao ativa ou edio. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Configuraes Visual Studio.

Para desativar a avaliao da propriedade


1. 2. 3. A partir do menu Tools, escolha Options. Na caixa Options de dilogo, abra a pasta Debugging e selecione a categoria General. Desmarque a caixa de seleo Enable property evaluation and other implicit function calls.

Como pilha de chamadas nativas e pilha de chamadas gerenciadas diferem, o depurador no pode sempre fornecer pilha de chamadas completa para cdigo misto. Quando cdigo nativo chama cdigo gerenciado, voc pode observar algumas discrepncias. Para obter detalhes, consulte Cdigo Misto e Informaes Perdidas na Janela de Pilha de Chamada. ERRO: depurao Isn't possveis como um depurador do ncleo estiver ativada no sistema Quando estiver depurando cdigo gerenciado, voc pode receber a seguinte mensagem de erro:
Debugging isn't possible because a kernel debugger is enabled on the system

Essa mensagem ocorre quando voc tenta depurar cdigo gerenciado em um sistema executando Windows NT, Windows 2000 ou Windows XP que tiver sido iniciado no modo de depurao. Soluo

Para corrigir esse problema

Desative a depurao de ncleo e depure no Visual Studio.

Visual C# Consolidado

550

- ou

Depure usando o Kernel Debugger do Visual Studio. 1. Localizar boot.ini na sua unidade do sistema (geralmente C:\). O arquivo boot.ini pode estar oculto e somente-leitura, portanto voc precisa usar o comando a seguir para v-lo:
dir /ASH

Para desativar depurao de ncleo

2.

Abra boot.ini usando o bloco de notas e remova as seguintes opes:


/debug /debugport /baudrate

3. 4. 1. 2.

Reinicialize o computador. Reinicie o Visual Studio e depurao. Se o Kernel Debugger conectado, voc ver uma mensagem perguntando se voc deseja para continuar a depurao. Clique no boto para continuar. Voc pode obter um User break exception(Int 3) Se isso acontecer, digite o seguinte comando KD para continuar a depurao:
gn

Para depurar com o Kernel Debugger

Depurao de cdigo nativo


Este tpico se aplica a: Visual Studio Edition Express Padro Pro / Team Visual Basic No No No C# No No No C++ Nativo Nativo Nativo J# No No No

A seo aborda alguns problemas comuns de depurao e tcnicas para aplicativos nativos. As tcnicas abordadas nesta seo so tcnicas de alto nvel. Para a mecnica de usar o depurador Visual Studio, consulte O depurador esquema obter.

Como debug otimizado cdigo:


Este tpico se aplica a: Visual Studio Edition Express Padro Visual Basic No No C# No No C++ Nativo Nativo J# No No

Visual C# Consolidado

551

Pro / Team Observao

No

No

Nativo

No

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings (Importar e Exportar Configuraes) no menu Tools (Ferramentas). Para obter mais informaes, consulte Configuraes do Visual Studio. Quando o compilador otimiza cdigo, ele reposiciona e reorganiza os instrues, resultando em mais eficiente cdigo compilado. Devido a essa rearrangement, o depurador sempre no pode identificar o cdigo fonte que corresponde a um conjunto de instrues. Otimizao pode afetar:

Locais variveis, que podem ser removido pelo otimizador ou movido para o depurador no compreende locais. Posies dentro uma funo, que so alteradas quando o otimizador mescla blocos de cdigo. Funo nomes de quadros no pilha de chamadas, que podem ser incorreto se o otimizador mescla duas funes.

Quase sempre os quadros que voc v na pilha de chamadas so direito, no entanto, supondo que voc tenha smbolos para todos os quadros. Os quadros no pilha de chamadas podero ser incorreto se voc tiver corrupo de pilha, se voc tiver escrito em linguagem conjunto, funes ou se no houver quadros sistema operacional sem correspondncia smbolos no pilha de chamadas. Variveis globais e esttico sempre so exibidas corretamente. Portanto, layout estrutura. Se voc tiver um ponteiro para uma estrutura e o valor do ponteiro esteja correto, cada varivel de membro da estrutura mostrar o valor correto. Devido a essas limitaes, voc deve fazer a depurao usando uma verso do seu programa unoptimized se possvel. Por padro, a otimizao desativado na configurao de depurao de um programa Visual C++ e ativado na configurao Release. s vezes, entretanto, um erro pode aparecem somente em uma verso de um programa otimizado. Nesse caso, voc deve depurar o cdigo otimizado. Para ativar otimizao de um Debug criar configurao 1. Quando voc cria um novo projeto, selecionar o Win32 Debug destino. Use o Win32 Debug destino at que seu programa estiver totalmente depurado e voc estiver pronto para criar um Win32 Release destino. O compilador no No otimizar o Win32 Debug destino. Selecione o projeto no Solution Explorer. No menu View, clique em Property Pages. Na caixa Property Pages de dilogo, certifique-se Debug estar marcada na caixa Configuration de listagem drop-down. No modo de exibio Pasta no lado esquerdo, selecione a C/C pasta. Sob a pasta C++, selecione Optimization.

2. 3. 4. 5. 6.

Visual C# Consolidado

552

7.

Na lista Propriedades direita, localize Optimization. A configurao lado para ele provavelmente diz Disabled (/Od). Escolha uma das outras opes (Minimum Size (/O1), Maximum Speed (/O2) ou Custom)., Full Optimization (/Ox) Se voc escolheu a Custom opo para Optimization, agora voc pode definir opes para qualquer uma das outras propriedades mostradas na lista Propriedades

8.

Ao depurar o cdigo otimizado, aspecto na Disassembly janela para ver quais instrues realmente criado e executado. Ao definir pontos de interrupo, voc precisar estar ciente que o ponto de interrupo poder mover junto com uma instruo. Por exemplo, considere o cdigo a seguir:
for (x=0; x<10; x++)

Suponha que voc definir um ponto de interrupo nesta linha. Voc pode esperar o ponto de interrupo para ser atingido 10 vezes, mas se o cdigo otimizado, ponto de interrupo somente acertado uma vez. Que porque a primeira instruo define o valor da x como 0. O compilador reconhece que isso s tem que ser feito uma vez e move-fora do loop. Move o ponto de interrupo a ele. As instrues que comparar e incrementar x permanecer dentro do loop. Quando voc exibe a Disassembly janela automaticamente definida como instruo para maior controle, que til quando depurao atravs de cdigo otimizado. o Unidade etapa

DebugBreak e __debugbreak
Este tpico se aplica a: Visual Studio Edition Express Padro Pro / Team Visual Basic No No No C# No No No C++ Nativo Nativo Nativo J# No No No

Voc pode chamar a DebugBreak funo Win32 ou __debugbreak. intrnsecas em qualquer ponto no seu cdigo e DebugBreak__debugbreak ter o mesmo efeito que configurar um ponto de interrupo nesse local. Porque DebugBreak uma chamada para uma funo do sistema, depurao do sistema smbolos devem ser instalados para garantir a informao correta pilha de chamadas exibida aps quebra. Caso contrrio, as informaes exibidas pelo depurador pilha de chamadas podem estar fora por um quadro. No se voc usar __debugbreak, smbolos so necessrios.

Declaraes
Este tpico se aplica a: Visual Studio Edition Visual Basic C# C++ J#

Visual C# Consolidado

553

Express Edition Standard Edition Pro / Team Edition

No No No

No No No

Nativo Nativo Nativo

No No No

Uma instruo de declarao Especifica uma condio que voc espera para manter verdadeira em algum momento especfico em seu programa. Se essa condio no tem verdadeira, a declarao falhar, execuo de seu programa for interrompida, aparece. e Caixa de dilogo Falha de declarao Visual C++ oferece suporte instrues de declarao com base nas seguintes construes:

Para Declaraes MFC Programa MFC. Para ATLASSERT programas que utilizam ATL. Para Declaraes CRT programas que utilizam a biblioteca de tempo de execuo C. O ANSI Declarar funo para outros programas C/C.

Voc pode usar declaraes para:


Capturar erros de lgica. Para obter mais informaes, consulte Erro Catching de lgica. Verificar resultados de uma operao. Para obter mais informaes, consulte Resultado de verificao. Teste as condies de erro que devem ter sido tratadas. Para obter mais informaes, consulte Teste condio de erro.

MFC e Assertions C Run-Time Library Quando o depurador pra devido a uma declarao Biblioteca de tempo de execuo MFC ou C, ele navega at o ponto no arquivo de origem onde a declarao ocorreu (se a fonte estiver disponvel). A mensagem de declarao aparece na caixa de dilogo, bem como Janela de sada o Assertion Failed. Voc pode copiar a mensagem de declarao da janela Output para uma janela de texto se voc desejar salv-lo para referncia futura. A Output janela pode conter outras mensagens de erro, bem. Examinar essas mensagens com cuidado, pois fornecem pistas para a causa da falha de declarao. Atravs do uso liberal de declaraes em seu cdigo, voc pode capturar muitos erros durante o desenvolvimento. Uma boa regra para escrever uma declarao para cada suposio voc fazer. Se voc assumir que um argumento no NULL, por exemplo, usar uma instruo de declarao para verificar essa suposio. _DEBUG Instrues de declarao compilar somente quando _DEBUG for definida. Quando _DEBUG no for definido, o compilador trata declaraes como instrues nulas. Assim, instrues de declarao ter zero sobrecarga no seu programa verso final; voc pode us-los liberally em seu cdigo, sem afetar o desempenho da sua verso release e sem que seja necessrio usar #ifdef as diretivas. Efeitos lado do uso Assertions

Visual C# Consolidado

554

Quando voc adicionar declaraes a seu cdigo, certifique-se que as declaraes no tem efeitos colaterais. Por exemplo, considere a declarao a seguir:
ASSERT(nM++ > 0); // Don't do this!

Porque a ASSERT expresso no avaliada com a verso release do seu programa, nM ter que valores diferentes nas verses Debug e Release. Em MFC, voc pode usar a VERIFY macro em vez de ASSERT. Avaliar VERIFY a expresso mas no verifica o resultado na verso Release. Tenha cuidado usando chamadas de funo em instrues de declarao, especialmente como avaliar uma funo pode ter efeitos colaterais inesperados.
ASSERT ( myFnctn(0)==1 ) // unsafe if myFnctn has side effects VERIFY ( myFnctn(0)==1 ) // safe

Chama VERIFYmyFnctn em verses Debug e Release, portanto aceitvel para usar. Voc ainda ter a sobrecarga de um chamada de funo desnecessria na verso Release, entretanto.

Deteco vazamento de memria e isolamento


Este tpico se aplica a: Visual Studio Edition Express Padro Pro / Team Visual Basic No No No C# No No No C++ Nativo Nativo Nativo J# No No No

A capacidade de dinamicamente alocar e Desalocar memria um dos recursos de programao C/C, mais seguro mas o maior nvel tambm pode ser a deficincia maior. Isso certamente verdadeiro de aplicativos C/C, onde problemas tratamento memria esto entre os erros mais comuns. Uma dos erros mais sutil e difceis de detectar o vazamento de memria a falha para Desalocar memria que foi anteriormente alocada corretamente. Um vazamento de memria pequeno que ocorre somente uma vez no pode ser percebido, mas programas que leak grandes quantidades de memria, ou leak progressivamente, podem exibir sintomas, variando entre desempenho deficiente (e gradualmente decrescente) e em execuo fora de memria totalmente. Worse, um programa leaking pode usar Backup para que ele faz com outro programa a falhar, quantidade de memria deixar o usurio com nenhum pista para onde o problema est realmente. Alm disso, vazamentos de memria mesmo inofensivo podem ser symptomatic de outros problemas. Felizmente, as depurador Visual Studio e C bibliotecas (CRT) de tempo de execuo fornecem voc com eficaz meio para detectando e identificando vazamentos de memria. Para entender como detectar memria leaks usando as instalaes de depurao CRT, leia os seguintes tpicos:

Ativando deteco vazamento de memria Interpretar tipos do bloco de memria Definir um ponto de interrupo em um nmero de alocao de memria

Visual C# Consolidado

555

Comparando unidos memria

MFC fornece seu prprio conjunto de recursos para detectar vazamentos de memria em programas MFC. Para obter mais informaes, consulte Detectar Leaks de memria no MFC. Consulte tambm Conceitos Segurana do Depurador Outros recursos Depurao de cdigo nativo HOW TO: depurar cdigo assembly embutido Este tpico se aplica a: Visual Studio Edition Express Padro Pro / Team Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings (Importar e Exportar Configuraes) no menu Tools (Ferramentas). Para obter mais informaes, consulte Configuraes do Visual Studio. O depurador fornece duas janelas para depurar cdigo de montagem embutido, a Disassembly janela e a Registers janela. Procedimento Para depurar cdigo de montagem embutido 1. 2. Usar a Disassembly janela para exibir as instrues do conjunto. Use a Registers janela para exibir registrar contedo. Visual Basic No No No C# No No No C++ Nativo Nativo Nativo J# No No No

Tcnicas de depurao atl


Este tpico se aplica a: Visual Studio Edition Express Visual Basic No C# No C++ Nativo J# No

Visual C# Consolidado

556

Padro Pro / Team

No No

No No

Nativo Nativo

No No

Se voc est depurando um programa ATL, essas tcnicas depurao podem ser de uso para voc. Nesta seo Como componentes Debug com + 1.0: Descreve como para depurar um projeto 1.0 componente COM + no Visual Studio. HOW TO: Debug chamadas QueryInterface Mostra a definio voc deve adicionar ao seu cdigo para depurar QueryInterface chamadas em ATL e os resultados. Como contagens de referncia faixa: Mostra a definio voc deve adicionar ao seu cdigo para referncia de rastreamento contagens nas ATL e os resultados. Sees relacionadas Depurao e Error Reporting funes global Lista funes na biblioteca ATL que fornecem til depurao e recursos de rastreamento. Macros depurao e relatrio de erros Lista macros na Biblioteca ATL que fornecem til depurao e recursos de rastreamento. Depurao de cdigo nativo Aborda alguns problemas comuns de depurao e tcnicas para aplicativos C e C++. Segurana do Depurador Descreve as prticas recomendadas para segurana depurao.

Tcnicas de depurao MFC


Este tpico se aplica a: Visual Studio Edition Express Padro Visual Basic No No C# No No C++ Nativo Nativo J# No No

Visual C# Consolidado

557

Pro / Team

No

No

Nativo

No

Se voc est depurando um programa MFC, essas tcnicas de depurao podem ser til. Nesta seo AfxDebugBreak Descreve a AfxDebugBreak funo, que voc pode usar para pontos de interrupo hardcode no cdigo fonte. A macro Trace Descreve e fornece exemplos das macros ATLTRACE e Trace MFC, que permitem que voc se exibir mensagens do seu programa na janela de sada do depurador. Detectar Leaks de memria no MFC Fornece links para as classes da MFC e funes que detectar memria que alocada mas nunca desalocadas. Incluir links: controlar alocaes de memria, ativando Diagnstico de Memria, levando instantneos de memria, exibindo estatsticas de memria, e objeto despejos. Sees relacionadas Reduzindo o tamanho de um construir Debug MFC Fornece solues para grande quantidade de espao em disco usado pelo informaes da depurao quando voc cria um Verso de depurao de um aplicativo MFC. Assertions MFC Descreve e fornece cdigo de exemplo para usar a ASSERT macro para verificar para falhas de declarao. Depurao Visual C++ Aborda alguns problemas comuns de depurao e tcnicas para aplicativos C e C++. Segurana do Depurador Fornece recomendaes para depurao mais seguro.

Tcnicas de depurao CRT


Este tpico se aplica a: Visual Studio Edition Express Visual Basic No C# No C++ Nativo J# No

Visual C# Consolidado

558

Padro Pro / Team

No No

No No

Nativo Nativo

No No

Se voc est depurando um programa que usa a biblioteca de tempo de execuo C, essas tcnicas de depurao podem ser til. Nesta seo Usar da biblioteca Debug CRT Descreve o suporte de depurao fornecido pela biblioteca do C Run-Time e fornece instrues para acessar as ferramentas. Macros do relatrio Do _RPTn fornece informaes sobre e _RPTFn macros (definidas em CRTDBG.H), que substitui o uso de printf instrues para depurao. Depurar verses de funes de alocao da pilha Discute as verses Debug especiais de funes de alocao da pilha, incluindo: como a CRT relaciona chamadas, os benefcios da chamada-las explicitamente,. Como evitar a converso, controlar os tipos separados de alocaes em blocos do cliente, e os resultados de no definio _DEBUG A pilha Debug CRT Fornece links para gerenciamento de memria e a pilha de depurao, tipos de blocos sobre a pilha de depurao, usando a pilha de depurao, estado da pilha relatrio funes, e controlar solicitaes de alocao da pilha. Depurar escrita da funo gancho Links listas para Bloco do cliente conectar funes, funes do gancho de alocao, ganchos de alocao e CRT alocaes de memria, e funes do gancho de relatrio. Sees relacionadas Depurao de cdigo nativo Aborda alguns problemas comuns de depurao e tcnicas para aplicativos C e C++. Segurana do Depurador Fornece recomendaes para depurao mais seguro.

Depurao Native FAQs do cdigo


Este tpico se aplica a: Visual Studio Edition Visual Basic C# C++ J#

Visual C# Consolidado

559

Express Padro Pro / Team

No No No

No No No

Nativo Nativo Nativo

No No No

Os tpicos a seguir contm respostas a algumas perguntas mais freqentes:


Como pode eu Debug Violations Access quando executando meu autnomo do programa? Como eu eu depurar uma violao de acesso? Como pode eu localizar sem se meus ponteiros so Corrupting um endereo de memria? Como eu eu localizar sada quem Passing um valor do parmetro Wrong? Quando chamada uma funo Hundreds de Times, quais chamada falha? Onde procurar por erros de cdigo Win32? Como pode eu manter foco ao nvel atravs de meu programa? Como pode usar Windows Debugger durante depurao um programa primeiro plano? Se Halted na MFC, como posso obter voltar para a funo que chamado MFC?

COM e depurando ActiveX


Este tpico se aplica a: Visual Studio Edition Express Edition Standard Edition Pro / Team Edition Visual Basic No No No C# No No No C++ Nativo Nativo Nativo J# No No No

Esta seo fornece dicas sobre depurao aplicativos COM e controles ActiveX.

Como: Depurar DLLs


Este tpico se aplica a: Visual Studio Edition Express Padro Pro / Team Visual Basic No No No C# No No No C++ Nativo Nativo Nativo J# No No No

Visual C# Consolidado

560

Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings (Importar e Exportar Configuraes) no menu Tools (Ferramentas). Para obter mais informaes, consulte Configuraes do Visual Studio. Quando voc depurar uma DLL, voc pode iniciar a depurao de:

O projeto usado para criar o executvel que chama a DLL.

Ou

O projeto usado para criar a DLL prprio.

Se voc tiver o projeto usado para criar o executvel, iniciar depurao desse projeto. Voc pode abrir um arquivo de fonte para a DLL e definir pontos de interrupo nesse arquivo, mesmo que ele seja no fizer parte do projeto usado para criar o executvel. Para obter mais informaes, consulte Pontos de interrupo. Se voc iniciar a depurao do projeto que cria a DLL, voc deve especificar o executvel que deseja usar na depurao a DLL Para especificar um executvel para a sesso de depurao 1. 2. 3. 4. 5. No Solution Explorer, selecione o projeto que cria a DLL. Partir do View menu, escolha Property Pages. Na caixa Property Pages de dilogo, abra a Configuration Properties pasta e selecione a Debugging Categoria. Na caixa Command, especifique o nome de caminho para o continer. Por exemplo, Files\MyApplication\MYAPP.EXE C:\Program. Na caixa Command Arguments, especificar os argumentos necessrios para o executvel.

Se voc no especificar o executvel na caixa Project Property Pages de dilogo aparece quando voc inicia a depurao. o Executvel para depurao caixa de dilogo de sesses

Como: Depurar cdigo inserido


Este tpico se aplica a: Visual Studio Edition Express Padro Pro / Team Visual Basic No No No C# No No No C++ Nativo Nativo Nativo J# No No No

Visual C# Consolidado

561

Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings (Importar e Exportar Configuraes) no menu Tools (Ferramentas). Para obter mais informaes, consulte Configuraes do Visual Studio. Muito usando atributos pode simplificar programao C++. Para obter mais informaes, consulte Atribudo programao conceitos.Alguns atributos so interpretados diretamente pelo compilador. Outros atributos injetar cdigo em fonte de programa, que ento compila o compilador. Esse cdigo injected torna programao fcil, reduzindo a quantidade de cdigo voc deve escrever. s vezes, no entanto, um erro pode causar seu aplicativo para falhar durante sua execuo cdigo injected. Quando isso acontece, provavelmente desejar para aspecto no cdigo injected. O Visual Studio fornece duas maneiras para que voc possa ver injected cdigo:

Voc pode exibir cdigo injected na janela Disassembly. Usando /FX, voc pode criar um arquivo de origem mesclado que contm cdigo original e injected.

A Disassembly janela mostra instrues idioma conjunto-que correspondem ao cdigo-fonte e o cdigo injetado pelos atributos. Alm disso, a Disassembly janela pode mostrar a anotao cdigo fonte-. Para ativar anotao fonte

Clique com o boto direito do mouse na Disassembly janela, e escolha Show Source Code No menu de atalho. Se souber o local de um atributo em uma janela de origem, voc pode usar o menu de atalho para localizar o cdigo injected na janela Disassembly

Para exibir cdigo injected 1. 2. 3. O depurador deve estar no modo de interrupo. Em um janela de cdigo de origem, coloque o cursor na frente do atributo cujo cdigo injected voc deseja exibir. Clique com o boto direito do mouse, e selecione Go To Disassembly a partir do menu de atalho Caso o local de atributo esteja prximo o ponto de execuo atual, voc pode selecionar a Disassembly janela a partir do Debug menu Para exibir a cdigo de desmontagem no ponto de execuo atual 1. 2. O depurador deve estar no modo de interrupo. No menu Debug, escolha Windows, e clique em Disassembly.

Depurar aplicativos da Web


Esta seo descreve tcnicas comuns de depurao para aplicativos da Web. Para obter mais informaes, consulte Explicao detalhada sobre o depurador. Nesta seo Depurar aplicativos da Web ASP.NET

Visual C# Consolidado

562

Fornece instrues e requisitos sobre depurao de um aplicativo ASP.NET no momento de desenvolvimento ou quando o aplicativo j estiver implantado e em execuo. Depurao aplicativos Web ATL Server Fornece links de informaes sobre a depurao de aplicativos da Web ou de servios XML da Web criados com o ATL Server. Depurando aplicativos da Web: Erros e soluo de problemas Lista erros que voc pode encontrar durante a depurao de aplicativos da Web e sugere correes. Sees relacionadas Preparao da Depurao: Web Services XML (C++) Descreve as configuraes e comportamentos padro dos projetos de Servios da Web do ASP.NET e das chamadas de depurao para servios XML da Web a partir de aplicativos do cliente. Preparao para depurao : Aplicativos ASP.NET da Web Descreve as configuraes e comportamentos padro dos projetos de Servios da Web do ASP.NET etapas para a depurao, e de como alterar a configurao de depurao padro. Projetos Servio da Web XML depurao preparao: Descreve as configuraes e comportamentos padro dos projetos de Servios da Web do ASP.NET , ativando a depurao do ASP.NET, e de como alterar a configurao de depurao padro. Depurao no Visual Studio Fornece links para as sees maiores da documentao de depurao. Informaes incluem : novidades do depurador, definies e preparaes , pontos de interrupo , tratamento de excees, editar e continuar, cdigo gerenciado de depurao, depurao de projetos Visual C++ , depurando COM e ActiveX, depurando DLLs, depurando SQL, e as referncias a interfaces de usurios. Como depurar aplicativos da Web em um servidor remoto: Descreve requisitos de instalao para depurao remota de aplicativos da Web do ASP.NET.

Depurao SQL
Este tpico se aplica a: Visual Studio Edition Express Visual Basic No C# No C++ No J# No Visual Web Developer No

Visual C# Consolidado

563

Padro Pro / Team

No Sim

No Sim

No Sim

No Sim

No Sim

Com o depurador Visual Studio 2005, voc pode depurar conjuntos de mdulos do commom language runtime (CLR) gerenciados executando executando dentro do processo SQL Server 2005 em grande parte da mesma maneira que voc tem depurado stored procedures, funes, disparadores e outros tipos de objetos de banco de dados. Para obter mais informaes, consulte O que h de novo no depurador Visual Studio 2005. Nesta seo Limitaes depurao SQL Descreve restries e limitaes sobre o uso dos recursos de depurao SQL. Configurando O SQL Debugging Lista requisitos de software para depurao SQL, para o servidor e estao de trabalho, instrues para ativar depurao SQL, instalar, configurar e solucionar problemas de instalao. Depurao objetos de banco de dados SQL Fornece instrues detalhadas e exemplos para cada tipo de objeto de banco de dados SQL Server que pode ser depurado. Depurao de aplicao multi-camada de banco de dados Descreve como depurar aplicativos cujos componentes esto localizados em vrias mquinas. Sees relacionadas Viso geral sobre Ferramentas Visual Database Descreve e fornece links para tpicos em Microsoft Visual Database Tools e conexes de banco de dados e referncias. Criando objetos SQL Server 2005 em Cdigo Gerenciado Descreve como criar objetos de banco de dados SQL CLR em Visual Studio usando o tipo do projeto SQL Server.

Depurao referncia Interface de usurio


Voc pode encontrar as seguintes caixas de dilogo medida que voc depura seu aplicativo. Voc pode automatizar vrios recursos do depurador, usando o modelo de extensibilidade do Visual Studio. Para obter mais informaes, consulte o Visual Studio Debugging SDK.

Caixa de dilogo Choose Breakpoints

Visual C# Consolidado

564

Debug Source Files, Common Properties, caixa de dilogo Solution Property Pages Debugging, caixa de dilogo Options Caixa de dilogo Edit and Continue Caixa de dilogo Stop Debugging In Progress Caixas de dilogo Debugging Errors e Warning

COMO: Adicionar instrues de rastreamento ao cdigo da aplicao Os mtodos usados com mais freqncia para rastreamento so os mtodos para gravar sada no escutas: Write., Assert, WriteIf, WriteLineIfWriteLine e Fail Esses mtodos podem ser divididos em duas categorias: Write. e Fail todos Emitir sada incondicionalmente, enquanto WriteIf, WriteLine, WriteLineIf e Assert Testar uma Boolean condio, e escrever ou no gravar com base no valor da condio e WriteIfWriteLineIf Emitir sada da condio true, e Assert emite sada se a condio for false. Ao criar o Rastreamento e depurao estratgia, voc deve pensar sobre a sada para ver como voc deseja. Vrias Write instrues preenchidas com informaes no relacionadas criar um log que difcil de ler. Por outro lado, usando WriteLine para colocar instrues relacionadas em linhas separadas pode dificultar a distinguir quais informaes pertence juntos. Em geral, use vrias Write instrues quando voc deseja combinar informaes de vrias fontes para criar uma nica mensagem informativa, e a WriteLine instruo quando voc desejar criar uma mensagem nica e completa. Para gravar uma linha completa

Do WriteLine Chamar ou WriteLineIf mtodo. Um retorno de carro acrescentado ao final da mensagem esse mtodo retorna, para que a mensagem seguinte retornado pela Write, WriteIf, WriteLine, ou WriteLineIf ser iniciada na linha a seguir: Visual Basic
Dim errorFlag As Boolean = False Trace.WriteLine("Error in AppendData procedure.") Trace.WriteLineIf(errorFlag, "Error in AppendData procedure.")

C#
bool errorFlag = false; System.Diagnostics.Trace.WriteLine ("Error in AppendData procedure."); System.Diagnostics.Trace.WriteLineIf(errorFlag, "Error in AppendData procedure.");

J#
boolean errorFlag = false; System.Diagnostics.Trace.WriteLine("Error in AppendData procedure."); System.Diagnostics.Trace.WriteLineIf(errorFlag, "Error in AppendData procedure.");

Para gravar uma linha parcial

Do Gravar Chamar ou WriteIf mtodo. A mensagem seguinte colocar out pela Write, WriteIf, WriteLine,: ou WriteLineIf ser iniciada na mesma linha que a mensagem colocar Out por ou WriteIf instruo o Write C#

Visual C# Consolidado

565

bool errorFlag = false; System.Diagnostics.Trace.WriteIf(errorFlag, "Error in AppendData procedure."); System.Diagnostics.Debug.WriteIf(errorFlag, "Transaction abandoned."); Trace.Write("Invalid value for data request");

Para verificar que determinadas condies existir antes ou aps voc executar um mtodo

Chame o Declarar mtodo. C#


int I = 4; System.Diagnostics.Trace.Assert(I == 5, "I is not equal to 5.");

C#
int I = 4; System.Diagnostics.Trace.Assert(I == 5, "I is not equal to 5.");

Observao Voc pode usar Assert com o rastreamento e depurao. Este exemplo envia a pilha de chamadas para qualquer escuta na coleo Listeners. Para obter mais informaes, consulte Declaraes em cdigo gerenciado e Mtodo Debug.Assert. COMO: Criar e inicializar Listeners (escutas) de rastreamento O Debug e Trace Classes enviar mensagens para objetos chamados escutas que receber e processar essas mensagens. Um tal escuta para obter mais informaes, consulte Rastrear Listeners., o DefaultTraceListener, criado e inicializado quando o rastreamento ou depurao ativada; automaticamente Se voc desejar Trace ou Debug Sada para ser direcionado a qualquer fontes adicionais, voc deve criar e inicializar escutas de rastreamento adicionais Os ouvintes voc criar devem refletir suas necessidades individuais. Por exemplo, convm um registro de texto de toda a sada de rastreamento. Nesse caso, voc deve criar uma escuta que escreveu todas as sadas para um novo arquivo de texto quando ativado Por outro lado, voc pode deseja exibir sada durante a execuo do aplicativo somente Nesse caso, voc pode criar uma escuta que direcionado toda a sada para uma janela do console. O EventLogTraceListener pode direcionar a sada de rastreamento para um log de eventos, e o TextWriterTraceListener pode gravar a sada de rastreamento em um fluxo. Para criar e inicializar o ouvinte de rastreamento 1. Declare o ouvinte de rastreamento. Se voc est criando o ouvinte determinado exigir qualquer outro objeto, declare-los tambm. O exemplo a seguir mostra como criar uma escuta que grave em um arquivo de texto: C#
// Creates the text file that the trace listener will write to. System.IO.FileStream myTraceLog = new System.IO.FileStream("C:\\myTraceLog.txt", System.IO.FileMode.OpenOrCreate); // Creates the new trace listener. System.Diagnostics.TextWriterTraceListener myListener = new System.Diagnostics.TextWriterTraceListener(myTraceLog);

2.
o

Emitir a sada de rastreamento. Se voc desejar a escuta para receber toda sada de rastreamento, adicione o ouvinte de rastreamento para a Listeners coleo. O exemplo a seguir mostra como adicionar a escuta para a Listeners coleo: C#

Visual C# Consolidado

566

System.Diagnostics.Trace.Listeners.Add(myListener);

- ou o

Se voc no desejar a escuta para receber a sada de rastreamento, no adicionelo coleo Listeners. Voc pode emitir sada atravs uma escuta independente da coleo Listeners chamando os mtodos de sada de escuta na prpria. O exemplo a seguir mostra como gravar uma linha em uma escuta que no esteja na coleo Listeners : C#
myListener.WriteLine( "This output will not go to the Listeners collection");

3.

Se a escuta no for um membro da coleo Listeners, talvez seja necessrio para chamar o Flush mtodo para registrar a sada. C#
// Flushes the buffers of all listeners in the Listeners collection. System.Diagnostics.Trace.Flush(); // Flushes only the buffer of myListener. myListener.Flush();

COMO: Usar TraceSource e filtros com Listeners de rastreamento Um dos novos recursos do .NET Framework verso 2.0 um sistema de rastreamento avanada. O premise bsico inalterada: mensagens de rastreamento so enviadas atravs de opes para escuta, que informou os dados para uma mdia de sada associados. Uma diferena principal para verso 2.0 rastreamentos que podem ser iniciados a instncias da classe TraceSource. Destina TraceSource a funcionar como um sistema de rastreamento avanada e pode ser usada em vez do estticos mtodos do antigos Trace e Debug Classes de rastreamento.. O familiar Trace e Debug Classes ainda existir, mas a prtica recomendada para usar a TraceSource classe para rastreamento. Este tpico descreve o uso de junto com um arquivo de configurao do aplicativo. um TraceSource possvel, embora no recomendado, a usar de rastreamento sem o uso de um arquivo de configurao. um TraceSource Para obter informaes sobre rastreamento sem um arquivo de configurao, consulte COMO: Criar e inicializar fontes de rastreamento. Para criar e inicializar a fonte de rastreamento

A primeira etapa para instrumenting um aplicativo com o rastreamento para criar uma fonte de rastreamento. Em grandes projetos com vrios componentes, voc pode criar uma fonte de rastreamento separada para cada componente. A prtica recomendada consiste em usar o nome do aplicativo para o nome da fonte de rastreamento. Isso facilitar para manter os rastreamentos diferentes separadas. O cdigo a seguir cria uma nova fonte de rastreamento (mySource). (Activity1 e chama um mtodo que rastreia eventos) As mensagens de rastreamento so gravadas pelo ouvinte de rastreamento padro.
using System; using System.Diagnostics; using System.Threading; namespace TraceSourceApp { class Program { private static TraceSource mySource = new TraceSource("TraceSourceApp"); static void Main(string[] args) { Activity1(); mySource.Close(); return; } static void Activity1() { mySource.TraceEvent(TraceEventType.Error, 1, "Error message."); mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message."); } } }

Para criar e inicializar escutas de rastreamento e filtros

No programaticamente o cdigo no primeiro procedimento no identificar qualquer escutas de rastreamento ou filtros. O cdigo sozinho resulta nas mensagens de rastreamento sendo gravadas no ouvinte de rastreamento padro. Para configurar escutas de rastreamento especfico e seus filtros associados, edite o arquivo de configurao que corresponde ao nome do seu aplicativo. Contidas nesse arquivo, voc pode adicionar ou remover uma escuta, defina

Visual C# Consolidado

567

a propriedades e filtro para uma escuta, ou remover ouvintes. O exemplo de arquivo de configurao a seguir mostra como inicializar uma escuta de rastreamento Console e uma escuta de rastreamento do gravador de texto para a fonte de rastreamento que criado no procedimento anterior. Alm de configurar os ouvintes de rastreamento, o arquivo de configurao cria filtros para ambos os ouvintes de e cria uma opo de origem para a fonte de rastreamento. Duas tcnicas so mostradas para adicionar escutas de rastreamento: adicionando o ouvinte diretamente para a fonte de rastreamento e adicionando uma escuta coleo compartilhada escutas e depois adicion-lo pelo nome fonte de rastreamento. Os filtros identificados para os dois ouvintes so inicializados com nveis de origem diferentes. Isso resulta em algumas mensagens sendo escrito por apenas um dos dois os ouvintes.
<configuration> <system.diagnostics> <sources> <source name="TraceSourceApp" switchName="sourceSwitch" switchType="System.Diagnostics.SourceSwitch"> <listeners> <add name="console" type="System.Diagnostics.ConsoleTraceListener"> <filter type="System.Diagnostics.EventTypeFilter" initializeData="Warning"/> </add> <add name="myListener"/> <remove name="Default"/> </listeners> </source> </sources> <switches> <add name="sourceSwitch" value="Warning"/> </switches> <sharedListeners> <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="myListener.log"> <filter type="System.Diagnostics.EventTypeFilter" initializeData="Error"/> </add> </sharedListeners> </system.diagnostics> </configuration>

Para alterar o nvel no qual uma escuta grava uma mensagem de rastreamento

O arquivo de configurao inicializa as configuraes para a fonte de rastreamento no momento o aplicativo inicializado. Para alterar essas configuraes Voc deve alterar o arquivo de configurao e reiniciar o aplicativo ou programaticamente atualizar o aplicativo usando o System.Diagnostics.Trace.Refresh mtodo. O aplicativo pode alterar propriedades definidas pelo arquivo de configurao para substituir as configuraes especificadas pelo usurio dinamicamente. Por exemplo, convm garantir que mensagens importantes sempre so enviadas em um arquivo de texto, independentemente das configuraes atuais.
using System; using System.Diagnostics; using System.Threading; namespace TraceSourceApp { class Program { private static TraceSource mySource = new TraceSource("TraceSourceApp"); static void Main(string[] args) { Activity1(); // Change the event type for which tracing occurs. // The console trace listener must be specified // in the configuration file. First, save the original // settings from the configuration file. EventTypeFilter configFilter = (EventTypeFilter)mySource.Listeners["console"].Filter; // Then create a new event type filter that ensures // critical messages will be written. mySource.Listeners["console"].Filter = new EventTypeFilter(SourceLevels.Critical); Activity2(); // Allow the trace source to send messages to listeners // for all event types. This statement will override // any settings in the configuration file. mySource.Switch.Level = SourceLevels.All; // Restore the original filter settings. mySource.Listeners["console"].Filter = configFilter; Activity3(); mySource.Close(); return; } static void Activity1() { mySource.TraceEvent(TraceEventType.Error, 1, "Error message."); mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message."); } static void Activity2() { mySource.TraceEvent(TraceEventType.Critical, 3, "Critical message."); mySource.TraceInformation("Informational message."); } static void Activity3() { mySource.TraceEvent(TraceEventType.Error, 4, "Error message."); mySource.TraceInformation("Informational message."); } } }

COMO: Criar e inicializar opo de rastreamento Para usar opes de rastreamento, voc deve primeiro cri-los e coloc-los em seu cdigo No h duas classes predefinidas do qual voc pode criar objetos Opo: a BooleanSwitch classe e a TraceSwitch classe. Voc deve usar BooleanSwitch se voc cuidado somente sobre se ou no

Visual C# Consolidado

568

aparece uma mensagem de rastreamento; voc usaria TraceSwitch se necessrio para discriminate entre nveis de rastreamento. Se voc pode definir suas prprias mensagens de depurao e associ-los com nveis de rastreamento diferente. usado um TraceSwitch Voc pode usar os dois tipos de opo com rastreamento ou depurao. Por padro, e a TraceSwitch. est desativado estiver definido como nvel TraceLevel.Off um BooleanSwitch Opes de rastreamento podem ser criado e colocada em qualquer parte do seu cdigo que pode utilizem. Embora voc possa definir nveis de rastreamento e outras opes de configurao no cdigo, recomendvel que voc usar o arquivo de configurao para gerenciar o estado de seu opes. Isso ocorre porque permite gerenciar a configurao do comutaes no sistema de configurao que voc maior flexibilidade Voc pode ativar e desativar vrias opes e alterar nveis sem recompilar o aplicativo. Para obter mais informaes, consulte Configurando opes de rastreamento. Para criar e inicializar uma opo de rastreamento 1. 2. Defina uma opo como o tipo BooleanSwitch ou tipo TraceSwitch e definir o nome e descrio da opo. Configure o comutador de rastreamento. Para obter mais informaes, consulte Configurando opes de rastreamento. O cdigo a seguir cria duas opes, um dos cada tipo: C#
System.Diagnostics.BooleanSwitch dataSwitch = new System.Diagnostics.BooleanSwitch("Data", "DataAccess module"); System.Diagnostics.TraceSwitch generalSwitch = new System.Diagnostics.TraceSwitch("General", "Entire application");

COMO: Compilar condicionalmente com rastreamento e depurao Enquanto voc est depurando um aplicativo durante o desenvolvimento, o rastreamento e depurao de sada Ir para a janela de sada no Visual Studio. No entanto, para incluir recursos de rastreamento em um aplicativo implantado, voc deve compilar os aplicativos disponveis com a TRACE diretiva compilador ativada. Isso permite que cdigo de rastreamento para ser compilado na verso de lanamento do seu aplicativo. Se voc no ativar a TRACE diretiva, todo cdigo de rastreamento ser ignorado durante a compilao e no est includa no cdigo executvel que voc ir implantar. O Rastreamento e depurao mtodos tm associados atributos condicionais. Por exemplo, se o atributo condicional para rastreamento for true, todas as instrues de rastreamento so includas dentro um conjunto (um arquivo compilado.exe ou.dll); se o Trace atributo condicional for false, as instrues de rastreamento no esto includas. Voc pode ter um ou Debug atributo condicional ativada para uma criao, ou ambos, ou nenhum. o Trace Assim, existem quatro tipos de compilao: Debug, Trace, dois, ou nenhum. Alguns compilaes de verso para implantao de produo podem conter nenhum; compilaes de depurao mais conter ambos. Voc pode especificar as configuraes do compilador do seu aplicativo de vrias maneiras:

As pginas de propriedades A linha de comando (#CONST para Visual Basic e #define (para C#))

Para alterar as configuraes de compilao da caixa de dilogo pginas Propriedade

Visual C# Consolidado

569

1. 2. 3. 4.
o

Clique com o boto direito do mouse no n no Solution Explorer projeto. Escolha Properties no menu de atalho. Na caixa Property Page de dilogo que aparece, clique na Configuration Properties guia no painel esquerdo e escolha a Build opo. Escolha as configuraes do compilador desejado. No Visual Basic, marque as caixas de seleo para as configuraes do compilador voc deseja ativar. Desmarque as caixas de seleo para configuraes voc deseja desativar. Em C#, no campo Conditional Compilation Constants, digite o nome da configurao voc deseja ativar. Visual C# Observao Para habilitar o Debug e rastreamento, digite DEBUG;TRACE (ou TRACE;DEBUG). Excluir o nome de qualquer configurao voc deseja desativar. C# diferenciar maisculas de minsculas, e os nomes Configurao devero ser maisculos.

Para compilar disponveis cdigo usando a linha de comando

Definir uma opo de compilador condicional na linha de comando. O compilador ir incluir rastreamento ou depurar cdigo no executvel. Por exemplo, a seguinte instruo do compilador inserida na linha de comando incluiria seu cdigo de rastreamento em um executvel compilado: Para Visual Basic: vbc /r:System.dll /d:TRACE=TRUE /d:DEBUG=FALSE MyApplication.vb No C#: csc /r:System.dll /d:TRACE /d:DEBUG=FALSE MyApplication.cs Dica Para compilar mais de um arquivo do aplicativo, deixe um espao em branco entre os nomes de arquivo, por exemplo, MyApplication1.vb MyApplication2.vb MyApplication3.vb ou MyApplication1.cs MyApplication2.cs MyApplication3.cs. O significado das diretivas compilation Conditional-usado nos exemplos acima a seguinte: Diretiva
vbc csc /r: /d:

Significado Compilador do Visual Basic Compilador C# Referencia um conjunto externo (exe ou dll) Define um smbolo de compilao condicional

Observao Voc dever soletrar Trace ou Debug com letras maisculas. Para obter mais informaes sobre os comandos de compilao condicional, digite vbc /? (para Visual Basic) ou csc /? (no C#). No prompt de comando Para obter mais informaes, consulte Criando a partir da linha de comando (C#) ou Chamar o Compiler de linha de comando (Visual Basic). Para executar usando # de compilao condicional CONST ou # definir

Digite a instruo apropriada para a linguagem de programao na parte superior do arquivo de cdigo de fonte.

Visual C# Consolidado

570

Idioma Visual Basic

Instruo Trace #CONST = True Trace #CONST = False Debug #CONST = True Debug #CONST = False

Resultado Ativa o rastreamento Desativa o rastreamento Ativa a depurao Desativa depurao Ativa o rastreamento Desativa o rastreamento Ativa a depurao Desativa depurao

C#

# Definir Trace # undefine Trace # Defina debug # undefine Debug

Para desativar o rastreamento ou depurao 1. 2. Excluir a diretiva Compilador do seu cdigo fonte. - ou Comentrio fora a diretiva compilador. Observao Do d: quando voc est pronto para compilar, ou pode escolher Build do menu ou Build use o mtodo de linha de comando mas sem digitar para definir smbolos de compilao condicional. COMO: Criar e inicializar fontes de rastreamento Fontes de rastreamento podem ser criado e inicializado com ou sem o uso de arquivos de configurao. A abordagem recomendada consiste em usar arquivos de configurao para facilitar a reconfigurao dos rastreamentos produzido pelo rastreamento fontes em tempo de execuo. Para criar e inicializar uma fonte de rastreamento usando um arquivo de configurao 1. O cdigo de exemplo a seguir tem finalidade a executados em conjunto com um arquivo de configurao do aplicativo (mostrado na etapa 2). O arquivo de configurao inicializa as configuraes para a fonte de rastreamento no momento o aplicativo inicializado. O aplicativo pode alterar propriedades definidas pelo arquivo de configurao para substituir as configuraes especificadas pelo usurio dinamicamente. Por exemplo, convm garantir que mensagens importantes sempre so enviadas em um arquivo de texto, independentemente das configuraes atuais. O cdigo de exemplo a seguir demonstra a substituio das configuraes de arquivo para assegurar mensagens crticas so sada para os ouvintes de rastreamento. Alterar as configuraes de arquivo durante a execuo do aplicativo no altera as configuraes iniciais. Para fazer que voc deve reiniciar o aplicativo ou programaticamente atualizar o aplicativo usando o Refresh mtodo.
using System; using System.Diagnostics; using System.Threading; namespace TraceSourceApp { class Program { private static TraceSource mySource = new TraceSource("TraceSourceApp"); static void Main(string[] args) { Activity1(); // Change the event type for which tracing occurs. // The console trace listener must be specified // in the configuration file. First, save the original // settings from the configuration file. EventTypeFilter configFilter = (EventTypeFilter)mySource.Listeners["console"].Filter; // Then create a new event type filter that ensures // critical messages will be written. mySource.Listeners["console"].Filter = new EventTypeFilter(SourceLevels.Critical); Activity2(); // Allow the trace source to send messages to

Visual C# Consolidado

571

listeners // for all event types. This statement will override // any settings in the configuration file. mySource.Switch.Level = SourceLevels.All; // Restore the original filter settings. mySource.Listeners["console"].Filter = configFilter; Activity3(); mySource.Close(); return; } static void Activity1() { mySource.TraceEvent(TraceEventType.Error, 1, "Error message."); mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message."); } static void Activity2() { mySource.TraceEvent(TraceEventType.Critical, 3, "Critical message."); mySource.TraceInformation("Informational message."); } static void Activity3() { mySource.TraceEvent(TraceEventType.Error, 4, "Error message."); mySource.TraceInformation("Informational message."); } } }

2.

Do TraceSource TraceSourceApp criar o arquivo de configurao a seguir ao inicializar no exemplo de cdigo. O arquivo de configurao para um aplicativo hospedado pelo host executvel no mesmo diretrio como o aplicativo. O nome do arquivo de configurao o nome do aplicativo com uma extenso.config. Para nosso exemplo, TraceSourceApp.exe pode ser associado com um arquivo de configurao denominado TraceSourceApp.exe.config. O exemplo de arquivo de configurao a seguir mostra como inicializar uma escuta de rastreamento Console e uma escuta de rastreamento do gravador de texto para a fonte de rastreamento que criado na etapa anterior. Alm de configurar os ouvintes de rastreamento, o arquivo de configurao cria filtros para ambos os ouvintes de e cria uma opo de origem para a fonte de rastreamento. Duas tcnicas so mostradas para adicionar escutas de rastreamento: adicionando o ouvinte diretamente para a fonte de rastreamento e adicionando uma escuta coleo compartilhada escutas e depois adicionlo pelo nome fonte de rastreamento. Os filtros identificados para os dois ouvintes so inicializados com nveis de origem diferentes. Isso resulta em algumas mensagens sendo escrito por apenas um dos dois os ouvintes.
<configuration> <system.diagnostics> <sources> <source name="TraceSourceApp" switchName="sourceSwitch" switchType="System.Diagnostics.SourceSwitch"> <listeners> <add name="console" type="System.Diagnostics.ConsoleTraceListener"> <filter type="System.Diagnostics.EventTypeFilter" initializeData="Warning"/> </add> <add name="myListener"/> <remove name="Default"/> </listeners> </source> </sources> <switches> <add name="sourceSwitch" value="Warning"/> </switches> <sharedListeners> <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="myListener.log"> <filter type="System.Diagnostics.EventTypeFilter" initializeData="Error"/> </add> </sharedListeners> </system.diagnostics> </configuration>

Ao inicializar fontes de rastreamento, escuta, e filtros sem um arquivo de configurao

Voc pode instrumento rastreamento por uma fonte de rastreamento completamente embora cdigo sem o uso de um arquivo de configurao. Isso no recomendvel prtica, mas no pode ser circunstncias em que voc no desejam dependem do arquivos de configurao para garantir o rastreamento.
using System; using System.Diagnostics; using System.Threading; namespace TraceSourceApp { class Program { private static TraceSource mySource = new TraceSource("TraceSourceApp"); static void Main(string[] args) { mySource.Switch = new SourceSwitch("sourceSwitch", "Error"); mySource.Listeners.Remove("Default"); TextWriterTraceListener textListener = new TextWriterTraceListener("myListener.log"); ConsoleTraceListener console = new ConsoleTraceListener(false); console.Filter = new EventTypeFilter(SourceLevels.Information); console.Name = "console"; textListener.Filter = new EventTypeFilter(SourceLevels.Error); mySource.Listeners.Add(console); mySource.Listeners.Add(textListener); Activity1(); // Set the filter settings for the // console trace listener. mySource.Listeners["console"].Filter = new EventTypeFilter(SourceLevels.Critical); Activity2(); // Allow the trace source to send messages to //

Visual C# Consolidado

572

listeners for all event types. mySource.Switch.Level = SourceLevels.All; // Change the filter settings for the console trace listener. mySource.Listeners["console"].Filter = new EventTypeFilter(SourceLevels.Information); Activity3(); mySource.Close(); return; } static void Activity1() { mySource.TraceEvent(TraceEventType.Error, 1, "Error message."); mySource.TraceEvent(TraceEventType.Warning, 2, "Warning message."); } static void Activity2() { mySource.TraceEvent(TraceEventType.Critical, 3, "Critical message."); mySource.TraceInformation("Informational message."); } static void Activity3() { mySource.TraceEvent(TraceEventType.Error, 4, "Error message."); mySource.TraceInformation("Informational message."); } } }

Aperfeioando a depurao com o atributo de exibio do depurador


Atributos de exibio depurador permitir que o desenvolvedor do tipo, que especifica e melhor entende o comportamento em tempo de execuo desse tipo, para especificar o que tambm desse tipo aparncia da quando ele for exibido em um depurador. Alm disso, depurador atributos de exibio que fornecem uma Target propriedade podem ser aplicados no nvel do conjunto por usurios sem conhecimento do cdigo-fonte. O DebuggerDisplayAttribute atributo controla como um tipo ou membro exibido nas janelas varivel depurador. O DebuggerBrowsableAttribute atributo determina se e como um campo ou propriedade exibida nas janelas varivel depurador. O DebuggerTypeProxyAttribute atributo especifica um tipo substituto, ou um proxy, para um tipo e alteraes a maneira como o tipo exibido em janelas depurador. Quando voc exibir uma varivel que possui um proxy, ou tipo substituto, o proxy significa em para o tipo original na janela . de exibio depurador A janela varivel depurador exibe somente os membros do tipo proxy pblicos. Membros particulares no so exibidos. Usando o DebuggerDisplayAttribute O DebuggerDisplayAttribute Construtor tem um argumento nico: uma seqncia para ser exibido na coluna Valor para. instncias do tipo This string can contain braces ({ and }). O texto contido em um par de chaves avaliado como uma expresso. Por exemplo, faz com o seguinte cdigo C# ". Count = 4 " a ser exibida ao sinal de mais (+) est selecionado para expandir a exibio depurador para uma instncia de MyHashtable
[DebuggerDisplay("Count = {count}")] class MyHashtable { public int count = 4; }

Atributos aplicados s propriedades mencionadas na expresso no sero processados. Para o compilador C#, uma expresso geral permitido que tenha apenas acesso implcito referente instncia atual do tipo de destino a essa referncia. A expresso limitada; no nenhum acesso a aliases, locais, ou ponteiros. No cdigo C#, voc pode usar uma expresso geral entre as chaves que tenha acesso implcito ao this ponteiro para a instncia atual do apenas o tipo de destino. Por exemplo, se um objeto C# tem um substitudo ToString(), ser chamada a substituio e mostrar seu resultado o depurador em vez do Thus Padro {<typeName>}., se voc tiver substitudo ToString(), voc no precisa usar DebuggerDisplayAttribute. Se voc usar ambos, o DebuggerDisplayAttribute atributo prevalece sobre a ToString() substituio. Usando o DebuggerBrowsableAttribute Do DebuggerBrowsableAttribute Aplicar a um campo ou propriedade para especificar como o campo ou propriedade deve ser exibida na janela do depurador. O construtor para este atributo

Visual C# Consolidado

573

tem um dos valores DebuggerBrowsableState de enumerao, que especifica um dos seguintes estados:

indica Never que o membro no exibido na janela de dados. Por exemplo, usar esse valor para um campo remove o campo de hierarquia; o campo no exibido quando voc expande o tipo delimitador, clicando no sinal de mais (+) para a instncia Tipo. na DebuggerBrowsableAttribute indica Collapsed que o membro exibido mas no expandidos por padro. Esse o comportamento padro. indica RootHidden que o membro prprio no exibido, mas seus objetos constituintes sero exibidos se ele uma matriz ou coleo. Observao

O DebuggerBrowsableAttribute no oferece suporte ao Visual Basic no .NET Framework verso 2.0. Do DebuggerBrowsableAttribute o exemplo de cdigo a seguir mostra o uso de para impedir que a propriedade aps ele seja exibido na janela de depurao para a classe.
[DebuggerBrowsable(DebuggerBrowsableState.Never)] public static string y = "Test String";

Usando o DebuggerTypeProxy Use o DebuggerTypeProxyAttribute atributo quando voc precisa para significativamente e fundamentalmente altera o modo de exibio de depurao de um tipo, mas no alterar o tipo prprio. O DebuggerTypeProxyAttribute atributo usado para especificar um proxy de exibio para um tipo, permitindo que um desenvolvedor para adaptar o modo de exibio para o tipo. Esse atributo, como o DebuggerDisplayAttribute, pode ser usado no nvel do conjunto, no qual a Target propriedade caso especifica o tipo para que o proxy ser usado. O uso recomendado que este atributo especifica um tipo aninhado particular que ocorre dentro do tipo ao qual o atributo aplicado. Um avaliador expresso que oferece suporte digite visualizadores verifica para este atributo quando um tipo exibido. Se o atributo for encontrado, o avaliador expresso substituir o tipo de proxy para o tipo do atributo aplicado a exibio. Quando a janela varivel depurador exibe somente os membros do tipo proxy pblicos. estiver presente, o DebuggerTypeProxyAttribute Membros particulares no so exibidos. O comportamento da janela de dados no alterado por modos de exibio avanada atributo-. Para evitar criminais de desempenho desnecessrios, atributos do proxy de exibio no sero processados at que o objeto estiver expandido, atravs o usurio clica em sinal de mais (+) ao lado do tipo em uma janela de dados, ou atravs do aplicativo do atributo DebuggerBrowsableAttribute. Portanto, recomendvel que nenhum atributo seja aplicada ao tipo de exibio. Atributos podem e devem ser aplicadas dentro do corpo do tipo de exibio. Do DebuggerTypeProxyAttribute o exemplo de cdigo a seguir mostra o uso de para especificar um tipo a ser usado como um proxy de exibio depurador.
[DebuggerTypeProxy(typeof(HashtableDebugView))] class MyHashtable : Hashtable { private const string TestString = "This should not appear in the debug window."; internal class HashtableDebugView { private Hashtable hashtable; public const string TestStringProxy = "This should appear in the debug window."; // The constructor for the type proxy class must have a // constructor that takes the target type as a parameter. public HashtableDebugView(Hashtable hashtable) { this.hashtable = hashtable; } } }

Visual C# Consolidado

574

Exemplo Descrio O exemplo de cdigo a seguir pode ser exibido em Visual Studio 2005 Para ver os resultados da aplicao o DebuggerDisplayAttribute, DebuggerBrowsableAttribute., e DebuggerTypeProxyAttribute atributos Cdigo C#
using System; using System.Collections; using System.Diagnostics; using System.Reflection; //[assembly: DebuggerTypeProxy("MyHashtable.HashtableDebugView",TargetTypeName="MyHashtable")] class DebugViewTest { // The following constant will appear in the debug window for DebugViewTest. const string TabString = " "; // The following DebuggerBrowsableAttribute prevents the property following it // from appearing in the debug window for the class. [DebuggerBrowsable(DebuggerBrowsableState.Never)] public static string y = "Test String"; static void Main(string[] args) { MyHashtable myHashTable = new MyHashtable(); myHashTable.Add("one", 1); myHashTable.Add("two", 2); Console.WriteLine(myHashTable.ToString()); Console.WriteLine("In Main."); } } [DebuggerDisplay("{value}", Name = "{key}")] internal class KeyValuePairs { private IDictionary dictionary; private object key; private object value; public KeyValuePairs(IDictionary dictionary, object key, object value) { this.value = value; this.key = key; this.dictionary = dictionary; } } [DebuggerDisplay("Count = {Count}")] [DebuggerTypeProxy(typeof(HashtableDebugView))] class MyHashtable : Hashtable { private const string TestString = "This should not appear in the debug window."; internal class HashtableDebugView { private Hashtable hashtable; public const string TestString = "This should appear in the debug window."; public HashtableDebugView(Hashtable hashtable) { this.hashtable = hashtable; } [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] public KeyValuePairs[] Keys { get { KeyValuePairs[] keys = new KeyValuePairs[hashtable.Count]; int i = 0; foreach(object key in hashtable.Keys) { keys[i] = new KeyValuePairs(hashtable, key, hashtable[key]); i++; } return keys; } } } }

Como: Rastrear cdigo em um aplicativo A Trace classe permite-lhe instrumento seu aplicativo. Voc pode receber mensagens informativas do aplicativo em execuo que pode ajudar a diagnosticar problemas ou analisar o desempenho. Esta uma viso geral das etapas principais normalmente envolvidas na Usar rastreamento para analisar e corrigir possveis problemas em aplicativos implantados. Para obter mais informaes sobre como executar essas etapas, consulte o link apropriado. Para usar o rastreamento em um aplicativo 1. 2. 3. 4. Considere qual rastreamento sada ser voc deseja que receba onsite aps voc ter implantou o aplicativo. Criar um conjunto de opes. Para obter mais informaes, consulte Criando e ao inicializar opes de rastreamento. Adicionar as instrues de rastreamento ao cdigo do aplicativo. Determinar onde voc deseja a sada de rastreamento para aparecem e adicionar os ouvintes apropriados. Para obter mais informaes, consulte Criando e ao inicializar Listeners do rastreamento. Testar e depurar seu aplicativo e o cdigo de rastreamento que ele contm. Compilar o aplicativo em cdigo executvel usando um dos seguintes procedimentos:

5. 6.

Visual C# Consolidado

575

Use o Build menu juntamente com a Debug pgina da caixa Property Pages de dilogo no Solution Explorer. Use isso quando compilar no Visual Studio. - ou Do Trace uso e Debug diretivas de compilador para o mtodo de linha de comando de compilao. Para obter mais informaes, consulte Compilando condicionalmente com Rastreamento e depurao. Use isso quando compilar a partir da linha de comando. Se ocorrer um problema durante o tempo de execuo, ative a opo de rastreamento apropriada. Para obter mais informaes, consulte Configurando opes de rastreamento. O cdigo de rastreamento grava Rastrear mensagens para um destino especificado, por exemplo, uma tela, um arquivo de texto, ou um log de eventos. O tipo de escuta includo na coleo Trace.Listeners determina o destino.

7.

8.

Analisar as mensagens de rastreamento para identificar e entender o problema no aplicativo.

COMO: Configurar opes de rastreamento Pode aps tem o aplicativo foi distribudo, voc ainda ativar ou desativar a sada de rastreamento ao configurar as opes de rastreamento em seu aplicativo. Configurar uma opo significa alterao seu valor de uma fonte externa depois ele foi inicializado. Voc pode alterar os valores dos objetos opo usando o arquivo de configurao. Voc configurar uma opo de rastreamento para ativ-lo logon e logoff, ou para definir seu nvel, determinar a quantidade e digite de mensagens-passa junto para escuta. Comutaes so configuradas usando o arquivo.config. Para um aplicativo da Web, este o arquivo web.config associado ao projeto. Em um aplicativo do Windows, este arquivo nomeado (nome do aplicativo). exe.config. Em um aplicativo implantado, esse arquivo deve residir na mesma pasta como executvel. Quando o aplicativo executa o cdigo que cria uma instncia de uma opo para a primeira vez, ele verifica o arquivo de configurao para nvel rastreamento-informaes sobre a opo nomeada. O sistema de rastreamento examina o arquivo de configurao apenas uma vez para qualquer opo especfica na primeira vez seu aplicativo cria a opo. Em um aplicativo implantado, voc Ativar cdigo de rastreamento por reconfigurando objetos opo quando seu aplicativo est sendo executado. Isso normalmente envolve os objetos opo Ativar e desativar ou, alterando os nveis de rastreamento, e reiniciando o aplicativo. Quando voc cria uma instncia de uma opo, voc tambm inicializ-lo, especificando dois argumentos: um displayName argumento e um description argumento. O displayName argumento do construtor define a Switch.DisplayName propriedade da instncia Opo de classe. O displayName o nome que usado para configurar a opo no arquivo.config, e o description argumento deve retornar uma breve descrio da opo e que mensagens ele controles.. Em alm para Especifica o nome de uma opo para configurar, voc tambm deve especificar um valor para a opo. Esse valor um Integer. Para BooleanSwitch um valor de 0 corresponde a Off, e corresponde a On qualquer valor diferente de zero. Para TraceSwitch, 0,1,2,3, e 4 corresponde Off, Error e Verbose, respectivamente., Warning, Info Qualquer nmero maior que 4 tratada como Verbose, e qualquer nmero menor que zero tratado como Off. Para que os usurios para que seja possvel para configurar opes de rastreamento de um aplicativo, voc deve fornecer documentao detalhada sobre as opes em seu aplicativo. Voc deve detalhes quais opes controlam o que e como eles ativar e desativar. Voc tambm deve fornecer o usurio final com um arquivo.config que tenha ajuda apropriada nos comentrios.

Visual C# Consolidado

576

Alterna para criar e configurar rastreamento 1. 2.


o

Criar comutaes no cdigo. Para obter mais informaes, consulte Criando e ao inicializar opes de rastreamento. Se o projeto no contm um arquivo de configurao (App.config ou Web.config), seguida, no menu Project, selecione Add New Item. Na Visual Basic: caixa Add New Item de dilogo, escolha Application Configuration File. O arquivo de configurao do aplicativo criada e aberta. Isso um documento XML cujo elemento raiz <configuration>.

Na Visual C#: caixa Add New Item de dilogo, escolha XML File. Nome este arquivo app.config. No editor XML, aps a declarao XML, adicionar XML a seguir:
<configuration> </configuration>

Quando seu projeto compilado, o arquivo App.config copiado para a pasta de sada do projeto e renomeado applicationname. exe.config... exe.config 3. Aps a <configuration> marca, mas antes da </configuration> marca, adicione o XML apropriado para configurar comutaes. Os exemplos a seguir demonstram com uma DisplayName propriedade de TraceLevelSwitch. com uma DisplayName propriedade de DataMessageSwitch e a TraceSwitch uma BooleanSwitch
<system.diagnostics> <switches> <add name="DataMessagesSwitch" value="0" /> <add name="TraceLevelSwitch" value="0" /> </switches> </system.diagnostics>

Nessa configurao, as duas opes so logoff. 4. 5. 6. Caso voc precise ativar como qualquer inteiro diferente de 0. a BooleanSwitch, como
DataMessagesSwitch mostrado no exemplo anterior, alterar o Value

Caso voc precise ativar com a configurao Nvel apropriada (1 a 4). a TraceSwitch, como TraceLevelSwitch mostrado no exemplo anterior, alterar o Value Adicionar comentrios ao arquivo.config para que o usurio final tenha uma compreenso clara de quais valores para alterar para configurar as opes adequadamente. O exemplo a seguir mostra o cdigo final, inclusive comentrios, a aparncia:
<system.diagnostics> <switches> <!-- This switch controls data messages. In order to receive data trace messages, change value="0" to value="1" --> <add name="DataMessagesSwitch" value="0" /> <!-- This switch controls general messages. In order to receive general trace messages change the value to the appropriate level. "1" gives error messages, "2" gives errors and warnings, "3" gives more detailed error information, and "4" gives verbose trace information --> <add name="TraceLevelSwitch" value="0" /> </switches> </system.diagnostics>

Passo-a-passo: Depurao de um servio XML da Web As etapas nessa explicao passo a passo mostraro como depurar um XML Web service. Elas lhe mostraro como iniciar e parar a execuo e definir pontos de interrupo. Observao Por padro, o processo do ASP.NET, usando o Aspnet_wp.exe ou o W3wp.exe, executa sob a conta doASP.NET. Por esse motivo, voc deve ter privilgios de administrador no computador onde o ASP.NET ser executado para depur-lo. Para obter mais informaes consulte Requisitos

Visual C# Consolidado

577

do sistema ASP.NET depurao:. Observao As caixas de dilogo e comandos de menu voc v podem diferir daquelas descritas na ajuda dependendo de sua configurao ou edio ativa . Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Configuraes Visual Studio. Para se preparar para essa explicao passo a passo

Se voc j tiver uma soluo aberta, feche-a. Para criar e depurar um XML Web service 1. 2. 3. A partir do menuFile, clique em New, e clique em Web Site. A caixa de dilogo New Web Site ser exibida. No painel Templates, selecione ASP.NET Web Service. Agora voc pode especificar uma pasta em sua mquina local, ou uma URL para um computador remoto. Na lista drop-down Location , selecione File System, e na caixa de texto digite o diretrio em sua mquina local onde o XML Web Service ser localizado, e especifique um nome de diretrio exclusivo, como Website1. O XML Web service ter o mesmo nome que o diretrio. Se voc quisesse, voc poderia colocar o diretrio em um servidor remoto, ou explorar outras opes, clicando no boto Browse. Na lista drop-down Language , selecione a linguagem que ser usada. Clique em OK. O Visual Studio cria um novo projeto e Exibe cdigo para o Service.cs, um modelo. 6. Clique na margem prxima linha:
' Visual Basic Return "Hello World"

4. 5.

-ou// C# return "Hello World";

Um ponto vermelho aparecer e o texto na linha realado em vermelho. O ponto vermelho representa um ponto de interrupo. Quando voc executa o aplicativo com o depurador, o depurador interromper a execuo nesse local quando o cdigo for atingido. Voc pode ento ver o estado do seu aplicativo e depur-lo. Para obter mais informaes, consulte Pontos de interrupo. 7. 8. 9. 10. 11. 12. Verifique se a Active Configuration a configurao do Debug. No menu Debug, selecione Start ou pressione F5. A caixa de dilogo Debugging Not Enabled ser exibida. Selecione a opo Add a new Web.config file with debugging enabled, e clique em OK. O Internet Explorer abrir, e exibir o link Hello World. Clique no link Hello World. Uma nova pgina aberta no Internet Explorer. Na nova pgina, clique no boto Invoke. Neste ponto, voc atingir o ponto de interrupo no Visual Studio. Agora voc poder avaliar variveis na janela Watch, ver variveis locais, e avanar atravs de seu cdigo. 13. No menu Debug, clique em Stop Debugging.

Visual C# Consolidado

578

Para anexar-se ao XML Web service para depurao 1. 2. No Visual Studio, voc pode anexar o depurador a um processo em execuo. O procedimento a seguir mostra como fazer isso. No projeto atual, clique na margem prxima a linha que contm o seguinte cdigo:
' Visual Basic Return "Hello World" // C# return "Hello World";

Isso define um ponto de interrupo. Voc dever ver um ponto vermelho aparecendo na margem e um realce vermelho na linha de cdigo. 3. No menu Debug, selecione Start Without Debugging. O XML Web service inicia a execuo no Internet Explorer, mas o depurador no est conectado. 4. 5. No menu Debug, selecione Attach to Process. Voc tambm pode clicar emAttach to Process no menu Tools. Clique em Show processes from all users. Observao Se voc estiver atravs de uma sesso de servio de terminal ou de rea de trabalho remota, voc tambm deve selecionar Show processes in all sessions. 6. No painel Available Processes, localize WebDev.WebServer.EXE na coluna Process, e clique nele. O processo WebDev.WebServer.EXE carrega seu cdigo e exibe-o no Internet Explorer. 7. 8. 9. Clique no boto Attach. Voc tiver anexado o depurador ao seu servio da Web em execuo. No Internet Explorer, clique na linha que diz " Hello World ". Abre uma nova pgina. Na nova pgina, clique no boto Invoke. Nesse ponto, voc atingiu o ponto de interrupo no Visual Studio. Agora voc pode avaliar variveis na janela Watch , ver locais, e avanar atravs do seu cdigo. Passo-a-passo: Depurao de um formulrio do Windows Um formulrio do Windows uma das mais comuns aplicativos gerenciados. Um formulrio do Windows cria um aplicativo do Windows padro. Voc pode concluir essa explicao passo a passo usando Visual Basic, C#, J#, ou C++. Primeiro, voc deve fechar quaisquer solues abertas. Para preparar para essa explicao passo a passo

Se voc j tiver uma soluo aberta, feche-a. (No menu File, selecione Close Solution.) Criar um novo formulrio do Windows

Em seguida, voc criar um novo formulrio do Windows. Para criar o formulrio do Windows para essa explicao passo a passo 1. No menu File, escolha New e clique Project.

Visual C# Consolidado

579

A caixa de dilogo New Project ser exibida. 2. No painel tipos de projeto, abra o n Visual C#Visual Basic, Visual J# ou Visual C++, em seguida, 1. 2. 3. 4. 5. Para Visual Basic, Visual C# ou Visual J#, selecione a Windows., em seguida, marque Windows Application no painel Templates. Para Visual C++, selecione o CLR.

No painel Templates, selecione Windows Application. Na caixa Name, d ao projeto um nome exclusivo (por exemplo, Walkthrough_SimpleDebug). Clique em OK. Visual Studio cria um novo projeto e exibe um novo formulrio no Windows Forms . PaDesignerra obter mais informaes, consulte Windows Forms Designer.

6. 7. 8. 9. 10.

No menu View, selecione Toolbox. Abre a caixa de ferramentas. Para obter mais informaes, consulte Caixa de ferramentas. Na caixa de ferramentas, clique sobre o controle Button e arraste o controle para a superfcie de projeto de formulrio. Solte o boto no formulrio. Na caixa de ferramentas, clique sobre o controle TextBox e arraste o controle para a superfcie de projeto de formulrio. Solte a TextBox no formulrio. Na superfcie de projeto de formulrio, clique duas vezes no boto. Isso leva voc para a pgina de cdigo. O cursor deve estar no button1_Click. Na funo button1_Click., adicione o seguinte cdigo:
' Visual Basic textBox1.Text = "Button was clicked!" // C# textBox1.Text = "Button was clicked!"; // J# textBox1.set_Text("Button was clicked!"); // C++ textBox1->Text = "Button was clicked!";

11.

No menu Build, selecione Build Solution. O projeto deve criar-se com erros. Depurar seu formulrio

Agora, voc est pronto para iniciar a depurao.

Para depurar o formulrio do Windows criado para essa explicao passo a passo
1. Na janela de origem, clique na margem esquerda na mesma linha quo o texto foi adicionado:
' Visual Basic textBox1.Text = "Button was clicked!" // C# textBox1.Text = "Button was clicked!"; // J# textBox1.set_Text("Button was clicked!"); // C++ textBox1->Text = "Button was clicked!";

Um ponto vermelho aparece e o texto na linha realado em vermelho. O ponto vermelho representa um ponto de interrupo. Para obter mais informaes, consulte Pontos de interrupo. Quando voc executa o aplicativo sob o depurador, o depurador interromper a execuo nesse local quando o cdigo controntado. Voc pode exibir o estado do seu aplicativo e depur-lo. 2. 3. A partir do menu Debug, escolha Start. O formulrio do Windows comea a ser executado. No formulrio do Windows, clique no boto que voc adicionou. No Visual Studio, isso leva voc para a linha onde voc define o ponto de interrupo na pgina de cdigo. Esta linha deve ser realada em amarelo. Agora voc pode exibir as

Visual C# Consolidado

580

variveis no seu aplicativo e controlar sua execuo. Agora o aplicativo foi interrompido quando executava, aguardando uma ao de voc. Observao Se voc tiver definido a Active Solution Configuration como Release, a execuo no ser paralisada no ponto de interrupo. Isso simula o comportamento de um programa na verso real. O crculo que marca o ponto de interrupo ir conter um ponto de interrogao branco. Se necessrio, use a caixa de dilogo Configuration Manager para alterar essa configurao novamente para Debug. 4. 5. No menu Debug, escolha Windows, em seguida Watch, e clique em Watch1. Na janela Watch1, clique em um linha em branco. Na coluna Name, digite textBox1.Text (se voc estiver usando Visual Basic, Visual C#, ou J#) ou textBox1->Text (se voc estiver usando C++), pressione ENTER. A janela Watch1 mostra o valor dessa varivel entre aspas como:
""

6.

A partir do Menu Debug, escolha Step Into. O valor de textBox1.Text muda na janela Watch1 para:
Button was clicked!

7. 8. 9. 10.

A partir do Menu Debug, escolha Continue para continuar a depurao do programa. No formulrio do Windows, clique no boto novamente. Visual Studio quebra a execuo novamente. Clique no ponto vermelho que representa o ponto de interrupo. Isso remove o ponto de interrupo do seu cdigo. A partir do Menu Debug, escolha Stop Debugging. Anexar ao seu formulrio para depurao

No Visual Studio 2005, voc pode anexar o depurador a um processo em execuo. Se voc estiver usando um Edition Express, no h suporte para este recurso. Para anexar ao formulrio do Windows para depurao 1. No projeto criado acima, clique Na margem esquerda para definir mais uma vez um ponto de interrupo na linha que voc adicionou:
' Visual Basic textBox1.Text = "Button was clicked!" // C# textBox1.Text = "Button was clicked!" // J# textBox1.set_Text("Button was clicked!"); // C++ textBox1->Text = "Button was clicked!";

2.

No menu Debug, selecione Start Without Debugging. O formulrio do Windows inicia executando sob Windows, como se voc tivesse clicado duas vezes seu executvel. O depurador no est anexado.

3.

No menu Debug, selecione Attach to Process. (Este comando tambm est disponvel a partir do menuTools.) A caixa de dilogo Attach to Process ser exibida. No painel Available Processes, localize o nome do processo (Walkthrough_SimpleDebug.exe) na coluna Process e clique nele. Clique no boto Attach.

4. 5.

Visual C# Consolidado

581

6.

No seu formulrio do Windows, clique em um e somente um boto. O depurador quebra a execuo do formulrio do Windows no ponto de interrupo.

Passo-a-passo: Depurao da funo SQL CLR definida pelo usurio com valores em tabela
Este tpico se aplica a: Edio do Visual Studio Express Standard Pro / Team Visual Basic No No Sim C# No No Sim C++ No No Sim J# No No Sim Visual Web Developer No No Sim

Este exemplo mostra como depurar uma funo table-valued definida pelo usurio SQL CLR (UDF). Observao As caixas de dilogo e comandos de menu que voc v podem diferir daquelas descritas na Ajuda dependendo de suas configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Configuraes Visual Studio. Para depurar uma funo table-valued definida pelo usurio SQL CLR 1. 2. Em um novo projeto SQL Server estabelea uma conexo a um banco de dados. Para obter mais informaes, consulte Como conectar-se a um banco de dados:. Crie uma nova funo usando o cdigo da primeira seo de exemplo abaixo e a nomeie TableOfPtimes.cs. Para obter mais informaes, consulte Como Develop com o tipo do Project Server SQL:. Adicione um script que testa a funo, incluindo-a em uma instruo SELECT. No Solution Explorer, clique com o boto direito do mouse no diretrio TestScripts, clique em Add Test Script, e inserir o cdigo da segunda das sees de exemplo a seguir. Salve o arquivo com o nome ReadEventLog.sql. Clique com o boto direito do mouse no nome de arquivo, e clique em Set as Default Debug Script. Como voc est acessando o Event Log, voc deve alterar o Permission Level no banco de dados clicando o n do nome do projeto no Project Explorer, e clicando em Properties. Na caixa de propriedade que aparece no editor de textos, clique na guia Database, e em seguida, defina o Permission Level para Unsafe. O depurador no oferece suporte completo a depurao de assemblies inseguros. Em assemblies inseguros, voc pode criar novos segmentos e chamar cdigo no gerenciado, mas esses itens no so suportados pela depurao SQL CLR. 5. Defina pontos de interrupo no ReadEventLog.cs, e em seguida no menu Debug, clique em Start para compilar, implantar, e fazer o teste de unidade do projeto. Quando o ponteiro de instruo, designado por uma seta amarela, aparece em um ponto de interrupo, voc est depurando o cdigo SQL CLR. Experimente recursos de depurao diferentes.

3.

4.

6.

Visual C# Consolidado

582

1. 2. 3. 4.

No menu Debug, clique em Step Into repetidamente para observar a execuo linha por linha da funo. Conforme voc depura a funo, voc pode usar as janelas Locals e Watch para observar os valores dos diferentes membros. Clique em Continue novamente para concluir a depurao da funo. Na janela Output, selecione Database Output na lista suspensa Show output from, e voc pode observar os resultados da execuo das duas consultas no script TestPrims.sql.

Exemplo Este o cdigo que l o log de eventos.


using System; using System.Data; using System.Data.Sql; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; using System.Collections; public partial class UserDefinedFunctions { struct primeIndex { public int n; public int p; public primeIndex(int n, int p) { this.n = n; this.p = p; } } static bool isPrime(int p) { if (p < 2) return false; if (p == 2) return true; if (p % 2 == 0) return false; for (int d = 3; d * d < p; d+=2) { if (p % d == 0) return false; } return true; } static int nextPrime(int p) { int result = p + 1; while (!isPrime(result)) result++; return result; } [SqlFunction(FillRowMethodName = "Fill", TableDefinition = "n int,p int,est float")] public static IEnumerable TableOfPrimes(int n) { int p = 1; for (int i = 1; i <= n; i++) { p = nextPrime(p); yield return new primeIndex(i, p); } } private static void Fill(object source, out int n, out int p, out SqlDouble est) { primeIndex pi = (primeIndex)source; n = pi.n; p = pi.p; if (n <5) est = SqlDouble.Null; else { double log = Math.Log(n); double loglog = Math.Log(log); est = n * (log + loglog - 1 + loglog / log - 2 / log); } } }

Este o script de teste que chama a funo.


SELECT n,p,est FROM dbo.TableOfPrimes(50) SELECT TOP 10 n, p, est, est/p AS factor FROM dbo.TableOfPrimes(500) ORDER BY factor DESC SELECT TOP 10 n, p, est, est/p AS factor FROM dbo.TableOfPrimes(1000) WHERE n>500 ORDER BY factor DESC

Passo-a-passo: Depurao de um disparador SQL CLR


Este tpico se aplica a: Visual Studio Edition Express Padro Pro / Team Visual Basic No No Sim C# No No Sim C++ No No Sim J# No No Sim Visual Web Developer No No Sim

Este exemplo mostra como depurar um disparador CLR SQL. Ele usa a tabela Contact no banco de dados de exemplo AdventureWorks, que um dos bancos de dados instalado com SQL Server 2005. O exemplo cria um novo disparador CLR inserir na tabela Contact.

Visual C# Consolidado

583

Observao As caixas de dilogo e comandos de menu voc v pode diferir daquelas descritas na ajuda dependendo de suas configuraes ativas ou verso. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Configuraes Visual Studio. Para depurar um disparador CLR SQL: 1. Em um novo projeto do SQL Server, estabelecer uma conexo para o banco de dados AdventureWorks. Para obter mais informaes, consulte Como conectar-se a um banco de dados:. Criar um novo disparador usando o cdigo da primeira seo do exemplo abaixo, e nome-lo iContact.cs. Para obter mais informaes, consulte Como Develop com o tipo do Project Server SQL:. Adicionar um script que testa o disparador gerando uma ativao. No Solution Explorer clique com o boto direito do mouse no diretrio TestScripts, clique Add Test Script, e insira o cdigo da segunda seo do exemplo abaixo. Salve o arquivo com o nome truContact.sql. Clique com o boto direito do mouse no nome de arquivo e clique em Set as Default Debug Script. Defina pontos de interrupo no iContact.cs, e clique em Start do menu Debug para compilar, implantar e testar a unidade do projeto. Quando o ponteiro de instruo, designado por uma seta amarela, aparecer em um ponto de interrupo, voc est depurando o disparador. Experimente recursos de depurao diferentes. 1. 2. Passe a instruo instanciando o SqlTriggerContext. Abra a janela Locals. Observe que voc pode abrir a varivel triggContext, que a SqlTriggerContext, e voc pode examinar seus membros. Para obter mais informaes, consulte Como: usar janelas variveis do depurador. Observao

2.

3.

4.

5.

O servidor pode no refletir as alteraes em valores de variveis nas janelas do depurador. Par obter mais informaes, consulte Limitaes depurao SQL. 3. 4. Escolha Step Into no menu Debug para passar uma linha na stored procedure. Observe que a execuo tem instanciado o valor da varivel sqlP do tipo SqlPipe. Abra a janela Watch. Arraste a varivel sqlP para qualquer local na janela Watch. A varivel agora adicionada lista de variveis observadas. Para obter mais informaes, consulte Como: usar janelas variveis do depurador. Observao Voc pode editar os valores das variveis na janela Watch. 5. 6. No editor de texto, clique com o boto direito do mouse na linha ltima e clique em Insert Breakpoint. No menu Debug, clique Continue e o depurador executar o cdigo at o novo ponto de interrupo.

Visual C# Consolidado

584

6.

Clique Continue novamente para concluir a depurao do disparador. Uma mensagem aparece na janela Output informando que o disparador foi depurado com xito e exibe o resultado da execuo dos comandos no arquivo truContact.sql.

Exemplo Isso o cdigo necessrio para criar o disparador usado neste exemplo.
using System; using System.Data; using System.Data.Sql; using Microsoft.SqlServer.Server; public partial class Triggers { // Enter existing table or view for the target and uncomment the attribute line. [Microsoft.SqlServer.Server.SqlTrigger (Name="Trigger1", Target="primes", Event="FOR UPDATE")] public static void Trigger1() { SqlTriggerContext triggContext = SqlContext.TriggerContext; SqlPipe sqlP = SqlContext.Pipe; sqlP.Send("primes inserted!"); } }

Este o script de teste que far com que o disparador seja acionado.
UPDATE Person.Contact SET MiddleName = 'A' WHERE ContactID = 8

Passo-a-passo: Depurao de um tipo SQL CLR definido pelo usurio


Este tpico se aplica a: Edio do Visual Studio Express Standard Pro/Team Visual Basic No No Sim C# No No Sim C++ No No Sim J# No No Sim Visual Web Developer No No Sim

Este exemplo mostra como depurar um tipo SQL CLR definido pelo usurio. Ele cria um novo tipo SQL CLR no banco de dados de exemplo AdventureWorks. O tipo depois usado em uma definio de tabela, uma instruo INSERT, e em seguida em uma instruo SELECT. Observao As caixas de dilogo e comandos de menu que voc v podem diferir daquelas descritas na Ajuda dependendo de suas configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Configuraes Visual Studio. Para depurar um tipo CLR SQL definido pelo usurio 1. Em um novo projeto do SQL Server, estabelea uma conexo com a banco de dados de exemplo AdventureWorks. Para obter mais informaes, consulte Como conectar-se a um banco de dados:. Crie um novo tipo usando o cdigo da primeira seo exemplo abaixo, e nomeie-a Point.cs. Para obter mais informaes, consulte Como Develop com o tipo do Project Server SQL:.

2.

Visual C# Consolidado

585

3.

Adicione um script que testa o tipo. No Solution Explorer, clique com o boto direito do mouse no diretrio TestScripts , clique Add Test Script, e insera o cdigo da segunda seo de exemplo abaixo. Salve o arquivo com o nome Point.sql. Clique com o boto direito do mouse no nome de arquivo, e clique em Set as Default Debug Script. Adicione pontos de interrupo. 1. 2. Na pasta Types no Server Explorer, abra Point. Insira um ponto de interrupo dentro de cada mtodo de modo que voc possa observar o fluxo de controle no interior do tipo.

4.

5.

A partir do menu Debug, escolha Start para compilar, implantar, e testar o projeto. Quando o ponteiro de instruo, designado por uma seta amarela, aparecer no ponto de interrupo, voc est depurando sua funo. Experimente recursos de depurao diferentes. 1. O mtodo Parse executado uma vez para cada instruo INSERT no script no Point.sql. Repetidamente clicando Step Into no Debug menu, voc pode observar como o mtodo converte um par de nmeros delimitado por dois-pontos em um objeto Point. Na janela Locals, abra a varivel pt, que contm o Point que est sendo criado atualmente. No editor de texto, clique duas vezes a varivel pt para selecion-la. Arraste pt para qualquer local na janela Watch. Agora pt adicionado lista de variveis observadas, e voc pode observ-la comforme o Point executado. Depurar a classe vrias vezes e observar as diferenas entre os caminhos de um
INSERT e um SELECT.

6.

2. 3.

4. 5. Exemplo

Pressione Continue novamente para concluir a depurao da funo.

Isso o cdigo que define o tipo usado neste exemplo. Este cdigo cria uma tabela denominada pontos, insere linhas nela, e imprime o contedo da tabela. Observe que voc no deve incluir o comando em lote GO entre a criao da tabela e seu acesso. Na verdade Visual Studio 2005 interpretar o GO como um comando SQL invlido.
using System; using System.Data.Sql; using System.Data.SqlTypes; using System.Runtime.Serialization; [Serializable, SqlUserDefinedTypeAttribute(Format.Native)] public struct Point: INullable { private bool m_isNull; private double m_x; private double m_y; public bool IsNull { get { return (m_isNull); } } public override string ToString() { if (this.IsNull) { return "NULL"; } else { return this.m_x + ":" + this.m_y; } } public static Point Parse(SqlString s) { if (s.IsNull) { return Null; } else { // Parse input string here to separate out points: Point pt = new Point(); string str = Convert.ToString(s); string[] xy = str.Split(':'); pt.X = Convert.ToDouble(xy[0]); pt.Y = Convert.ToDouble(xy[1]); return (pt); } } public static Point Null { get { Point pt = new Point(); pt. m_isNull = true; return (pt); } } public double X { get { return (this.m_x); } set { m_x = value; } } public double Y { get { return (this.m_y); } set { m_y = value; } } }

Este o script de teste que chama a funo.


CREATE TABLE dbo.Points ( ID int IDENTITY(1,1) PRIMARY KEY, Pnt Point) INSERT INTO dbo.Points (Pnt) VALUES (CONVERT(Point, '3:4')) INSERT INTO dbo.Points (Pnt) VALUES (CONVERT(Point, '-1:5')) INSERT INTO dbo.Points (Pnt) VALUES (CAST ('1:99' AS Point)) SELECT ID, Pnt.ToString() as StringPoint, Pnt.X as X, Pnt.Y as Y FROM dbo.Points

Visual C# Consolidado

586

Passo-a-passo: Depurao de uma funo SQL CLR escalar definida pelo usurio
Este tpico se aplica a: Visual Studio Edition Express Padro Pro / Team Visual Basic No No Sim C# No No Sim C++ No No Sim J# No No Sim Visual Web Developer No No Sim

Este exemplo mostra como depurar uma funo SQL CLR definida pelo usurio (UDF). Ele cria uma nova funo SQL CLR definida pelo usurio no banco de dados de exemplo AdventureWorks. Observao As caixas de dilogo e comandos de menu voc v podem diferir daquelas descritas na ajuda dependendo das suas configuraes ativas ou verso. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Configuraes Visual Studio. Para depurar uma funo escalar CLR SQL definida pelo usurio 1. Em um novo projeto do SQL Server, estabelea uma conexo com a banco de dados de exemplo AdventureWorks. Para obter mais informaes, consulte Como conectar-se a um banco de dados:. Criar uma nova funo usando o cdigo da primeira seo do exemplo abaixo, e nome-la OrderCount.cs. Para obter mais informaes, consulte Como Develop com o tipo do Project Server SQL:. Adicionar um script que testa a funo incluindo-o em uma instruo SELECT. No Solution Explorer, clique com o boto direito do mouse no diretrio TestScripts, clique Add Test Script e insira o cdigo da segunda seo do exemplo abaixo. Salve o arquivo com o nome CallOrderCount.sql. Clique com boto direito mouse no nome do arquivo e escolha Set as Default Debug Script. Coloque um ponto de interrupo no OrderCount.cs na linha que instancia um
SqlCommand, e no menu Debug, clique Start para compilar, implantar e testar a unidade do

2.

3.

4.

projeto. Quando o ponteiro de instruo, designado por uma seta amarela, aparecer no ponto de interrupo, voc est depurando sua funo. 5. Experimentar recursos de depurao diferentes. 1. 2. 3. Passe a instruo instanciando o SqlCommand usando Step Into a partir do menu Debug. Na janela Locals, abra a varivel sqlComm, que o SqlCommand e examine seus membros. Clique Step Into no menu Debug para passar uma linha na funo. Observe que o membro sqlComm.CommandText foi instanciado tem.

Visual C# Consolidado

587

4. 5. 6. 7. 8. Exemplo

No editor de texto, arraste sqlComm para qualquer local na janela Watch. A varivel agora adicionada lista de variveis observadas. Escolha Step Into novamente e observe que uma nova janela rotulada Dynamic TSQL abre, exibindo a instruo SQL que est prestes a ser executada. Escolha Step Into por executar a instruo e retornar para a funo. Pressione Continue novamente, e observe a segunda janela Dynamic T-SQL que abre, mostrando o cdigo que retorna o valor da funo. Pressione Continue novamente para concluir a depurao da funo.

Isso o cdigo necessrio para criar a funo.


using System; using System.Data.SqlClient; using Microsoft.SqlServer.Server; public partial class UserDefinedFunctions { [Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)] public static int OrderCount() { using (SqlConnection conn = new SqlConnection("context connection=true")) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = "SELECT 42"; //cmd = new SqlCommand("SELECT 42",conn); int result = (int)cmd.ExecuteScalar(); return result; } } };

Este o script de teste que chama a funo.


SELECT dbo.OrderCount()

Passo-a-passo: Depurao de uma agregao SQL CLR definida pelo usurio


Este tpico se aplica a: Edio Visual Studio Express Standard Pro / Team Visual Basic No No Sim C# No No Sim C++ No No Sim J# No No Sim Visual Web Developer No No Sim

Este exemplo mostra como depurar uma CLR SQL agregada definida pelo usurio. Ele cria uma nova funo CLR SQL agregada chamada Concatenate no banco de dados de exemplo AdventureWorks. Quando esta funo chamada em uma instruo SQL, ela ir concatenar todos os valores para coluna especificada como seu parmetro de entrada. Observao As caixas de dilogo e comandos de menu que voc v podem diferir daquelas descritas na Ajuda dependendo da suas configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Configuraes Visual Studio.

Visual C# Consolidado

588

Para depurar uma funo CLR SQL agregada 1. Em um novo projeto do SQL Server, estabelea uma conexo com o banco de dados de exemplo AdventureWorks. Para obter mais informaes, consulte Como conectar-se a um banco de dados:. Crie uma nova funo usando o cdigo do primeiro dos exemplo de sees a seguir e denomine-o Concatenate.cs. Para obter mais informaes, consulte Como Develop com o tipo do Project Server SQL:. Adicione um script que testa a funo, incluindo-o em uma instruo SELECT. No Solution Explorer clique com o boto direito do mouse no diretrio TestScripts, selecione Add Test Script, e insira o cdigo da segunda seo de exemplo abaixo. Salve o arquivo com o nome Concatenate.sql. Clique com o boto direito do mouse no nome de arquivo, e clique em Set as Default Debug Script. Coloque um ponto de interrupo na Concatenate.cs dentro do mtodo Accumulate na instruo if. Para fazer isso, clique na margem esquerda cinza da janela do editor de texto, e no menu Debug, clique em Start, para compilar, implantar, e testar a unidade do projeto. Quando o ponteiro de instruo, designado por uma seta amarela, aparecer no ponto de interrupo, significa que voc est depurando sua funo. Experimente recursos de depurao diferentes. 1. O mtodo Accumulate executado uma vez para cada linha que constitui a clusula GROUP BY em script na Concatenate.sql. Repetidamente clicando Step Into no menu Debug, voc pode observar como o resultado do mtodo criado. 2. 3. Na janela Locals, abra a varivel value, que contm o nome de armazenamento atual sendo processado. Clique na varivel this. O n filho intermediateResult ser retornado dessa funo, e contm todos os nomes de armazenamento at o armazenamento presente, concatenados juntos e separados por vrgulas. No editor de texto, clique duas vezes a varivel intermediateResult para selecion-lo. Arraste intermediateResult para a janela Watch e solte-a em qualquer lugar na janela. A varivel agora adicionada lista de variveis observadas. Avane pelo mtodo vrias vezes. O valor de intermediateResult ser alterado toda vez atravs do mtodo, com um nome de armazenamento adicional concatenado at o final. Clique no ponto de quebra para remov-la, e adicione um ponto de quebra para a primeira instruo dentro do mtodo Terminate. Esse mtodo retorna o resultado para o chamador. Para avanar por ele, no menu Debug, clique em Start. Voc pode agora depurar por ele clicando Step Into no menu Debug. Pare quando voc chegar na instruo return. Clique em Continue novamente para concluir a depurao da funo.

2.

3.

4.

5.

4.

5.

6.

7. Exemplo

Este o cdigo para a funo agregada usada no exemplo.


using System; using System.Data.Sql; using System.Data.SqlTypes; using System.Data.SqlServer; using System.IO; using System.Text; [Serializable] [SqlUserDefinedAggregate( //use CLR serialization to serialize the intermediate result. Format.UserDefined, //Optimizer property: IsInvariantToNulls=true, //Optimizer property: IsInvariantToDuplicates=false, //Optimizer property: IsInvariantToOrder=false, //Maximum size in bytes of persisted value: MaxByteSize=8000) ] public class Concatenate: IBinarySerialize { /// <summary> /// Variable holds intermediate result of the concatenation /// </summary> private StringBuilder intermediateResult; /// <summary> /// Initialize the internal data structures ///

Visual C# Consolidado

589

</summary> public void Init( ) { intermediateResult = new StringBuilder(); } /// <summary> /// Accumulate the next value, nop if the value is null /// </summary> /// <param name="value"></param> public void Accumulate(SqlString value) { if(value.IsNull) { return; } intermediateResult.Append(value.Value).Append(','); } /// <summary> /// Merge the partially computed aggregate with this aggregate. /// </summary> /// <param name="other"></param> public void Merge( Concatenate other) { intermediateResult.Append(other.intermediateResult); } /// <summary> /// Called at end of aggregation, to return results. /// </summary> /// <returns></returns> public SqlString Terminate() { string output = string.Empty; //Delete the trailing comma, if any . if (intermediateResult != null && intermediateResult.Length > 0) output = intermediateResult.ToString(0, intermediateResult.Length-1); return new SqlString(output); } public void Read(BinaryReader r) { intermediateResult = new StringBuilder(r.ReadString()); } public void Write(BinaryWriter w) { w.Write(intermediateResult.ToString()); } }

Este o script de teste que chama a funo.


SELECT scu.SalesPersonID, dbo.Concatenate(sst.Name) FROM Sales.Customer as scu INNER JOIN Sales.Store as sst ON scu.CustomerID = sst.CustomerID INNER JOIN Sales.SalesPerson as spr ON scu.SalesPersonID = spr.SalesPersonID WHERE scu.SalesPersonID = 283 GROUP BY scu.SalesPersonID

Banco de dados de depurao T-SQL


Este tpico se aplica a: Edio do Visual Studio Express Standard Pro / Team Visual Basic No No Sim C# No No Sim C++ No No Sim J# No No Sim Visual Web Developer No No Sim

Esta seo contm exemplos demonstrando a depurao para todos os tipos de objeto de banco de dados T-SQL. No passado, os desenvolvedores T-SQL freqentemente escrevam e depuraram seus aplicativos T-SQL usando a ferramenta SQL Server Query Analyzer. Hoje, Query Analyzer foi substitudo pelo SQL Server Management Studio, que no tem o depurador. Os desenvolvedores T-SQL agora usam o depurador Visual Studio 2005 em vez disso. Os desenvolvedores tambm podem gravar seus aplicativos T-SQL no Visual Studio 2005, usando um projeto de banco de dados. Independentemente de voc escrever seu aplicativo TSQL no Visual Studio 2005 ou no, procedimentos de depurao so quase idnticos. H trs cenrios de depurao a serem considerados:

Depurao em um objeto de banco de dados T-SQL. Para obter mais informaes, consulte Como etapa em um objeto usando Server Explorer:.

Visual C# Consolidado

590

Execuo de um script de teste a partir do SQL Server Management Studio. Para obter mais informaes, consulte Como: Depurar T-SQL usando o SQL Server Management Studio:. Execuo de um script de teste em um projeto de banco de dados do Visual Studio 2005. Para obter mais informaes, consulte Como Develop na T-SQL com o tipo do projeto de banco de dados:.

A fim de depurar um disparador, voc deve iniciar a sesso de depurao em um procedimento armazenado. No possvel depurar um script SQL autnomo, fazer com que ele acione um disparador, e ser capaz de depurar o disparador.

Passo-a-passo: Depurao um disparador T-SQL


Este tpico se aplica a: Visual Studio Edition Express Padro Pro / Team Visual Basic No No Sim C# No No Sim C++ No No Sim J# No No Sim Visual Web Developer No No Sim

Para depurar um disparador, voc define um ponto de interrupo em um procedimento armazenado que far com que o disparador seja acionado, defina um ponto de interrupo no disparador, e prossiga como descrito em Passo-a-passo: Depurao de um procedimento T-SQL armazenado. Este exemplo usa o banco de dados AdventureWorks, que tem uma tabela Sales.Currency com um disparador UPDATE disparador. O exemplo inclui um procedimento armazenado que atualiza uma linha na tabela, fazendo com que o disparador seja acionado. Defina pontos de interrupo no disparador, e atravs da execuo do procedimento armazenado com parmetros diferentes, voc pode seguir caminhos de execuo diferentes no disparador. Observao As caixas de dilogo e comandos de menu que voc v podem diferir daquelas descritas na ajuda dependendo de seu configuraes ou edio ativas. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Configuraes Visual Studio. Para depurar um disparador SQL 1. Em um novo projeto do SQL Server, estabelea uma conexo com o banco de dados AdventureWorks do exemplo . Para obter mais informaes, consulte Como conectar-se a um banco de dados:. Crie um novo procedimento armazenado usando o cdigo da primeira seo de exemplo abaixo, e denomine-oUpdateCurrency_T_SQL. Para obter mais informaes, consulte Como Develop com o tipo do Project Server SQL:. Defina pontos de interrupo no UpdateCurrency_T_SQL. Isso opcional, porque a Depurao Direta de Banco de Dados faz com que a primeira linha do procedimento atue como um ponto de interrupo.

2.

3.

Visual C# Consolidado

591

4.

Defina pontos de interrupo para o disparador. 1. Abra o cdigo fonte do disparador, clicando com o boto direito do mouse no n Tablesn e, ento, clicando com o boto direito do mouse no n da tabela Sales.Currencye, em seguida, clicando duas vezes no cone para o disparador que chamado uCurrency. Clique com boto esquerdo do mouse na margem cinza ao lado da instruo SET NOCOUNT ON para definir um ponto de interrupo no disparador. Esta etapa no opcional : se voc no definir um ponto de interrupo no disparador, voc ir ignorar seu cdigo quando voc tentar passar por ele.

2.

5.

Entre no procedimento armazenado. Para obter mais informaes, consulte Como etapa em um objeto usando Server Explorer:. A caixa de dilogo Run Stored Procedure ser exibida, perguntando por valores de parmetro.

6.

Defina os valores de parmetros a seguir: 1. 2. @currencyCode= AAA @name= Um valor arbitrrio como, por exemplo,Nome do Meu Teste.

A seta amarela de um ponteiro de instruo aparece na linha SET @mynvarchar = @@VERSION, a primeira linha executvel de cdigo no procedimento armazenado. 7. Experimente recursos de depurao diferentes. 1. Depure o cdigo usando a tecla F11 ou o boto Step Into. Na instruo UPDATE, quando voc pressionar F11 novamente, voc entrar no disparador. 2. 8. Depure o disparador at que voc saia de volta ao procedimento armazenado, e continue at o fim.

Voc pode verificar os dados que foram inserido clicando com o boto direito do mouse no n Sales.Currency em Tables, e em clicando em Show Table Data no Server Explorer.

Exemplo Esse o cdigo para o procedimento armazenado que faz com que o disparador seja acionado.
ALTER PROCEDURE dbo.UpdateCurrency_T_SQL ( @currencyCode nvarchar(3), @Name nvarchar(50) ) AS SET NOCOUNT ON UPDATE Sales.Currency SET Name = @Name WHERE CurrencyCode = @currencyCode RETURN

Passo-a-passo: Depurao de uma funo T-SQL definida pelo usurio


Este tpico se aplica a: Edio do Visual Studio Express Standard Pro/Team Visual Basic No No Sim C# No No Sim C++ No No Sim J# No No Sim Visual Web Developer No No Sim

Visual C# Consolidado

592

Este exemplo usa uma funo definida pelo usurio existente chamada de ufnGetStock no banco de dados AdventureWorks. Esta funo retorna uma contagem de itens em estoque para um determinado ProductID. O exemplo cria um procedimento armazenado que chama a funo vrias vezes. O procedimento armazenado chama a funo com parmetros diferentes, para que voc possa seguir caminhos de execuo diferentes atravs da funo. O exemplo tambm ilustra como saltar de um objeto TSQL, o procedimento armazenado, para outro, a funo. As etapas so semelhantes quelas em Passo-a-passo: Depurao de um procedimento T-SQL armazenado. Voc tambm pode fazer Direct Database Debugging (depurao de banco de dados direta) entrando na funo no Server Explorer. Para depurar uma funo definida pelo usurio 1. Em um novo projeto do SQL Server, estabelea uma conexo com o banco de dados de exemplo AdventureWorks. Para obter mais informaes, consulte Como conectar-se a um banco de dados:. Crie um novo procedimento armazenado usando o cdigo da seo de exemplo abaixo e denomine-o de Test_ufnGetStock. Para obter mais informaes, consulte Como Develop com o tipo do Project Server SQL:. Defina pontos de interrupo em Test_ufnGetStock. Isso opcional, porque a Direct Database Debugging (depurao de banco de dados direta) faz com que a primeira linha do procedimento atue como um ponto de interrupo. Defina pontos de interrupo na funo definida pelo usurio ufnGetStock. 1. 2. 5. Abra o cdigo-fonte para a funo clicando com o boto direito do mouse no n Functions no Server Explorer, depois clique duas vezes no cone ufnGetStock. Clique com o boto esquerdo do mouse na margem cinza ao lado da instruo
DECLARE para definir um ponto de interrupo.

2.

3.

4.

Entre no procedimento armazenado. Se o procedimento tivesse parmetros, a caixa de dilogo Run Stored Procedure seria exibida, perguntando por seus valores. Nesse caso, os parmetros so todos embutidos em cdigo dentro do procedimento armazenado. Para obter mais informaes, consulte Como etapa em um objeto usando Server Explorer:. Experimente diferentes recursos de depurao. 1. Passe pelo cdigo usando a tecla F11 ou o boto Step Into. Na instruo SELECT, quando voc pressionar F11 novamente, voc entrar na funo definida pelo usurio. Passe pela funo at que voc saia de volta para o procedimento armazenado e continue. Voc pode observar caminhos diferentes de execuo na funo de acordo com os parmetros de entrada. Voc pode ver os valores das variveis em funes definidas pelo usurio na janela Locals, ou colocando o cursor sobre elas.

6.

2.

Exemplo Isso o cdigo para o procedimento armazenado que chama a funo definida pelo usurio.
ALTER PROCEDURE Test_ufnGetStock AS SELECT dbo.ufnGetStock(1) as CurrentStock -- non-zero inventory SELECT dbo.ufnGetStock(316) as CurrentStock -- zero inventory SELECT dbo.ufnGetStock(5) as CurrentStock -- no such product

Passo-a-passo: Depurao de um procedimento T-SQL armazenado

Visual C# Consolidado

593

Este tpico se aplica a: Visual Studio Edition Express Standard Pro/Team Visual Basic No No Sim C# No No Sim C++ No No Sim J# No No Sim Visual Web Developer No No Sim

Este exemplo mostra como criar e depurar um procedimento armazenado T-SQL com depurao direta no banco de dados (Direct Database Debugging), em outras palavras, entrar no procedimento armazenado usando Server Explorer. Tambm ilustra diferentes tcnicas de depurao, como definio de pontos de interrupo, exibio de itens de dados, e assim por diante. Observao As caixas de dilogo e comandos de menu que voc v podem diferir daqueles descritos na Ajuda dependendo de suas configuraes ativas ou de edio. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Configuraes Visual Studio. Para depurar um procedimento armazenado T-SQL 1. Em um novo projeto do SQL Server, estabelea uma conexo com o banco de dados de exemplo AdventureWorks. Para obter mais informaes consulte Como conectar-se a um banco de dados:. Crie um novo procedimento armazenado usando o cdigo da primeira seo exemplo abaixo, e denomine-o HelloWorld. Para obter mais informaes, consulte Como Develop com o tipo do Project Server SQL:. Defina pontos de interrupo em HelloWorld, e entre no procedimento armazenado. Para obter mais informaes, consulte Como etapa em um objeto usando Server Explorer:. O ponteiro de instruo, designado por uma seta amarela, ser exibido na da linha SET @mynvarchar = @@VERSION, a primeira linha executvel de cdigo no procedimento armazenado. Experimente diferentes recursos de depurao. 1. Torne a janela Locals visvel. Para fazer isso, no menu Debug, clique em Windows e, em seguida, clique em Locals. Observe que parmetros e variveis locais so exibidos na janela Locals com seus valores correspondentes. Voc pode editar os valores das variveis na janela Locals medida que o procedimento armazenado executado. Para obter mais informaes, consulte Como: usar janelas variveis do depurador. Observao O servidor pode no refletir as alteraes em valores de variveis nas janelas do depurador. Para obter mais informaes, consulte Limitaes da Depurao SQL. 2. Pressione F10 para passar uma linha no procedimento armazenado. Observe que o valor da varivel @mynvarchar foi alterado na janela Locals e seu valor agora exibido em vermelho, indicando que foi alterado.

2.

3.

4.

Visual C# Consolidado

594

3.

Torne a janela Watch visvel. Para fazer isso, no menu Debug, clique em Windows, e escolha Watch. Para obter mais informaes, consulte Como: usar janelas variveis do depurador. No editor de texto, clique duas vezes na varivel @mynvarchar para selecion-la. Arraste @mynvarchar para qualquer local na janela Watch. A varivel ento adicionada lista de variveis observadas. Observao Voc pode editar os valores das variveis na janela Watch tambm. No editor de texto, clique com o boto direito do mouse na linha Return (0), e no menu de atalho, clique em Insert Breakpoint. No menu Debug, clique em Continue.

4.

5. 6. 5.

Escolha Continue novamente para concluir a depurao do procedimento armazenado. Observao Voc pode entrar em qualquer um dos procedimentos armazenados no banco de dados AdventureWorks que so exibidos sob o n Stored Procedures associado ao banco de dados.

Exemplo Este o cdigo para o procedimento armazenado.


CREATE PROCEDURE HelloWorld AS DECLARE @mynvarchar NVARCHAR(50), @myfloat FLOAT SET @mynvarchar = @@VERSION SET @mynvarchar = 'Hello, world!' SET @myfloat = 1.6180 PRINT @mynvarchar RETURN (0)

Visual C# Consolidado

595

Segurana (Como fazer em C#)


Esta pgina referencia a ajuda sobre tarefas amplamente executadas de segurana e implantao. Para ver outras categorias de tarefas populares abordadas na ajuda, consulte Como fazer em C#.

Segurana no Visual Studio


Consideraes de segurana devem ser includas em todos os aspectos do seu desenvolvimento de aplicativos, desde o design at a implantao. Para ajud-lo efetivamente a desenvolver aplicativos seguros, voc deve ter uma compreenso fundamental dos conceitos de segurana e recursos de segurana das plataformas para as quais voc ir desenvolver. Voc tambm deve ter uma compreenso de tcnicas de codificao segura. Noes bsicas sobre segurana Segurana em .NET Framework Descreve a segurana de acesso ao cdigo do .NET Framework, segurana baseada em funo, poltica de segurana, e ferramentas de segurana. Defenda seu cdigo com As Dez Principais Dicas De Segurana Que Todo Desenvolvedor Deve Conhecer (http://msdn.microsoft.com/library/default.asp?url=/library/enus/dnsecure/HTML/appsec.asp) Descreve os problemas realmente importantes que voc deve tomar cuidado para no comprometer seus dados ou seu sistema. Codificao para segurana A maioria dos erros de codificao que resultam em vulnerabilidades de segurana ocorrem porque os desenvolvedores fazem suposies invlidas ao trabalhar com a entrada do usurio ou porque eles no entendem completamente a plataforma para a qual eles esto desenvolvendo.

Noes Bsicas sobre Segurana de Accesso a Cdigo


Todos os aplicativos que aponta o Common Language Runtime deve interagir com sistema de segurana o Runtime na. Quando um aplicativo executado, ele avaliado e fornecido um conjunto de permisses em tempo de execuo automaticamente. Dependendo das permisses que o aplicativo recebe, ele executado corretamente ou gera uma exceo de segurana. As configuraes de segurana local em um computador especfico basicamente decidir cdigo recebe as permisses. Como essas configuraes podem alterar de computador para computador, voc nunca poder ter certeza que seu cdigo receber permisses suficientes para executar. Isso serve de contraste para o mundo da desenvolvimento no gerenciado no qual voc no tem se preocupar com a permisso para executar seu cdigo na. Cada desenvolvedor deve ser familiarizado com os seguintes conceitos de segurana Acesso cdigo para gravar eficaz aplicativos selecionando o Common Language Runtime:

Visual C# Consolidado

596

Escrevendo cdigo seguro Tipo-: Para ativar cdigo para se beneficiar de Segurana do Acesso ao Cdigo voc deve usar um compilador que gera cdigo verifiably Safe tipo-. Para obter mais informaes, consulte Gravar Verifiably cdigo Safe Type-. Sintaxe declarativas e imperativas: interao com o sistema de segurana Runtime feita usando segurana declarativas e imperativas chamadas. Chamadas declarativa so efetuada usando atributos; chamadas imprescindvel so executadas usando novas instncias de classes de seu cdigo. Algumas chamadas pode ser executada somente imperatively, enquanto outras pessoas podem ser executadas somente declarativamente. Algumas chamadas pode ser executada de qualquer maneira. Para obter mais informaes, consulte Sintaxe de segurana. Solicitar Permisses de seu cdigo: solicitaes so aplicadas ao escopo conjunto, onde seu cdigo informa o Runtime sobre permisses que ele precisa ser executado ou no deseja especificamente. Solicitaes de segurana so avaliados por tempo de execuo quando seu cdigo carregado na memria. Solicitaes no pode influenciar tempo de execuo para fornecer seu cdigo mais permisses que o Runtime seria tenha dado seu cdigo tinha a solicitao no foi feita. No entanto, as solicitaes so o que seu cdigo usa para informar o Runtime sobre as permisses requer para serem executados. Para obter mais informaes, consulte Solicitando permisses. Usando bibliotecas classe seguro: suas bibliotecas classe usar segurana de acesso ao cdigo para especificar as permisses que eles precisam para ser acessado. Voc deve estar ciente das permisses necessrias para acessar qualquer biblioteca que usa seu cdigo e fazem solicitaes apropriadas em seu cdigo. Para obter mais informaes, consulte Usando bibliotecas classe segura.

Prticas recomendadas de poltica de segurana


O.NET Framework fornece um modelo de segurana Acesso cdigo que permite aos administradores para modificar a diretiva de segurana para atender s suas necessidades individuais. Enquanto segurana de acesso ao cdigo geralmente aumenta a confiabilidade e segurana de aplicativos, incorretamente administrar a diretiva de segurana do acesso ao cdigo potencialmente criar pontos fracos segurana. Esta seo explica conceitos de administrao bsicas e descreve algumas das prticas recomendadas para usar ao administrar a diretiva de segurana do acesso ao cdigo.

Viso geral da administrao de poltica de segurana


O sistema de segurana do .NET Framework regido por um conjunto de regras chamadas Diretiva de segurana configurveis. Esta diretiva permite que o usurio final ou Administrador para ajustar as configuraes que determinam qual cdigo recursos tem permisso para acessar e basicamente decidir qual cdigo tem permisso para executar o tempo todo. Por exemplo, suponha que voc for um administrador em uma configurao da empresa e voc no confia o software que se origina de uma empresa especfica. Talvez essa empresa produz software que funcionrios localizar divertido, mas causas aumenta o trfego de rede ou causar estaes de trabalho se torne instvel. Voc pode definir uma diretiva de segurana de nvel empresarial que restringe o acesso que software com uma nome forte criptografia especfico (um identificador exclusivo) de um programa tem aos recursos do computador. Voc tambm pode definir uma diretiva que impede que software deste editor na seja executado em todos os. Este tpico fornece uma viso geral sobre administrao de diretiva de segurana. Para obter mais informaes, consulte Gerenciamento de diretivas de segurana. Prova, grupos de cdigo e conjuntos de permisses

Visual C# Consolidado

597

Cdigo que aponta o Common Language Runtime implantado em unidades chamadas conjuntos de mdulos (assemblies). Ao tempo de carregamento, tempo de execuo examina cada conjunto para provas, que identificar informaes sobre conjunto (tais como a assinatura digital do autor o cdigo e o local que originou o cdigo). Com base nas provas, Gerenciador de segurana Runtime idioma comum mapeia montagem para um grupo de cdigos com base na diretiva de segurana. Grupos de cdigos so definidos para testar a formulrios especficos de evidncias e fazer conjuntos permisso associado a eles. Conjuntos de mdulos (assemblies) que pertencem a um grupo cdigo recebero as permisses definidas pelos conjuntos de permisses associado. Para obter mais informaes sobre provas, grupos de cdigos, e conjuntos de permisses, consulte Modelo de diretiva de segurana. Permisses As permisses so simplesmente objetos que representam o direito de acessar um recurso protegido. Permisses so configurveis e um objeto de permisso nico pode assumir vrios formulrios. Por exemplo, a FileIOPermission representa o direito de acesso, criar, ler, gravar ou modificar arquivos no disco rgido local. Para ser significativo, uma permisso deve conter informaes especficas sobre o tipo de acesso ele representa. Voc pode configurar para representar o direito para ler um arquivo especfico, ler e gravar em um arquivo especfico, ou ler os arquivos em uma pasta inteira. um FileIOPermission Os direitos que representam uma permisso e conjuntos de mdulos (assemblies) que recebe so totalmente configurveis pelo administrador do computador. Enquanto os aplicativos podem criar e configurar objetos permisso como qualquer outro objeto, somente a diretiva de segurana pode conceder permisso para um aplicativo. Basicamente, os administradores controlar a conceder permisso. Para obter uma lista de permisses comuns, consulte Permisses de acesso cdigo. Nveis de Diretiva de segurana H quatro nveis de diretiva de segurana definidas pelo modelo de segurana, que correspondem administrao diferentes e cenrios de hospedagem. A tabela a seguir descreve cada nvel. O nvel de diretiva corporativa o nvel mais alto e o nvel de domnio do aplicativo o menor. Nvel de diretiva Diretiva corporativa Diretiva da mquina Descrio Definida pelos administradores da empresa que definir a diretiva para domnios da empresa. Definida pelos administradores mquina que definir a diretiva para um computador.

Diretiva de usurio Definido por usurios que definir a diretiva para uma conta de logon nico. Diretiva de domnio de aplicativo Definido pelo host do tempo de execuo (qualquer aplicativo que hospeda o Common Language Runtime) para definir diretiva tempo carregar-. Este nvel no pode ser administrado.

Cada nvel de diretiva consiste de uma hierarquia de grupos de cdigo. Os administradores de cada nvel de diretiva pode criar seus prprios grupos de cdigos e conjuntos de permisses associado. Ao tempo de carregamento, o sistema de segurana Acesso cdigo examina todos os nveis de diretiva e a conceder permisso resultante a interseo de todas as permisses permitido em cada nvel. Os administradores de um nvel de diretiva inferior no pode loosen uma deciso diretiva feitas em um nvel superior, mas eles pode reforar Diretiva, Much como desejam. A diretiva de segurana padro reside em nvel de diretiva Mquina. As configuraes de segurana padro so:

Nveis de usurio e empresa so definidas como Irrestrito.

Visual C# Consolidado

598

O nvel de mquina contm as configuraes de diretiva especfico e restries. As configuraes definidas por todos os nveis trs constituem configuraes padro.

Observe que usurio irrestrita e nveis empresa no resultem em Irrestrito sendo concedidas a um conjunto. Nvel do computador define vrias restries, e todos os nveis trs so considerados como um todo, como a conceder permisso resultante permisses no irrestritas. Para obter mais informaes, consulte Modelo de diretiva de segurana. Mapeando grupos cdigo para conjuntos de permisses Gerenciar Diretiva, mapeando grupos de cdigos para conjuntos de permisses no nvel de diretiva ou nveis que voc administrar. Grupos de cdigos contm uma condio de membro, definir uma permisso associao, e atributos grupo cdigo. A evidncia que apresenta um conjunto para o Runtime comparado com a condio de membro que voc especificar para um grupo de cdigos. Se um conjunto fornece prova que corresponda a condio de membro, ele ser permitido entrada para o grupo de cdigo. Os administradores identificar, categorizar conjuntos de mdulos (assemblies) em grupos de cdigos, especificando condies de membro, e define a esses grupos cdigo permisso atribuio. Opcionalmente, atributos grupo cdigo pode ser usado para especificar que nenhum nvel de diretiva abaixo do nvel atual deve ser considerada ou que nenhum cdigo grupo exceto a verso atual deve ser considerada ao atribuir permisso. Os seguintes tipos de prova interna podem ser usados como condies de membro:

Diretrio de instalao do aplicativo O hash criptogrfico do conjunto A assinatura digital do editor conjunto O site da qual provm montagem A criptografia nome forte da montagem O URL da qual provm montagem A zona da qual provm montagem

Voc pode reduzir ou aumentar as permisses a conjuntos de mdulos (assemblies) com base em qualquer combinao dessas condies de membro. Porque condies de membro personalizada pode ser criado, a lista anterior no representa cada possibilidade. Para obter mais informaes, consulte Prova.

Administrao de diretiva de segurana geral


Esta seo fornece um conjunto de diretrizes que voc pode usar para ajudar Administrar diretiva para seu computador ou empresa. Essas informaes para ajud-lo a decidir quando se executar tarefas administrativas e o que foi feito conseqncias ter essas decises. Para obter informaes sobre como usar ferramentas para executar tarefas especficas Consulte Configurao de diretiva de segurana.

Determinando quando para modificar a diretiva de segurana


No necessariamente fazer precisar modificar as configuraes de segurana padro. Para muitas situaes, as configuraes de segurana padro oferecem um nvel adequado de proteo. Cdigo que no originada do computador local (e, portanto, provvel que ser menos

Visual C# Consolidado

599

confivel) recebe restrita acesso a recursos protegidos sob a diretiva de segurana padro. Cdigo proveniente de Internet e Intranet Local restrito de das seguintes maneiras:

Cdigo que se origina da Internet ou intranet local no tem permisso para ler ou gravar em uma unidade local. Cdigo que se origina da Internet ou intranet local no tem permisso para ler ou gravar no Registro do sistema. Cdigo que se origina da Internet ou Intranet Local pode se comunicar com o site da Web do origem. Cdigo que se origina de intranet local possui acesso irrestrito a elementos UI, mas somente cdigo originadas na Internet tem acesso sub janelas e a rea de transferncia.

A diretiva de segurana padro adequado para situaes maioria dos, mas no todos,. Voc deve considerar modificar Diretiva de segurana quando:

Voc deseja confiar um aplicativo que requer mais permisso que a zona da qual ele provm recebe por padro. Voc usar aplicativos de uma editora especfica que voc completamente confiar e deseja esses aplicativos para ter acesso a recursos especficos, no importa onde eles so executados. Voc deseja aplicativos no computador local para ter menos de confiana total. Por exemplo, voc for um administrador de empresa e voc desejar impedir que os usurios de instalar e executar aplicativos no confiveis.

Se voc decidir editar diretiva, voc deve garantir voc que no faa diminuir permisso para aplicativos para o ponto que eles no funcionaro corretamente.

Ferramentas de administrao
A maneira recomendada de configurar a diretiva de segurana para usar o Ferramenta .NET Framework Configuration (Mscorcfg.msc). Essa ferramenta fornece assistentes para ajud-lo ajustar o usurio, computador, e as configuraes de segurana corporativa. A tabela a seguir descreve esses assistentes. Assistente Confiar um aplicativo Ajustar configuraes de segurana Criar um pacote de implantao Descrio Use este assistente para identificar um aplicativo pelas informaes Editor ou nome forte e Aumentar nvel do aplicativo de confiana. Use este assistente para aumentar ou diminuir permisses a conjuntos de mdulos (assemblies) proveniente de uma das seguintes zonas: Meu computador, intranet local, Internet, sites confiveis e sites no confiveis. Use este assistente para criar um pacote Windows Installer para implantar a diretiva de segurana em uma empresa.

Para obter mais informaes sobre usando os assistentes, consulte o Ferramenta .NET Framework Configuration (Mscorcfg.msc). Se os assistentes no fornecem a funcionalidade necessrios para administrar a diretiva de segurana, voc poder editar os conjuntos de permisses e cdigo grupos diretamente usando a qualquer toolor .NET Framework Configuration o Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe). Caspol.exe uma ferramenta de linha de comando fornecida principalmente para scripts administrao de segurana. Para obter informaes sobre como

Visual C# Consolidado

600

realizar tarefas especficas usando estas ferramentas consulte Configurao de diretiva de segurana.

Aumentar permisses
Um aplicativo gerenciado que requer mais permisso para executar que permite que a diretiva atual dependendo da como ele criada, ser Acione uma exceo, deixar de executar, ou funo no corretamente. Voc pode usar para exibir o permisses mnimas solicitada, permisses opcional solicitada, e permisses recusada pelo conjunto para comparar as permisses que montagem solicitaes para as permisses que ele realmente receber. o Ferramenta exibir permisses (Permview.exe) Observe que esta ferramenta s mostra permisses que tiver sido solicitada pelo aplicativo usando a sintaxe declarativa explicitamente. Com essas informaes, poder aumentar as permisses que conjunto recebe por criando um novo grupo de cdigos personalizados e associ-lo a um novo conjunto de permisso personalizada que contm todas as permisses que o aplicativo precisa ser executado corretamente. No entanto, voc deve aumentar as permisses somente se voc confiar fonte do aplicativo e somente voc deve confiar de acordo com prova que suitably confivel. Administradores (na maioria dos casos, ser ter vrios grupos de cdigos personalizados que podem ser usados para categorizar vrios aplicativos que requerem permisses semelhantes.) Suponha que voc tenha um aplicativo que freqentemente acessado por vrios usurios em um compartilhamento de rede. Em um contexto no gerenciado, essa situao no representar um problema de execuo geralmente no. No entanto, em um contexto gerenciado, este aplicativo pode ser concedido um limitado conjunto de permisses porque ele proveniente de zona Intranet local. Por exemplo, o aplicativo no pode ser permitido completo permisses de impresso, que limita utilidade deste aplicativo. Em vez de loosening as configuraes de zona inteiro da intranet local, voc deve fazer o seguinte: 1. Uso para o modo cujas permisses voc deseja aumentar as permisses mnimas solicitada pelo conjunto. o Ferramenta Exibir Permisso (Permview.exe) Essas so as permisses em log de forma mnima precisa para executar o aplicativo. Identificar uma caracterstica exclusivo da montagem. Essa caracterstica pde incluir nome forte na montagem, sua chave pblica, o hash, ou um atributo personalizado exclusivo. Se o aplicativo proveniente de um servidor confivel, o local tambm pode ser usado para identificar o aplicativo. Lembre-se, voc confia todo cdigo que tenha essa caracterstica. Criar um novo grupo de cdigos que requer o identificador exclusivo do membro. Use a ferramenta (Mscorcfg.msc).NET Framework Configuration ou Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe). Para criar o grupo de cdigos Criar um novo conjunto de permisses que inclui todas as permisses montagem em log de forma mnima precisa para executar usando a ferramenta .NET Framework Configuration ou a ferramenta Diretiva de Segurana para Acesso ao cdigo. Associar a nova permisso definir com o novo grupo cdigo, utilizando a ferramenta .NET Framework Configuration ou a ferramenta Diretiva de Segurana para Acesso ao cdigo.

2.

3.

4.

5.

O aplicativo aps a concluso dessas etapas, ser executado e receber permisses suficientes para funcionar. Outros, menos aplicativos confiveis no recebero as permisses adicionais; isso ajuda a proteger seu sistema contra cdigo mal-intencionado. Para obter informaes sobre como realizar tarefas especficas usando as ferramentas de segurana, consulte Configurao de diretiva de segurana.

Visual C# Consolidado

601

Administrao com atributos Grupo de cdigos


Suponha que voc for um administrador empresarial Quem responsvel para administrar a diretiva de segurana para um nmero de estaes de trabalho. Para o domnio corporativa tpica, o administrador da rede tenha privilgios administrativos em cada servidor e cada cliente. No entanto, no difcil para os usurios possam ter privilgios administrativos em uma estao de trabalho nico individuais. Como um resultado, o administrador da rede tenha privilgios administrativos no nvel de diretiva da empresa e o administrador da estao de trabalho tem privilgios administrativos no nvel de diretiva da mquina. Nesta situao, o administrador da rede parece ter mais controle sobre diretiva como diretiva corporativa avaliada primeiro e diretiva de mquina no tem permisso para loosen decises de segurana feitas pelo administrador de nvel empresarial. No entanto, o administrador de nvel mquina ainda pode reforar segurana, potencialmente quebrar aplicativos confiveis que faria caso contrrio ter sido podem ser executadas. Por esse motivo, maior nveis de diretiva pode optar por excluir decises de diretiva de nvel inferior de ser avaliado. Para fazer isso, aplicando ou Exclusive atributo a um grupo de cdigo, usando um das ferramentas de diretiva de segurana. o LevelFinal Atributo de Nvel final Quando aplicado a um grupo de cdigos, o LevelFinal atributo exclui qualquer nvel de diretiva de ser avaliado abaixo do nvel atual. Por exemplo, se voc aplicar o LevelFinal atributo ao grupo de cdigos de intranet local no nvel da empresa, qualquer grupo de cdigos no nvel do computador no sero avaliados mesmo se um administrador nvel mquina tiver feito alteraes. Aplicar o LevelFinal atributo garante que um conjunto associado a um grupo de cdigos marcados com este atributo nunca recebero as permisses menos devido a decises tomadas por um administrador de nvel inferior diretiva. Para obter informaes sobre configurao do LevelFinal atributo em um padro ou grupo de cdigos personalizado, consulte o Ferramenta .NET Framework Configuration (Mscorcfg.msc) ou o Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe). Atributo exclusivo Quando aplicado a um grupo de cdigos, o Exclusive atributo impede outros grupos de cdigo no mesmo nvel de diretiva de sendo considerados quando o Runtime calcula permisses para conjuntos de mdulos (assemblies) que esto no grupo cdigo exclusivo. Nveis de diretiva acima e abaixo do nvel atual ainda so avaliados, embora. Este atributo permite que um grupo cdigo especfico para tomar a deciso nico para o nvel de diretiva atual sobre quais permisses so concedidas aos conjuntos que correspondam desse grupo. Isso til quando voc deseja conceder um conjunto especfico de permisses aos conjuntos especficos, sem permitir que permisses de outras correspondncias grupo cdigo no mesmo nvel de diretiva. Observe que um conjunto no tem permisso para executar se ele pertencer a mais de um grupo cdigo marcado como exclusivo. Portanto, use o Exclusive atributo com cautela ao administrar Diretiva de segurana personalizado. Para obter informaes sobre como definir o Exclusive atributo em um interna em ou personalizados, consulte o Ferramenta .NET Framework Configuration (Mscorcfg.msc) ou o Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe) grupo de cdigos.

COMO: Adicionar Permisses Personalizadas Poltica de Segurana


Uma permisso personalizada um que fornecido com um aplicativo ou biblioteca, em vez de sendo fornecido pelo .NET Framework. Para ser significativo, uma permisso personalizada deve ser adicionado com a diretiva de segurana no computador (ou computadores, no caso de uma rede) onde o aplicativo usando a permisso executa.

Visual C# Consolidado

602

Voc deve descrever as especificaes da permisso voc deseja adicionar ao sistema de segurana do .NET Framework quando voc adiciona ele sua diretiva personalizada. Uma permisso nico pode assumir vrios formulrios que representam o direito de acessar recursos especficos. Por exemplo, a permisso personalizada pode ter a capacidade de fornecer acesso restrito ou irrestrito a um recurso. Como um administrador, voc tem a capacidade de decidir qual tipo a permisso de acesso (restrito ou Irrestrito) representar. Portanto, voc deve descrever a configurao que voc deseja a permisso para tem que o sistema de segurana do .NET Framework. Isso, criando uma representao XML da configurao voc deseja a permisso personalizada para ter e importar o XML para a diretiva de segurana. (O sistema de segurana do .NET Framework usa XML para serializar permisses.) O editor da permisso ou deve fornecer uma ferramenta para criar a representao XML ou fornecer instrues para criar o arquivo XML. Geralmente, as representaes XML das permisses que compem a diretiva de segurana so armazenadas em arquivos de configurao de diretiva. Para adicionar uma permisso personalizada diretiva de segurana 1. 2. 3. Adicionar Conjunto implementar a permisso personalizada para o cache de conjunto de mdulos global e para a lista de conjuntos de mdulos (assemblies) totalmente confivel. Criar um arquivo XML que representa o tipo de permisso voc deseja criar e atribuir aos conjuntos. Adicionar a representao XML da permisso para a diretiva de segurana, usando o Ferramenta .NET Framework Configuration (Mscorcfg.msc) ou o Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe).

Dicas de administrao
As prticas descritas na seo so aplicveis para cada cenrio Administrao. Voc deve conserv-lo em mente ao configurar e administrar a diretiva de segurana. Estratgias de longo prazo para administrao de diretiva Definir categorias de confiana que voc pode usar para administrar diretiva aplicvel. Definir vrios grupos de cdigos para discriminate cdigo que provvel que ser executada em seu ambiente e definir as permisses que devem receber cada grupo. Craft diretiva acordo e implantar. Voc deve fazer estabelecer sua diretiva geral quando voc configura seu ambiente, em vez de fone fone-por-inicialmente como necessrios para executar vrios aplicativos. Nvel de administrao O nvel de diretiva que voc escolher para administrar determinado pelo escopo que voc deseja que afetam. Sempre administrar a diretiva de segurana no nvel de diretiva menor que afeta os usurios mnimo e ainda atender seu cenrio Administrao. Por exemplo:

Se voc estiver administrando um diretiva que afeta cada estao de trabalho e usurio na sua empresa, verifique as adies Diretiva no nvel da empresa. Nunca fazer uma adio ao nvel empresa de um computador que no foi feito para afetar todos os computadores na sua empresa. Se voc estiver administrando um diretiva que afeta todos os usurios em um computador especfico, verifique as adies Diretiva no nvel da mquina. Se voc estiver administrando uma diretiva para um determinado usurio ou grupo de usurios, verifique as adies Diretiva no nvel do usurio.

Sistema de arquivos

Visual C# Consolidado

603

Usar o sistema de arquivos NTFS sempre que possvel para armazenar os arquivos de diretiva de segurana. NTFS ajuda a oferecer proteo de arquivos com base em Usurios e grupos, e somente permite que os usurios com privilgios administrativos para um nvel especfico para editar arquivos de configurao de segurana. Sistemas que no usam o sistema de arquivos NTFS criar pontos fracos de segurana, permitindo que os usurios no autorizados para modificar a diretiva de segurana.

Administrao de diretiva corporativa


O nvel de diretiva corporativa contm diretiva para cada computador e usurio na rede e pode ser administrado por administradores de domnio ou computador. Consulte a seo sobre Implantao de diretiva de segurana para obter informaes sobre estratgias de implantao. Porque o Runtime avalia Diretiva corporativa primeiro, voc pode aplicar o LevelFinal atributo a um grupo de cdigo nesse nvel para excluir os nveis inferiores de fazer alteraes de diretiva. Sem o LevelFinal atributo, menor nveis de diretiva pode remover permisses do conjunto concesso final, possivelmente causando instabilidade no aplicativo. No entanto, mesmo se voc no se aplicam o LevelFinal atributo, nveis inferiores sero pde para aumentar a concesso final definido porque todos os nveis de diretiva so intersected durante a resoluo de diretiva. Voc pode considerar Administrar diretiva nesse nvel quando cada pessoa em sua empresa usa um aplicativo e voc desejar para certificar-se que ele sempre receber permisso suficiente para executar.

Administrao de diretiva da mquina


O nvel de diretiva Mquina contm a maioria da diretiva de segurana padro. Todos os administradores de computador e domnio ter acesso ao computador os arquivos de configurao. Os administradores mquina pode definir a diretiva que exclui modificao do nvel do usurio, mas no do nvel empresa. Voc pode considerar Administrar diretiva de segurana neste nvel nas situaes a seguir:

Voc no estejam em uma rede ou estiver em uma rede sem um controlador de domnio. O computador que voc est administrando serve uma funo exclusivo. Por exemplo, se voc estiver administrando um computador pblico que usada para gerais acesso Internet por vrias pessoas em uma configurao semi-Public, convm para que uma diretiva Mquina exclusivo, porque o computador funciona uma funo exclusivo. Alm disso, convm para produzir uma diretiva Computador especfico que considera s necessidades de segurana de computadores especializados, como os servidores da sua empresa.

Administrao de diretiva de usurio


Diretiva de usurio o nvel mais baixo diretiva administrable. Cada usurio tem um arquivo de configurao de diretiva de usurio individuais. Quaisquer alteraes feitas neste nvel de diretiva sero Aplicvel somente ao usurio conectado-no atual. O nvel de diretiva de usurio restrito no qual ele pode especificar. Porque este nvel configurvel pelo usurio com logon feito atual, administradores de diretivas do nvel empresa deve estar ciente que o usurio potencialmente pode alterar qualquer alterao feita no nvel de diretiva do usurio Diretiva. O nvel de diretiva de usurio no capaz de conceder mais permisses a uma montagem que especificado nos nveis de diretiva superior. No entanto, o nvel de diretiva de usurio tem permisso para diminuir permisses, que potencialmente pode causar aplicativos para parar de funcionar corretamente. Se o LevelFinal

Visual C# Consolidado

604

atributo aplicado a um grupo de cdigos no nvel da mquina ou empresa, o nvel do usurio no permitido para reforar decises de diretiva que foram feitas nesses nveis. Administrao de nvel de usurio adequado em algumas situaes para tightening segurana. Por exemplo, um usurio pode decidir para Reforar diretiva de segurana para os conjuntos de mdulos (assemblies) originados a partir da zona Intranet local se no for encontrado um cdigo no confivel. Voc pode considere Administrar diretiva nesse nvel quando voc tiver um usurio em uma rede corporativa e achar que as configuraes de segurana so no apertada suficiente.

COMO: Usar Proteo de Dados


O.NET Framework fornece acesso proteo de dados (DPAPI), que permite que voc para criptografar dados usando informaes da conta de usurio atual ou computador API. Quando voc usa a DPAPI, voc aliviar o problema de explicitamente gerar e armazenar uma chave criptogrfica difcil. Use a ProtectedMemory classe para criptografar uma matriz de bytes de memria. Essa funcionalidade est disponvel no Microsoft Windows XP e sistemas operacionais posteriores. Voc pode especificar que a memria criptografados por atual processo pode ser descriptografados pelo processo atual apenas, por todos os processos, ou do mesmo contexto de usurio. Consulte a MemoryProtectionScope enumerao para obter uma descrio detalhada das ProtectedMemory Opes. Use a ProtectedData classe para criptografar uma cpia de uma matriz de bytes. Essa funcionalidade est disponvel no Microsoft Windows 2000 e sistemas operacionais posteriores. Voc pode especificar que dados criptografados pela conta de usurio atual pode ser descriptografada somente pela mesma conta de usurio, ou voc pode especificar que dados criptografados pela conta de usurio atual pode ser descriptografados por qualquer conta no computador. Consulte a DataProtectionScope enumerao para obter uma descrio detalhada das ProtectedData Opes. Para criptografar dados na memria usando proteo de dados

Chame o mtodo esttico Protect Ao passar uma matriz de bytes para criptografar, a entropia, e o escopo proteo memria. Chame o mtodo esttico Unprotect Ao passar uma matriz de bytes para descriptografar e o escopo Proteo de memria. 1. 2. 3. 1. 2. Criar entropia aleatrio. Chame o mtodo esttico Protect Ao passar uma matriz de bytes para criptografar, a entropia, e o escopo proteo dados. Gravar os dados criptografados para um arquivo ou fluxo. Ler os dados criptografados de um arquivo ou fluxo. Chame o mtodo esttico Unprotect Ao passar uma matriz de bytes para descriptografar e o escopo proteo de dados.

Para descriptografar dados na memria usando proteo de dados

Para criptografar dados em um arquivo ou transmitir usando proteo de dados

Para descriptografar dados de um arquivo ou transmitir usando proteo de dados

Exemplo O exemplo de cdigo a seguir demonstra duas formas de criptografia e descriptografia. Primeiro, o exemplo de cdigo criptografa e descriptografa depois os uma matriz de bytes de memria. Em seguida, o exemplo de cdigo criptografa uma cpia de uma matriz de bytes, salva ele em um

Visual C# Consolidado

605

arquivo, carrega os dados de volta do arquivo, e ento descriptografa os dados. O exemplo exibe os dados originais, os dados criptografados, e os dados descriptografados. C#
using System; using System.IO; using System.Text; using System.Security.Cryptography; public class MemoryProtectionSample { public static void Main() { Run(); } public static void Run() { try { /////////////////////////////// // // Memory Encryption - ProtectedMemory // /////////////////////////////// // Create the original data to be encrypted (The data length should be a multiple of 16). byte[] toEncrypt = UnicodeEncoding.ASCII.GetBytes("ThisIsSomeData16"); Console.WriteLine("Original data: " + UnicodeEncoding.ASCII.GetString(toEncrypt)); Console.WriteLine("Encrypting..."); // Encrypt the data in memory. EncryptInMemoryData(toEncrypt, MemoryProtectionScope.SameLogon); Console.WriteLine("Encrypted data: " + UnicodeEncoding.ASCII.GetString(toEncrypt)); Console.WriteLine("Decrypting..."); // Decrypt the data in memory. DecryptInMemoryData(toEncrypt, MemoryProtectionScope.SameLogon); Console.WriteLine("Decrypted data: " + UnicodeEncoding.ASCII.GetString(toEncrypt)); /////////////////////////////// // // Data Encryption - ProtectedData // /////////////////////////////// // Create the original data to be encrypted toEncrypt = UnicodeEncoding.ASCII.GetBytes("This is some data of any length."); // Create a file. FileStream fStream = new FileStream("Data.dat", FileMode.OpenOrCreate); // Create some random entropy. byte[] entropy = CreateRandomEntropy(); Console.WriteLine(); Console.WriteLine("Original data: " + UnicodeEncoding.ASCII.GetString(toEncrypt)); Console.WriteLine("Encrypting and writing to disk..."); // Encrypt a copy of the data to the stream. int bytesWritten = EncryptDataToStream(toEncrypt, entropy, DataProtectionScope.CurrentUser, fStream); fStream.Close(); Console.WriteLine("Reading data from disk and decrypting..."); // Open the file. fStream = new FileStream("Data.dat", FileMode.Open); // Read from the stream and decrypt the data. byte[] decryptData = DecryptDataFromStream(entropy, DataProtectionScope.CurrentUser, fStream, bytesWritten); fStream.Close(); Console.WriteLine("Decrypted data: " + UnicodeEncoding.ASCII.GetString(decryptData)); } catch (Exception e) { Console.WriteLine("ERROR: " + e.Message); } } public static void EncryptInMemoryData(byte[] Buffer, MemoryProtectionScope Scope ) { if (Buffer.Length <= 0) throw new ArgumentException("Buffer"); if (Buffer == null) throw new ArgumentNullException("Buffer"); // Encrypt the data in memory. The result is stored in the same same array as the original data. ProtectedMemory.Protect(Buffer, Scope); } public static void DecryptInMemoryData(byte[] Buffer, MemoryProtectionScope Scope) { if (Buffer.Length <= 0) throw new ArgumentException("Buffer"); if (Buffer == null) throw new ArgumentNullException("Buffer"); // Decrypt the data in memory. The result is stored in the same same array as the original data. ProtectedMemory.Unprotect(Buffer, Scope); } public static byte[] CreateRandomEntropy() { // Create a byte array to hold the random value. byte[] entropy = new byte[16]; // Create a new instance of the RNGCryptoServiceProvider. // Fill the array with a random value. new RNGCryptoServiceProvider().GetBytes(entropy); // Return the array. return entropy; } public static int EncryptDataToStream(byte[] Buffer, byte[] Entropy, DataProtectionScope Scope, Stream S) { if (Buffer.Length <= 0) throw new ArgumentException("Buffer"); if (Buffer == null) throw new ArgumentNullException("Buffer"); if (Entropy.Length <= 0) throw new ArgumentException("Entropy"); if (Entropy == null) throw new ArgumentNullException("Entropy"); if (S == null) throw new ArgumentNullException("S"); int length = 0; // Encrypt the data in memory. The result is stored in the same same array as the original data. byte[] encrptedData = ProtectedData.Protect(Buffer, Entropy, Scope); // Write the encrypted data to a stream. if (S.CanWrite && encrptedData != null) { S.Write(encrptedData, 0, encrptedData.Length); length = encrptedData.Length; } // Return the length that was written to the stream.

Visual C# Consolidado

606

return length; } public static byte[] DecryptDataFromStream(byte[] Entropy, DataProtectionScope Scope, Stream S, int Length) { if (S == null) throw new ArgumentNullException("S"); if (Length <= 0 ) throw new ArgumentException("Length"); if (Entropy == null) throw new ArgumentNullException("Entropy"); if (Entropy.Length <= 0) throw new ArgumentException("Entropy"); byte[] inBuffer = new byte[Length]; byte[] outBuffer; // Read the encrypted data from a stream. if (S.CanRead) { S.Read(inBuffer, 0, Length); outBuffer = ProtectedData.Unprotect(inBuffer, Entropy, Scope); } else { throw new IOException("Could not read the stream."); } // Return the length that was written to the stream. return outBuffer; } }

Compilando o cdigo

Incluir uma referncia para System.Security.dll. Incluir e System.Text Espao para nome., System.Security.Cryptography a System, System.IO

COMO: Adicionar Permisses Personalizadas Poltica de Segurana


Uma permisso personalizada um que fornecido com um aplicativo ou biblioteca, em vez de sendo fornecido pelo .NET Framework. Para ser significativo, uma permisso personalizada deve ser adicionado com a diretiva de segurana no computador (ou computadores, no caso de uma rede) onde o aplicativo usando a permisso executa. Voc deve descrever as especificaes da permisso voc deseja adicionar ao sistema de segurana do .NET Framework quando voc adiciona ele sua diretiva personalizada. Uma permisso nico pode assumir vrios formulrios que representam o direito de acessar recursos especficos. Por exemplo, a permisso personalizada pode ter a capacidade de fornecer acesso restrito ou irrestrito a um recurso. Como um administrador, voc tem a capacidade de decidir qual tipo a permisso de acesso (restrito ou Irrestrito) representar. Portanto, voc deve descrever a configurao que voc deseja a permisso para tem que o sistema de segurana do .NET Framework. Isso, criando uma representao XML da configurao voc deseja a permisso personalizada para ter e importar o XML para a diretiva de segurana. (O sistema de segurana do .NET Framework usa XML para serializar permisses.) O editor da permisso ou deve fornecer uma ferramenta para criar a representao XML ou fornecer instrues para criar o arquivo XML. Geralmente, as representaes XML das permisses que compem a diretiva de segurana so armazenadas em arquivos de configurao de diretiva. Para adicionar uma permisso personalizada diretiva de segurana 1. 2. 3. Adicionar Conjunto implementar a permisso personalizada para o cache de conjunto de mdulos global e para a lista de conjuntos de mdulos (assemblies) totalmente confivel. Criar um arquivo XML que representa o tipo de permisso voc deseja criar e atribuir aos conjuntos. Adicionar a representao XML da permisso para a diretiva de segurana, usando o Ferramenta .NET Framework Configuration (Mscorcfg.msc) ou o Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe).

COMO: Ativar Configuraes de Segurana do Internet Explorer para a Execuo Gerenciada


Como Microsoft Internet Explorer pode atuar como um host para controles gerenciados e componentes, suas configuraes de segurana afetam execuo gerenciado. O controle gerenciado pode executar no Internet Explorer, a menos controles ActiveX e scripts so ativados no. Para ativar as configuraes de segurana do Internet Explorer 1. No Internet Explorer, no Internet Options menu Tools.

Visual C# Consolidado

607

2. 3.

Clique na Security guia. Voc pode acessar as configuraes para a zona da Internet, zona Intranet local, sites confiveis, e Sites restritos na neste guia. Escolha a zona na qual o controle gerenciado Origem e clique no Custom Level boto. e Run ActiveX controls and plug-insScript ActiveX controls marked safe for scripting deve ser ativada para gerenciado controles ActiveX para executar ambos.

Consulte tambm

COMO: Solicitar Permisses Mnimas Usando o Sinalizador RequestMinimum


O Sinalizador RequestMinimum, voc pode solicitar um conjunto mnimo de permisses para executar seu cdigo requer. Por outro lado, o RequestRefuse Sinalizador permite fazer recusar permisses, especificando quais seu cdigo no deve ser concedido explicitamente. Ao contrrio de usar o RequestMinimum Sinalizador, o aplicativo ser executada se ele no receber todas as permisses que voc solicitar usando o RequestOptional Sinalizador, e um SecurityException ser acionada quando seu aplicativo tenta acessar um recurso protegido se. Se voc usar esse tipo de solicitao, voc deve ativar o seu cdigo para capturar quaisquer excees sero que ser acionada se seu cdigo no concedido a permisso opcional. O exemplo a seguir solicita FileIOPermission usando o RequestMinimum Sinalizador. O exemplo no executar se ele no foi concedido a permisso solicitada. Este exemplo assume que existe em LogNameSpace Uma classe Log hipottico. A Log classe contm o MakeLog mtodo que cria um novo arquivo de log no computador local. Este aplicativo cria uma nova instncia da classe Log e executa o MakeLog mtodo no bloco try. Usando a catch palavra-chave, ela intercepta qualquer SecurityException acionada e exibe uma mensagem. Exemplo C#
//The request is placed at the assembly level. using System.Security.Permissions; [assembly:FileIOPermission(SecurityAction.RequestMinimum, Unrestricted = true)] namespace MyNamespace { using System; using System.Security; //The hypothetical class log is in this namespace. using LogNameSpace; public class MyClass { public MyClass() { } public static void Main(string[] args) { //Put any code that requires optional permissions in the try block. try { Log MyLog = new Log(); MyLog.MakeLog(); Console.WriteLine("The Log has been created."); } //Catch the security exception and inform the user that the //application was not granted FileIOPermission. catch(SecurityException) { Console.WriteLine("This application does not have permission to write to the disk."); } } } }

O cdigo anterior cria o arquivo de log e exibir a seguinte mensagem para o console se ele tiver permisses suficientes:
The Log has been created.

Se o cdigo executado em um compartilhamento e as configuraes de segurana local no permitem esse cdigo para possui FileIOPermission, o cdigo no concedido permisso suficiente e exibir a seguinte mensagem:
This application does not have permission to write to the disk.

COMO: Criar Objetos GenericPrincipal e GenericIdentity Visual C# Consolidado 608

Voc pode usar a GenericIdentity classe em conjunto com a GenericPrincipal classe para criar um esquema de autorizao que existe independentes de um domnio Windows NT ou Windows 2000. Para criar um objeto GenericPrincipal 1. Criar uma nova instncia da classe identidade e inicializar-lo com o nome que voc deseja que ele seja mantenha. O cdigo a seguir cria um novo GenericIdentity objeto e inicializalo com o nome MyUser. C#
GenericIdentity MyIdentity = new GenericIdentity("MyUser");

2.

Criar uma nova instncia da classe GenericPrincipal e inicializar-lo com o objeto criado GenericIdentity anteriormente e uma matriz de seqncias de caracteres que representam as funes que voc deseja associado a este objeto. O exemplo de cdigo a seguir especifica uma matriz de seqncias de caracteres que representam uma funo Administrador e uma funo do usurio. O GenericPrincipal depois est inicializado com o anterior GenericIdentity e a matriz de seqncia. C#
String[] MyStringArray = {"Manager", "Teller"}; GenericPrincipal MyPrincipal = new GenericPrincipal(MyIdentity, MyStringArray);

3.

Use o cdigo a seguir para conectar o objeto para o segmento atual. Isso importante em situaes onde o principal deve ser validado vrias vezes, ele deve ser validado pelo outros cdigo em execuo em seu aplicativo, ou ele deve ser validado por um PrincipalPermission objeto. Ainda poder realizar validao baseada em funo no objeto principal sem anex-los para o segmento. Para obter mais informaes, consulte Substituir um objeto principal. C#
Thread.CurrentPrincipal = MyPrincipal;

Exemplo O exemplo de cdigo a seguir demonstra como criar uma instncia de um GenericPrincipal e um GenericIdentity. Este cdigo exibe os valores um desses objetos para o console. C#
using System; using System.Security.Principal; using System.Threading; public class Class1 { public static int Main(string[] args) { // Create generic identity. GenericIdentity MyIdentity = new GenericIdentity("MyIdentity"); // Create generic principal. String[] MyStringArray = {"Manager", "Teller"}; GenericPrincipal MyPrincipal = new GenericPrincipal(MyIdentity, MyStringArray); // Attach the principal to the current thread. // This is not required unless repeated validation must occur, // other code in your application must validate, or the // PrincipalPermisson object is used. Thread.CurrentPrincipal = MyPrincipal; // Print values to the console. String Name = MyPrincipal.Identity.Name; bool Auth = MyPrincipal.Identity.IsAuthenticated; bool IsInRole = MyPrincipal.IsInRole("Manager"); Console.WriteLine("The Name is: {0}", Name); Console.WriteLine("The IsAuthenticated is: {0}", Auth); Console.WriteLine("Is this a Manager? {0}", IsInRole); return 0; } }

Quando executado, o aplicativo exibir uma sada semelhante seguinte.

Visual C# Consolidado

609

The Name is: MyIdentity The IsAuthenticated is: True Is this a Manager? True

COMO: Criar um Objeto WindowsPrincipal


Existem duas maneiras para criar um WindowsPrincipal objeto, dependendo se cdigo repetidamente deve executar a validao baseada em funo ou deve executar ele somente uma vez. Se cdigo repetidamente deve executar validao baseada em funo, o primeiro dos seguintes procedimentos produz menos sobrecarga. Quando cdigo precisa para fazer validaes baseada em funo apenas uma vez, voc pode criar um WindowsPrincipal objeto, usando o segundo dos procedimentos a seguir. Para criar um objeto WindowsPrincipal para validao repetidos 1. Chame o SetPrincipalPolicy mtodo no objeto AppDomain que retornado pela propriedade esttico System.AppDomain.CurrentDomain, passando o mtodo um PrincipalPolicy valor de enumerao que indica qual a nova diretiva deve ser. Valores com suporte so NoPrincipal, UnauthenticatedPrincipal,. e WindowsPrincipal O cdigo a seguir demonstra esse chamada de mtodo. C#
AppDomain.CurrentDomain.SetPrincipalPolicy( PrincipalPolicy.WindowsPrincipal);

2.

Com a diretiva definida, use a propriedade esttico System.Threading.Thread.CurrentPrincipal para recuperar o objeto que encapsula o usurio Windows atual. Porque o tipo de retorno de propriedade IPrincipal, voc deve convertido o resultado para um WindowsPrincipal tipo. O cdigo a seguir inicializa um novo WindowsPrincipal objeto com o valor do principal associado ao segmento atual. C#
WindowsPrincipal MyPrincipal = (WindowsPrincipal) Thread.CurrentPrincipal;

Para criar um objeto WindowsPrincipal para um nico validao 1. Inicializar um novo WindowsIdentity objeto ao chamar o mtodo esttico System.Security.Principal.WindowsIdentity.GetCurrent, que consultas a conta do Windows atual e coloca informaes sobre essa conta para o objeto identidade recm-criado. O cdigo a seguir cria um novo WindowsIdentity objeto e inicializa-lo para o usurio autenticado atual. C#
WindowsIdentity MyIdentity = WindowsIdentity.GetCurrent();

2.

Criar um novo WindowsPrincipal objeto e passar ele o valor do WindowsIdentity objeto criado na etapa anterior. C#
WindowsPrincipal MyPrincipal = new WindowsPrincipal(MyIdentity);

3.

Quando o objeto principal foi criada, pode usar um dos vrios mtodos para validar-lo. Para obter mais informaes, consulte Verificaes de segurana baseada em funo.

COMO: Executar Verificaes de Segurana Imperativas


Para uma demanda imprescindvel, voc pode chamar o Demand mtodo do objeto PrincipalPermission para determinar se o objeto principal atual representa a identidade especificado, funo, ou ambos. Supondo que um objeto corretamente construdo

Visual C# Consolidado

610

PrincipalPermission chamado MyPrincipalPermission, uma demanda imprescindvel pode ser chamado com o cdigo a seguir. C#
MyPrincipalPermission.Demand();

Exemplo O exemplo de cdigo a seguir usa uma verificao imprescindvel para garantir que um GenericPrincipal Correspondncias o PrincipalPermission objeto. Uma verificao imprescindvel til quando vrios mtodos ou outros conjuntos de mdulos no domnio do aplicativo deve fazer determinations baseada em funo. Enquanto este exemplo extremamente simples, ele ilustra o comportamento associado a uma demanda baseada em funo. C#
using System; using System.Security.Permissions; using System.Security.Principal; using System.Security; using System.Threading; using System.Security.Cryptography; public class MainClass { public static int Main(string[] args) { Console.WriteLine("Enter '1' to use the proper identity or " + "any other character to use the improper identity."); if(Console.ReadLine() == "1") { // Create a generic identity. GenericIdentity MyIdentity = new GenericIdentity("MyUser"); // Create a generic principal. String[] MyString = {"Administrator", "User"}; GenericPrincipal MyPrincipal = new GenericPrincipal(MyIdentity, MyString); Thread.CurrentPrincipal = MyPrincipal; } PrivateInfo(); return 0; } public static void PrivateInfo() { try { // Create a PrincipalPermission object. PrincipalPermission MyPermission = new PrincipalPermission("MyUser", "Administrator"); // Demand this permission. MyPermission.Demand(); // Print secret data. Console.WriteLine( "\n\nYou have access to the private data!"); } catch(SecurityException e) { Console.WriteLine(e.Message); } } }

Se os tipos 1 de usurio, os objetos Principal e identidade necessrios para acessar o PrivateInfo mtodo so criados. Se o usurio digitar qualquer outro caractere, nenhum objeto principal e identidade so criados e uma exceo de segurana acionada quando o PrivateInfo mtodo chamado. Se o segmento atual est associado a um objeto que tem o nome MyUser e a Administrator funo, a seguinte mensagem ser exibida.
You have access to the private data!

Como: Recusar permisses usando o sinalizador RequestRefuse


Se voc estiver preocupado com que seu cdigo pode ser usado para acessar recursos do sistema de forma mal-intencionada, voc pode solicitar que ele nunca ser concedida uma permisso especfica. Por exemplo, um aplicativo que navega dados em um arquivo mas nunca modifica os dados podem recusar quaisquer permisses de gravao arquivo. No caso de um erro ou um ataque malicioso, esse cdigo no pode danificar os dados no qual ele funciona. Permite que RequestRefuse um grande conjunto de permisses para ser solicitado como opcional permisses, garantindo determinadas permisses especficas que no esto na concesso. O exemplo a seguir utiliza RequestRefuse para recusar FileIOPermission do sistema de segurana Runtime idioma comum: Exemplo C#

Visual C# Consolidado

611

//The request is placed at the assembly level. using System.Security.Permissions; [assembly:FileIOPermission(SecurityAction.RequestRefuse ,Unrestricted = true)] namespace MyNameSpace { using System; using System.Security; using System.Security.Permissions; using System.IO; public class MyClass { public MyClass() { } public static int Main(string[] args) { //Creation of the log is attempted in the try block. try { StreamWriter TextStream = new StreamWriter("Log.txt"); TextStream.WriteLine("This Log was created on {0}", DateTime.Now); TextStream.Close(); Console.WriteLine("The Log was created"); } //Catch the Security exception and inform the user that the //application was not granted FileIOPermission. catch(SecurityException) { Console.WriteLine("This application does not have permission to write to the disk."); } return 0; } } }

O exemplo anterior no recebeu permisso para criar o arquivo e gera uma exceo de segurana. A instruo catch intercepta a exceo e o aplicativo exibe a mensagem a seguir para o console:
This application does not have permission to write to the disk.

COMO: Solicitar Permisso para Acessar Cdigo No-Gerenciado


Voc pode facilmente solicitar permisses pela aplicao Atributos que representam as permisses que voc deseja solicitao para o nvel Conjunto de seu cdigo. Voc usar os atributos podem variar, dependendo as permisses que voc est solicitando. Solicitaes so compilado no e avaliadas pelo tempo de execuo quando seu cdigo carregado na memria durante a execuo. do seu aplicativo manifesto de conjunto de mdulos (assembly) o Metadados O exemplo a seguir mostra como solicitar permisso para acessar cdigo no gerenciado. Observe que ele usa um SecurityPermissionAttribute. e especifica dois valores), e um sinalizador que indica qual permisso est sendo solicitado um SecurityAction valor que especifica o tipo de solicitao de permisso est sendo feita, no caso: (RequestMinimum Nesse caso, SecurityPermissionFlag.UnmanagedCode especifica uma solicitao de permisso de cdigo no gerenciada. A assembly: sintaxe informa o compilador que o atributo est sendo aplicada no nvel do conjunto. Exemplo C#
//The request is placed at the assembly level. using System.Security.Permissions; [assembly:SecurityPermissionAttribute(SecurityAction.RequestMinimum, Flags = SecurityPermissionFlag.UnmanagedCode)] namespace MyNamespace { using System; using System.Runtime.InteropServices; public class MyClass { public MyClass() { } public void MyMethod() { //Perform interoperation with unmanaged code here. } } }

Se o cdigo anterior no receber SecurityPermission com o UnmanagedCode Sinalizador, tempo de execuo throws um PolicyException e o cdigo no permitido para executar. No entanto, se o cdigo no receber essa permisso, ento ele tem permisso para executar.

COMO: Solicitar Permisso para um Conjunto de Permisses Nomeadas


Em vez de solicitar permisses individuais,. (), usando RequestMinimum, RequestOptional ou RequestRefuse Voc pode solicitar os os seguintes conjuntos permisso interna, Execution, InternetFullTrust, LocalIntranet e SkipVerification: Nothing No possvel solicitar personalizado chamado conjuntos de permisses ou a Everything permisso interna modificvel

Visual C# Consolidado

612

definir porque eles representam as permisses pode variar. O exemplo a seguir mostra a sintaxe para solicitar permisso para um conjunto de permisses nomeado. Anexa com um Name valor que representa o nome da permisso desejado Definir. um PermissionSetAttribute Exemplo C#
//The attribute is placed at the assembly level. using System.Security.Permissions; [assembly:PermissionSetAttribute(SecurityAction.RequestMinimum, Name = "FullTrust")] namespace MyNamespace { using System; using System.Runtime.InteropServices; public class MyClass { public MyClass() { } public void MyMethod() { //Perform operations that require permissions here. } } }

Como: Solicitar permisses opcionais usando o sinalizador RequestOptional


O SecurityAction.RequestOptional Sinalizador, voc pode solicitar um conjunto de permisses enquanto recusando todas as outras permisses o Runtime caso contrrio pode ter sido disposto a fornecer. Por outro lado, o RequestRefuse Sinalizador permite fazer recusar permisses, especificando quais seu cdigo no deve ser concedido explicitamente. Ao contrrio de usar o RequestMinimum Sinalizador, o aplicativo ser executada se ele no receber todas as permisses que voc solicitar usando o RequestOptiona Sinalizador l, e um SecurityException ser acionada quando seu aplicativo tenta acessar um recurso protegido se. Se voc usar esse tipo de solicitao, voc deve ativar o seu cdigo para capturar quaisquer excees sero que ser acionada se seu cdigo no concedido a permisso opcional. As solicitaes FileIOPermission exemplo a seguir usando o SecurityAction.RequestOptional Sinalizador, indiretamente recusando todas as outras permisses. Este exemplo assume que existe em LogNameSpace Uma classe Log hipottico. A Log classe contm o MakeLog mtodo que cria um novo arquivo de log no computador local. Este aplicativo cria uma nova instncia da classe Log e executa o MakeLog mtodo no bloco try. Usando a catch palavra-chave, ela intercepta qualquer SecurityException acionada e exibe uma mensagem. Exemplo C#
//The request is placed at the assembly level. using System.Security.Permissions; [assembly:FileIOPermission(SecurityAction.RequestOptional, Unrestricted = true)] namespace MyNamespace { using System; using System.Security; //The hypothetical class log is in this namespace. using LogNameSpace; public class MyClass { public MyClass() { } public static void Main(string[] args) { //Put any code that requires optional permissions in the try block. try { Log MyLog = new Log(); MyLog.MakeLog(); Console.WriteLine("The Log has been created."); } //Catch the security exception and inform the user that the //application was not granted FileIOPermission. catch(SecurityException) { Console.WriteLine("This application does not have permission to write to the disk."); } } } }

O cdigo anterior cria o arquivo de log e exibir a seguinte mensagem para o console se ele tiver permisses suficientes:
The Log has been created.

Se o cdigo executado em um compartilhamento e as configuraes de segurana local no permitem esse cdigo para possui FileIOPermission, o cdigo no concedido permisso suficiente e exibir a seguinte mensagem:

Visual C# Consolidado

613

This application does not have permission to write to the disk.

COMO: Armazenar Chaves Asssimtricas em um Continer de Chaves


Assimtrica chaves particulares nunca devem ser armazenadas verbatim ou em texto sem formatao para o computador local. Se voc precisar armazenar uma chave particular, voc deve usar um continer de chave Para obter mais informaes sobre recipientes chave, consulte a seo CryptoAPI na documentao do Platform SDK em http://msdn.microsoft.com. Para criar uma chave assimtrica e salv-lo em um continer de chave 1. 2. Criar uma nova instncia de uma CspParameters classe e passar o nome que voc deseja que chamar o continer de chave para o CspParameters.KeyContainerName campo. Create a new instance of a class that derives from the AsymmetricAlgorithm class (usually RSACryptoServiceProvider or DSACryptoServiceProvider) and pass the previously created CspParameters object to its constructor. Criar uma nova instncia de uma CspParameters classe e passar o nome que voc deseja que chamar o continer de chave para o CspParameters.KeyContainerName campo. Criar uma nova instncia de uma classe que deriva da classe AsymmetricAlgorithm (. ou DSACryptoServiceProvider) e passar o objeto anteriormente criado CspParameters para seu construtor geralmente RSACryptoServiceProvider Definir a PersistKeyInCSP propriedade de classe que deriva de AsymmetricAlgorithm para false (False no Visual Basic.) Chame o Clear mtodo da classe que deriva de AsymmetricAlgorithm. Esse mtodo libera todos os recursos da classe e limpa o continer de chave.

Para excluir uma chave de uma continer de chave 1.

2.

3. 4.

Exemplo O exemplo a seguir demonstra como criar uma chave assimtrica, salv-lo em um continer de chave, recuperar a chave em uma hora posterior e excluir a chave do continer. Observe que que cdigo no mtodo GenKey_SaveInContainer e o GetKeyFromContainer mtodo semelhante. Quando voc especificar um nome continer de chave para um CspParameters objeto e transmiti-las a um AsymmetricAlgorithm objeto com a PersistKeyInCsp propriedade ou PersistKeyInCsp propriedade definida como true, ocorre o seguinte. Se um continer de chave com o nome especificado no existir, ento um criado e a chave persistente. Se um continer de chave com o nome especificado no existir, ento a chave no continer automaticamente carregado no objeto atual AsymmetricAlgorithm. Portanto, o cdigo no mtodo GenKey_SaveInContainer persiste a chave porque ele executado primeiro, enquanto o cdigo no mtodo GetKeyFromContainer carrega a chave porque ele executado segundo. C#
using System; using System.IO; using System.Security.Cryptography; public class StoreKey { public static void Main() { try { // Create a key and save it in a container. GenKey_SaveInContainer("MyKeyContainer"); // Retrieve the key from the container. GetKeyFromContainer("MyKeyContainer"); // Delete the key from the container. DeleteKeyFromContainer("MyKeyContainer"); // Create a key and save it in a container. GenKey_SaveInContainer("MyKeyContainer"); // Delete the key from the container. DeleteKeyFromContainer("MyKeyContainer"); } catch(CryptographicException e) { Console.WriteLine(e.Message); } } public static void GenKey_SaveInContainer(string ContainerName) { // Create the CspParameters object and set the key container // name used to store the RSA key pair.

Visual C# Consolidado

614

CspParameters cp = new CspParameters(); cp.KeyContainerName = ContainerName; // Create a new instance of RSACryptoServiceProvider that accesses // the key container MyKeyContainerName. RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp); // Display the key information to the console. Console.WriteLine("Key added to container: \n {0}", rsa.ToXmlString(true)); } public static void GetKeyFromContainer(string ContainerName) { // Create the CspParameters object and set the key container // name used to store the RSA key pair. CspParameters cp = new CspParameters(); cp.KeyContainerName = ContainerName; // Create a new instance of RSACryptoServiceProvider that accesses // the key container MyKeyContainerName. RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp); // Display the key information to the console. Console.WriteLine("Key retrieved from container : \n {0}", rsa.ToXmlString(true)); } public static void DeleteKeyFromContainer(string ContainerName) { // Create the CspParameters object and set the key container // name used to store the RSA key pair. CspParameters cp = new CspParameters(); cp.KeyContainerName = ContainerName; // Create a new instance of RSACryptoServiceProvider that accesses // the key container. RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp); // Delete the key entry in the container. rsa.PersistKeyInCsp = false; // Call Clear to release resources and delete the key from the container. rsa.Clear(); Console.WriteLine("Key deleted."); } }

Sada
Key added to container: <RSAKeyValue> Key Information A</RSAKeyValue> Key retrieved from container : <RSAKeyValue> Key Information A</RSAKeyValue> Key deleted. Key added to container: <RSAKeyValue> Key Information B</RSAKeyValue> Key deleted.

COMO: Adicionar Assemblies Poltica de Segurana usando Caspol.exe


Um conjunto que implementa uma permisso personalizada, ou implementa qualquer outro objeto de segurana personalizado que no est includo no .NET Framework, deve ser adicionado lista do conjunto totalmente confivel. Voc pode fazer isso usando o Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe). No uma lista separada para cada nvel de diretiva. A lista do conjunto totalmente confivel concede seus membros para o nvel de diretiva relacionadas confiana total. Isso necessrio para manter o Runtime de executar resolues da diretiva circular. Para adicionar um conjunto que implementa um objeto de segurana personalizados para a lista do conjunto totalmente confivel 1. Antes de adicionar um conjunto a diretiva de segurana, voc deve dar-lhe um nome de alta segurana e coloc-lo no cache de conjunto global Para obter mais informaes sobre como trabalhar com conjuntos e o cache de conjunto de mdulos global, consulte Criando e usando conjuntos Named STRONG-. Digite o seguinte comando no prompt de comando: [caspol -enterprise | -user | -machine] addfulltrust AssemblyFile Especificar a opo Nvel diretiva antes da addfulltrust opo.Se voc omitir a opo Nvel de diretiva, listas Caspol.exe a permisso define como o nvel de diretiva padro. Para administradores de computadores, o nvel padro o nvel de diretiva da mquina; para outros, ele o nvel de diretiva de usurio. O comando a seguir adiciona MyCustomPermissionSet.exe lista o nvel de diretiva de usurio na montagem totalmente confivel.
caspol user addfulltrust MyCustomPermissionSet.exe

2.

Visual C# Consolidado

615

3.

Se voc adicionar o conjunto depende do outro conjunto voc tambm deve incluir esse conjunto para a lista. (ou seja, usa tipos implementados em outro conjunto),

Adicionar um conjunto a uma lista do conjunto totalmente confivel no no garante que ele ir receber confiana total pelo sistema da diretiva como um todo, mas apenas que ele ir receber confiana total no nvel de diretiva onde ele estiver listado. Por exemplo, se voc incluir o conjunto MyCustomPermission.exe para o nvel de diretiva de usurio totalmente confivel Lista do conjunto, mas MyCustomPermission.exe recebe direitos de execuo apenas de diretiva da mquina, MyCustomPermission.exe eventualmente seria concedida apenas direitos de execuo. Portanto, importante lembrar que colocar um conjunto na lista do conjunto totalmente confivel somente ajuda evite criar resolues da diretiva circular para o nvel de diretiva onde ele estiver listado. Isso no garante que o conjunto realmente implementar a permisso personalizada recebe uma concesso confiana total.

COMO: Exibir Grupos de Cdigo Utilizando Caspol.exe


Do Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe) voc pode usar para exibir uma lista simples de grupos de cdigo pertencentes a um nvel de diretiva, ou uma lista que inclui os nomes e descries dos grupos de cdigo. Para listar o cdigo grupos para um nvel de diretiva

Digite o seguinte comando no prompt de comando: [caspol -enterprise | -all | -machine | -user] listgroups Especificar a opo Nvel diretiva antes da listgroups opo.Se voc omitir a opo Nvel de diretiva, Caspol.exe listar os grupos de cdigos no nvel de diretiva padro. Para administradores de computadores, o nvel padro o nvel de diretiva da mquina; para outros, ele o nvel de diretiva de usurio. O comando a seguir lista os grupos de cdigos no nvel de diretiva do usurio.
caspol user -listgroups

Para listar os nomes de grupo de cdigo e descries de um nvel de diretiva

Digite o seguinte comando no prompt de comando: [caspol -enterprise | -all | -machine | -user] listdescription Se voc omitir a opo Nvel de diretiva, Caspol.exe listar os grupos de cdigos no nvel padro. O comando a seguir lista os grupos de cdigos e as descries para todos os nveis de diretiva (Empresa, Mquina e Usurio).
caspol all listdescription

COMO: Modificar Permisses em um Conjunto de Permisses


Use a ferramenta .NET Framework Configuration (Mscorcfg.msc) para modificar uma permisso em um conjunto de permisso. Observao O.NET Framework inclui diversos conjuntos de permisso interna. O conjunto de permisses somente internos que pode ser alterado o Everything conjunto de permisso. Para modificar uma permisso em uma permisso definido usando Mscorcfg.msc

Visual C# Consolidado

616

1.

Execute a ferramenta .NET Framework Configuration (Mscorcfg.msc). 1. 2. No Painel de Controle, abra Ferramentas administrativas. Clique duas vezes Microsoft .NET Framework <version> Configuration.

Como alternativa, voc pode executar a ferramenta em um prompt de comando:


o o

Nas verses do .NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva voc deseja alterar a permisso para. Expanda o Permission Sets n. Clique com o boto direito do mouse no conjunto de permisso cuja permisso voc deseja modificar e escolha Change Permissions. Selecione uma permisso a partir da Assigned Permissions lista e clique em Properties. A Permission Settings caixa de dilogo ser exibida, que contm informaes sobre a permisso selecionada. Altere as informaes para essa permisso e clique em OK. Clique em Finish.

2. 3. 4. 5. 6.

7.

COMO: Adicionar Permisses a um Conjunto de Permisses


Use a ferramenta .NET Framework Configuration (Mscorcfg.msc) para adicionar uma permisso a um conjunto de permisso. Observao O.NET Framework inclui diversos conjuntos de permisso interna. O conjunto de permisses somente internos que pode ser alterado o Everything conjunto de permisso. Para adicionar uma permisso a uma permisso definido usando Mscorcfg.msc 1. Execute a ferramenta .NET Framework Configuration (Mscorcfg.msc). 1. 2.
o o

No Painel de Controle, abra Ferramentas administrativas. Clique duas vezes Microsoft .NET Framework <version> Configuration.

Como alternativa, voc pode executar a ferramenta em um prompt de comando: Nas verses do .NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva que contm o conjunto de permisso voc deseja adicionar a permisso para. Expanda o Permission Sets n. Clique com o boto direito do mouse no conjunto de permisso voc deseja adicionar a permisso para e escolha Change Permissions. Selecione uma permisso a partir da Available Permissions lista e clique em Add. A Permission Settings caixa de dilogo ser exibida, que contm informaes sobre a permisso selecionada. Digite as informaes necessrias para essa permisso e clique em OK.

2. 3. 4. 5. 6.

Visual C# Consolidado

617

Se voc desejar adicionar uma permisso personalizada, clique no Import boto e navegue at o arquivo XML que contm informaes sobre a permisso personalizada. 7. Quando voc tiver terminado adicionar permisses, clique em Finish.

COMO: Suprimir Avisos de Alterao de Poltica Usando Caspol.exe


Do Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe) sempre que voc usa uma opo que altera a diretiva de segurana, avisa sobre a alterao de diretiva especfico que est prestes a ocorrer. Se voc estiver familiarizado com Caspol.exe e considere desses avisos desnecessrios, voc pode desativ-los. Para suprimir avisos alterar da diretiva

Digite o seguinte comando no prompt de comando:


caspol polchgprompt off

Para ativar diretiva alterar avisos

Digite o seguinte comando no prompt de comando:


caspol polchgprompt on

Antes como desativar este recurso, considere que geralmente muito mais fceis de serem confirmar uma alterao de diretiva. antes que ele para corrigir a diretiva posteriormente

COMO: Alterar Condies de Participao em um Grupo de Cdigo


Voc pode usar a ferramenta .NET Framework Configuration (Mscorcfg.msc) para alterar condies de membro em relao a grupos de cdigos. Para alterar para um grupo de cdigos usando Mscorcfg.msc condies de membro 1. Execute a ferramenta .NET Framework Configuration (Mscorcfg.msc). 1. 2.
o o

No Painel de Controle, abra Ferramentas administrativas. Clique duas vezes Microsoft .NET Framework <version> Configuration.

Como alternativa, voc pode executar a ferramenta em um prompt de comando: Nas verses do .NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva que contm o grupo de cdigo que voc deseja modificar. Expanda o Code Groups n e expanda rvore sob o All_code n. Clique com o boto direito do mouse no grupo de cdigo adequada e selecione Properties. Clique na Membership Condition guia. Selecione a condio de membros voc deseja associar ao grupo de cdigos na caixa de listagem drop-down. Em seguida, siga as instrues para digitar as informaes necessrias para a condio de membro e clique em OK. Se voc deseja importar uma condio de membro de um arquivo XML, selecione (custom) na lista drop-down condio de participao. Clique Import e navegue at o arquivo XML.

2. 3. 4. 5. 6. 7.

Visual C# Consolidado

618

COMO: Exibir Grupos de Cdigo e Conjuntos de Permisses Usando Caspol.exe


Configuraes de segurana indesejado se algumas vezes, aplicam a um conjunto porque ele por engano pertence ou no pertence a algum grupo de cdigos. Esses efeitos colaterais pode ocorrer quando os grupos de cdigos so adicionadas ou excludas de nveis de diretiva. Do Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe) para facilitar ainda mais a localizar esses problemas no cdigo os nveis de diretiva ' hierarquias de grupo, voc pode usar para listar todos os grupos de cdigo pertence a um conjunto. O conjunto concedido um conjunto de permisses por cada nvel de diretiva. O conjunto de permisses efetivas que a diretiva de segurana concede ao cdigo determinado pela interseo das conjuntos de permisses concedidas pelas diretivas mquina e usurio. Voc pode usar Caspol.exe para exibir conjunto concedido a um conjunto de permisses por um nvel de diretiva especfico. Voc pode usar Caspol.exe para exibir o conjunto de permisses que resulta da interseo do conjunto de permisso concedido pelas diretivas mquina e usurio. Para listar os grupos de cdigos um conjunto pertence a

Digite o seguinte comando no prompt de comando: [caspol -enterprise | -all | -machine | -user] resolvegroup assembly-file Especificar a opo Nvel diretiva antes da resolvegroup opo.Se voc omitir a opo Nvel de diretiva, Caspol.exe mostra todos os nveis de diretiva. O comando a seguir lista os grupos de cdigos que MyAssembly.dll pertena no nvel de diretiva do usurio.

caspol resolvegroup do usurio MyAssembly.dll

Para listar a permisso definir para um conjunto

Digite o seguinte comando no prompt de comando: caspol [-enterprise|-machine|-user|-all] resolveperm assembly-file Especificar a opo Nvel diretiva antes da resolveperm opo.Se voc omitir a opo Nvel de diretiva, Caspol.exe mostra a interseo de todos os nveis de diretiva. O comando a seguir solicita uma lista de permisses que se aplicam a MyApplication.exe no nvel de diretiva do usurio.
caspol user resolveperm MyApplication.exe

Como: Administrar a poltica de segurana para usurios no padro usando Caspol.exe


Do Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe) voc pode usar para administrar uma diretiva de usurio para um usurio que no seja o usurio atual. Para administrar diretiva de usurio para um usurio que no seja o usurio atual

Use the -customuser path option instead of the user policy-level option. The customuser option points Caspol.exe to a specified user security configuration file. Note that customuser must be followed by the path to the user security configuration file. O comando a seguir lista os grupos de cdigos no usurio arquivo de configurao de diretiva de segurana localizado em C:\config_test\.
caspol customuser "C:\config_test\security.config" listgroups

Visual C# Consolidado

619

Quando voc especifica a all opo antes da opo Nvel de diretiva para listar ou resolver Diretiva, Caspol.exe considera todos os nveis de diretiva (usurio, mquina, e empresa).A -all opo sempre usa a diretiva para o usurio atual. No entanto, voc pode usar a diretiva para outro usurio em uma lista de todos os nveis de diretiva ou uma resoluo da diretiva em nveis de diretiva.

Para listar ou resolver toda a diretiva nveis para um usurio que no seja o usurio atual

Use a -customall path opo em vez da opo -all. O seguinte comando resolve diretiva contra a empresa atual e diretiva da mquina,, bem como contra uma diretiva de usurio personalizada.
caspol customall "c:\config_test\security.config" resolvegroup "myApplication.exe"

COMO: Alterar Conjuntos de Permisso Associados com um Grupo de Cdigo Existente


Voc pode usar a ferramenta .NET Framework Configuration (Mscorcfg.msc) para alterar os conjuntos de permisses associados a um grupo de cdigos. Para alterar permisso conjuntos associado a um grupo de cdigos existentes usando Mscorcfg.msc 1. Execute a ferramenta .NET Framework Configuration (Mscorcfg.msc). 1. 2.
o o

No Painel de Controle, abra Ferramentas administrativas. Clique duas vezes Microsoft .NET Framework <version> Configuration.

Como alternativa, voc pode executar a ferramenta em um prompt de comando: Nas verses do .NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva que contm o grupo de cdigo que deseja modificar. Expanda o Code Groups n e expanda rvore sob o All_code n. Clique com o boto direito do mouse no grupo de cdigo adequada e selecione Properties. Clique na Permission Set guia. Selecione a permisso conjunto voc deseja associar ao grupo de cdigos na lista dropdown e clique em OK.

2. 3. 4. 5. 6. 7.

COMO: Analisar Problemas com Permisses de Assembly Usando Caspol.exe


Voc pode usar para solucionar problemas que podem causar um conjunto para no executar ou para acessar recursos protegidos ou executado quando no deveria. o Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe) Para analisar problemas com um conjunto que no executado 1. Use the all and the resolveperm options to determine the permissions that policy grants to the assembly: caspol all resolveperm assembly-file Determinar se o conjunto tem o direito de executar, verificando se o sinalizador de execuo est definido na classe SecurityPermission. Se o conjunto possui direitos de

Visual C# Consolidado

620

execuo, o conjunto de permisses de segurana ser ser irrestrito, ou o atributo sinalizadores iro incluir o sinalizador de execuo. Se o conjunto deve acessar um recurso protegido, (por exemplo, para acessar um disco, criar janelas, gravao para o registro, e assim por diante), verifique se as permisses apropriadas esto definidas. 2. Como as permisses concedidas pelos nveis de diretiva Empresa, Mquina, e usurio interseo, uma permisso deve ser definida em todos os nveis de um conjunto para receb-lo. Se o conjunto no possui permisses suficientes, verifique as permisses concedidas ao conjunto em cada nvel de diretiva: caspol enterprise resolveperm assembly-file caspol machine resolveperm assembly-file caspol user resolveperm assembly-file 3. Se o conjunto for parte de um grupo de cdigos cuja condio de membro muito restritiva, ou definido cuja permisso associado no contm as permisses necessrias para o conjunto funo, o conjunto no pode ser executado corretamente. Se as permisses concedidas ao cdigo so insuficientes, voc pode criar um novo grupo de cdigos que concede o conjunto as permisses necessrias Voc tambm pode modificar o conjunto de permisses associado de ou a condio de membro de um dos grupos de cdigos existentes para que o conjunto recebe as permisses apropriadas. Para obter mais informaes sobre como fazer isso, consulte Como alterar grupos de cdigos usando Caspol.exe:. Para analisar um conjunto que acessa recursos protegidos ou executada quando no deveria

Se um conjunto executado mas no, Deve ou se acessar recursos que ele no deve acessar (tais como recursos necessrios para criar caixas de dilogo), um conjunto o conjunto provavelmente tem sido receber permisses muitos. Use the resolveperm option to determine which permissions the assembly has been granted. Then use the resolvegroups option to determine which code groups it belongs to. Alterar as condies de participao ou os conjuntos dos grupos de cdigos associados para limitar as permisses concedidas ao conjunto de permisses associado.

COMO: Exibir Conjuntos de Permisso Usando Caspol.exe


Do Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe) voc pode usar para listar a permisso define pertencentes para todos os nveis de diretiva ou para um nvel nica diretiva. Para exibir a permisso conjuntos usados em um nvel de diretiva

Digite o seguinte comando no prompt de comando: [caspol-enterprise | -all | -machine | -user] -listpset Especificar a opo Nvel diretiva antes da listpset opo.Se voc omitir a opo Nvel de diretiva, listas Caspol.exe a permisso define para o nvel de diretiva padro. Para administradores de computadores, o nvel padro o nvel de diretiva da mquina; para outros, ele o nvel de diretiva de usurio. O comando a seguir lista os conjuntos de permisso para todos os nveis de diretiva trs.
caspol all -listpset

COMO: Desfazer Alteraes de Poltica Usando Caspol.exe

Visual C# Consolidado

621

Se uma alterao de diretiva tem indesejados efeitos colaterais ou se acidentalmente a alterao foi feita no nvel da Diretiva de segurana errado para recuperar a ltima diretiva Mquina, Usurio ou empresa antes que a alterao foi feita. No diretiva nvel do computador em vez do nvel de diretiva de usurio), como voc pode usar (o Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe) Para desfazer uma alterao de diretiva

Digite o seguinte comando no prompt de comando: [caspol -enterprise | -all | -machine | -user] recover Especificar a opo Nvel diretiva antes da recover opo.Se voc omitir a opo Nvel de diretiva, Caspol.exe desfaz a alterao de diretiva no nvel de diretiva padro. Para administradores de computadores, o nvel padro o nvel de diretiva da mquina; para outros, ele o nvel de diretiva de usurio. O seguinte comando desfaz a ltima alterao para a diretiva de usurio.
caspol user -recover

Observao A recover opo somente desfaz a ltima alterao.Caspol.exe no no cache quaisquer alteraes feitas a ltima alterao antes. Se voc chamar essa opo duas vezes, voc desfazer a recuperao da diretiva.

COMO: Importar uma Permisso Usando um Arquivo XML


Um aplicativo talvez precise controlar o acesso a um recurso em uma maneira atravs de que no haja suporte pelas permisses fornecidos com o SDK do .NET Framework. Por exemplo, um aplicativo pode usar os registros de pessoal onde cada registro de funcionrio armazenado em um arquivo separado;, nesse caso, acesso Leitura e Gravao deve ser controlado independentemente em diferentes tipos de dados Funcionrios. O desenvolvedor de aplicativos deve fornecer uma classe de permisso que permite que o aplicativo para que esse nvel de detalhes de acesso para um arquivo. Exemplo O exemplo a seguir mostra como as informaes para uma permisso podem exibidas no arquivo XML.
<IPermission class="CustomPermission, customPerm, Version=0.0.0.0, Culture=neutral, PublicKeyToken=64a85a7d791b1a32" version="1" Unrestricted="True"/>

O <IPermission> elemento, class atributo, e version Atributo so presente para cada permisso no arquivo XML. O class atributo aponta para a classe e conjunto que implementam a permisso personalizada. A seqncia valor para este atributo pode estar em qualquer formato discutido no Especificando tipo nomes totalmente qualificados, mas ser provavelmente estar no formato mostrado no exemplo. A <IPermission> marca pode conter outros atributos ou elementos filho definidos pelo desenvolvedor que descrevem o estado da permisso. No exemplo anterior, o Unrestricted atributo definido pela classe CustomPermission.

Visual C# Consolidado

622

A nova permisso deve ir em um conjunto de permisses. Voc pode usar para colocar a permisso em um dos conjuntos de permisso mutveis ou para criar uma nova permisso definida. o Ferramenta .NET Framework Configuration (Mscorcfg.msc) Cuidado Antes de adicionar a permisso a diretiva de segurana, voc talvez precise alterar o arquivo XML para que o estado da permisso atenda s suas necessidades. Consulte a documentao do aplicativo para saber sobre os atributos especficos para a permisso e como alterar seu estado. Cada grupo de cdigo que est associado ao conjunto de permisses modificado conceder a nova permisso para cdigo que um membro do grupo do cdigo. Para saber como adicionar uma permisso personalizada a um conjunto de permisses, consulte Configurar conjuntos de permisses usando a ferramenta Configurao .NET Framework.

COMO: Voltar para as Configuraes de Poltica de Segurana Padro Usando Caspol.exe


Ocasionalmente, talvez seja necessrio para redefinir uma diretiva de segurana para os padres aps algumas alteraes da diretiva criar efeitos colaterais indesejveis. A diretiva de segurana padro fornece segurana adequada para seu computador em maioria das situaes. Para retornar para as configuraes Diretiva de segurana padro

Digite o seguinte comando no prompt de comando: [caspol -enterprise | -all | -machine | -user] reset Especificar a opo Nvel diretiva antes da reset opo.Se voc omitir a opo Nvel de diretiva, a Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe) retorna as configuraes Diretiva de segurana padro no nvel de diretiva padro. Para administradores de computadores, o nvel padro o nvel de diretiva da mquina; para outros, ele o nvel de diretiva de usurio. O comando a seguir redefine a diretiva Mquina.
caspol machine reset

Observao Voc pode desfazer a redefinio usando a recover opo se nenhuma alterao de diretiva forem feitas aps a reset chamada.

COMO: Adicionar Grupos de Cdigo Usando Caspol.exe


Sample Group Addition Commands When you use the Code Access Security Policy tool (Caspol.exe) to add a code group to a code group hierarchy, you must define both a membership condition and a permission set for the new code group. You must also define the label or name of the parent code group in which you are adding the new code group. Optionally, you can also set other flags on the code group. For more information about these flags, see Code Access Security Policy Tool (Caspol.exe). To add a code group to a code group hierarchy

Type the following command at the command prompt:

Visual C# Consolidado

623

caspol [-enterprise|-machine|-user] -addgroup {parentLabel|parentName} mship pset_name [-exclusive {on|off}][-levelfinal {on|off}] [-name name] [-description description text] Specify the policy-level option before the addgroup option. If you omit the policy-level option, Caspol.exe adds the code group to the default policy level. For computer administrators, the default level is the machine policy level; for others, it is the user policy level. In this command:
o

The parentLabel argument is the label of the parent code group for the new code group. Alternatively, you can use the parent's code group name (parentName) instead of the parentLabel. To obtain this information, list the code groups as described in How to: View Code Groups Using Caspol.exe. The pset_name argument is the name of the permission set to associate with the new code group. Before a named permission set can be associated with a code group, it must be known at the policy level where you are adding the new code group. For example, if you want to associate a MyPset permission set with a new code group in the user policy, you must have already added the MyPset permission set to the user policy. The only time a permission set does not need to be added beforehand is when you use one of the standard permission sets provided by the .NET Framework. To learn how to add a permission set to a policy level, see How to: Add Permission Sets Using Caspol.exe. The mship argument is the membership condition for the new code group. For the list of values for the mship argument, see Code Access Security Policy Tool (Caspol.exe). Observao

You cannot use the addgroup option to add a code group to more than one level at a time. Each such addition must be made separately because different code group labels and the availability of certain permission sets can cause confusion. Sample Group Addition Commands The following procedures describe how to perform some of the most common code group addition tasks.

To add a code group that targets code from the intranet

Use the -zone option, and specify Intranet as the membership value. The following command associates the Everything permission set with code from the intranet. The code group is also given the name Intranet_CG. You can use this name to refer to the newly created code group, rather than using its numeric labels.
caspol addgroup 1.1. zone Intranet Everything name "Intranet_CG"

To add a code group that targets code from the Internet Explorer Trusted sites

Use the zone option, and specify Trusted as the membership value. The following command associates the LocalIntranet permission set with code from the trusted zone and inserts the new code group as a child of the root of the code group hierarchy.
caspol -addgroup All_Code -zone Trusted LocalIntranet

To add a code group that targets a specific software publisher

Use the pub option, and specify a certificate file, a signed file, or the hexadecimal representation of an X.509 certificate.

Visual C# Consolidado

624

Files from a software publisher must be signed appropriately for this membership condition to work. The membership condition can be constructed on the basis of either an actual certificate file or a signed .exe file. Suppose the certificate file for FourthCoffee (FourthCoffee.cer) is available. The following command adds a code group in the machine policy for code published by FourthCoffee and associates the Nothing permission set with the new group. The code group is added as a child code group of the root.
caspol machine addgroup 1 pub cert FourthCoffee.cer Nothing

To add a code group that targets code from a particular Web site

Use the site option, and specify the URL of the Web site. Observao Due to the possibility of DNS name spoofing, using a Web site as a membership condition is not an effective way to ascertain the identity of code. Where possible, use a strong name membership condition, publisher membership condition, or the hash membership condition.

The following command associates the Intranet permission set with code from
www.microsoft.com. caspol addgroup 1 site www.microsoft.com Intranet

To add a code group that targets code from a particular URL

Use the url option, and specify the URL of the site. The URL must include a protocol, such as http://, http://, or ftp://. Additionally, a wildcard character (*) can be used to specify multiple assemblies from a particular URL. Observao Because a URL can be identified using multiple names, using a URL as a membership condition is not a safe way to ascertain the identity of code. Where possible, use a strong name membership condition, a publisher membership condition, or the hash membership condition.
caspol user addgroup 1 url http://www.contoso.com/bin/* FullTrust caspol user addgroup 1 url http://www.contoso.com/bin/MyAssembly.dll FullTrust

To add a code group that overrides other permissions at a policy level

Set the exclusive flag for the new code group. The following command adds a code group under the Intranet_cg code group. The new code group grants the Everything permission set if the zone is trusted, overriding any other permissions that other code groups might grant.
caspol addgroup "Intranet_cg" zone Trusted Everything exclusive on

To add a code group with a custom membership condition

Use the custom option, and specify an XML file that contains the XML serialization of the custom membership condition.

Visual C# Consolidado

625

Caspol.exe supports the use of custom membership conditions in policy, which makes the policy system highly extensible. The following command adds a new code group to the root of the user policy. This new code group contains a custom membership condition found in the NewMembershipCondition.xml file and grants full trust to assemblies matching this membership condition.
caspol user addgroup All_Code custom NewMembershipCondition.xml FullTrust

To add a code group with a name and description


1. 2. Use the name option, and specify a name for the code group. Double quotes (" ") are required around names that contain spaces. Use the description option, and specify a description for the code group.

You can use the name later to refer to a code group. The name provides better support than numeric labels for scripting policy changes. Default policy is shipped with default names. If not explicitly changed by an administrator, the default names make it easy for administrators using Caspol.exe to access specific code groups across policies and computers. The following command adds a code group under the All_Code group in the machine policy. The new code group checks for a FourthCoffee strong name (as found on Signed.exe) and grants FullTrust to all code that is so signed. The code group is named FouthCoffeeStrongName and is given an appropriate description.
caspol machine addgroup All_Code strong file signed.exe FullTrust name FouthCoffeeStrongName description "Code group granting trust to code signed by FourthCoffee"

Observao If the same name is present in more than one code group, Caspol.exe resolves to the first code group it can find with the given name. It searches all the child code groups of a code group before searching sibling groups.

COMO: Substituir o Mecanismo de Auto-Proteo do Caspol.exe


O Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe) contm um mecanismo Self-Protection que impede alteraes de diretiva de segurana que causaria-lo para cessar funcionando. Voc pode substituir esse mecanismo Self-Protection, se necessrio. Por exemplo, um administrador talvez precise substituir o mecanismo Self-Protection para atualizar a segurana, mesmo que Caspol.exe pode no funcionar corretamente posteriormente. Para substituir o mecanismo Self-Protection Caspol.exe

Use a force opo para a diretiva Alterar opo que caso contrrio, ser rejeitada pelo Caspol.exe. O comando a seguir altera grupo de cdigo raiz a diretiva Usurio para associ-lo ao Nothing conjunto de permisses.
caspol force user chggroup 1 Nothing

Cuidado

Visual C# Consolidado

626

Use esta opo somente com extrema cautela. Ele poder causar Caspol.exe para falhar ou cessar funcionando, nesse caso, a recover opo no pode ser aplicada porque Caspol.exe no pode ser executado. Observao Se isso ocorrer, voc pode executar o equivalente de uma recover operao manual.A mquina submetidos a backup e diretiva de usurio so gravadas em arquivos Security.CFG.old. Simplesmente excluir o arquivo Security.cfg em onde voc fez a alterao, o nvel de diretiva e renomear o arquivo Security.CFG.old para Security.CFG. Para obter mais informaes sobre onde esses arquivos esto localizados, consulte Arquivos de configurao de segurana.

COMO: Criar Grupos de Cdigo


Quando voc cria um grupo de cdigos usando a ferramenta .NET Framework Configuration (Mscorcfg.msc), voc tambm deve associar o grupo com uma condio de membro e um conjunto de permisses. Para criar cdigo grupos usando Mscorcfg.msc 1. Execute a ferramenta .NET Framework Configuration (Mscorcfg.msc). 1. 2.
o o

No Painel de Controle, abra Ferramentas administrativas. Clique duas vezes Microsoft .NET Framework <version> Configuration.

Como alternativa, voc pode executar a ferramenta em um prompt de comando: Nas verses do .NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva voc deseja adicionar o grupo de cdigos para. Expanda o Code Groups n e expanda rvore sob o All_code n. Clique com o boto direito do mouse no grupo de cdigo que ser o pai imediato do novo grupo de cdigos, e escolha New. D ao grupo de cdigo um nome e, opcionalmente, uma descrio. Clique em Next. Selecione uma condio de membro na caixa drop-down. Siga as instrues para inserir as informaes solicitadas para a condio de membro. Clique em Next. Escolha um conjunto de permisses existente a partir da caixa drop-down ou selecione Create a new permission set. Clique em Next e, clique em Finish.

2. 3. 4. 5. 6. 7. 8.

COMO: Desativar a Coleta de Lixo Concorrente


O Common Language Runtime (CLR) ou pode executar coleta de lixo simultaneamente em um segmento separado ou no mesmo segmento como o aplicativo. Use o < gcConcurrent > elemento para especificar como o Runtime deve ser executado coleta de lixo. A seguir mostra para desativar coleta de lixo simultneas. Exemplo
<configuration> <runtime> <gcConcurrent enabled="false"/> </runtime> </configuration>

Visual C# Consolidado

627

Por padro, o tempo de execuo executa coleta de lixo simultaneamente, que reduz o desempenho. Se seu aplicativo segmento nico e envolve interao usurio intensivo, deixe coleta de lixo simultneas ativada para o aplicativo no faz pausa para executar coleta de lixo. Se seu aplicativo tem um aplicativo do servidor ASP.NET, no preciso alterar o valor padro de elemento <gcConcurrent>.

COMO: Importar um Grupo de Cdigo Usando um Arquivo XML


Um aplicativo pode exigir que voc adicionar um grupo cdigo especfico do aplicativo diretiva de segurana. O aplicativo pode fornecidos com um conjunto que implementa o novo grupo de cdigos e um arquivo XML que contm um serializao do novo grupo de cdigos. O arquivo XML pode ser importado para diretiva de segurana usando o Ferramenta .NET Framework Configuration (Mscorcfg.msc). O arquivo XML tambm pode conter informaes sobre participao o conjunto condio e permisses associada ao grupo de cdigos. Normalmente, o aplicativo atender condio de participao especificado e precisa definir a permisso associada. O exemplo a seguir mostra como informaes para um grupo de cdigos e seu conjunto condio e permisso de membros associados podem exibidas em um arquivo XML. Exemplo
<CodeGroup class="System.Security.Policy.UnionCodeGroup, mscorlib, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Name="myCodeGroup" Description="test code group"> <IMembershipCondition class="MyCustomMembershipCondition, myAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Url="http://www.microsoft.com/"/> <PermissionSet class="NamedPermissionSet" version="1" Name="MyPermissionSet" Description="Permission set containing my custom permission"> <IPermission class="myCustomNamespace.CustomPermission, customPerm, Version=0.0.0.0, Culture=neutral, PublicKeyToken=64a85a7d791b1a32" version="1" Unrestricted="True"/> </PermissionSet> </CodeGroup>

O <CodeGroup> elemento contm informaes para um novo grupo de cdigos. O class e version atributos so necessrios para o <CodeGroup> elemento. O class atributo aponta para a classe e conjunto que implementa o novo grupo de cdigos. Valor do class atributo pode ser em qualquer formato discutido no Especificando tipo nomes totalmente qualificados, mas geralmente ser estar no formato mostrado no exemplo. Para esta verso do .NET Framework, o version atributo " 1 ". O Name e Description atributos pode ser qualquer seqncia vlida e pode ser editado. O Name atributo o nome da permisso definido como ele aparece na ferramenta .NET Framework Configuration. O <IMembershipCondition> elemento contm atributos ou elementos filho que especificam a condio que conjuntos devem atender para se tornar um membro do grupo do cdigo e receber suas permisses associadas. O class atributo para <IMembershipCondition> est no mesmo formato que o class atributo para <CodeGroup>. Se um <CodeGroup> elemento contm um <IMembershipCondition> elemento e uma <PermissionSet> elemento , participao o conjunto condio e Permisso so associadas ao grupo de cdigos automaticamente quando ele importado. Do Ferramenta .NET Framework Configuration (Mscorcfg.msc) se uma desses elementos estiverem faltando, voc dever usar para associar o item ausente com o novo grupo de cdigos. Para obter detalhes, consulte Configurar grupos de cdigos usando a ferramenta Configurao .NET Framework.

COMO: Criar uma Poltica do Publisher

Visual C# Consolidado

628

Fornecedores de conjuntos podem estado que aplicativos devem usar uma verso mais recente de um conjunto, incluindo um arquivo de diretiva do editor com o conjunto atualizado. O arquivo de diretivas do editor especifica redirecionamento do conjunto e configuraes base de cdigo, e usa o mesmo formato como um arquivo de configurao do aplicativo. O arquivo de diretivas do editor compilado em um conjunto e inserido no cache de conjunto global. H trs etapas envolvidas ao criar uma diretiva do editor: 1. 2. 3. Criar um arquivo de diretivas do editor. Cria um conjunto da diretiva do editor. Incluir o conjunto da diretiva do editor para o cache de conjunto de mdulos global.

O esquema da diretiva do editor est descrita em Redirecionando verses assembly. O exemplo a seguir mostra um editor que redireciona uma verso do myAssembly para outro arquivo de diretiva.
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="myAssembly" publicKeyToken="32ab4ba45e0a69a1" culture="en-us" /> <!-- Redirecting to version 2.0.0.0 of the assembly. --> <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration>

Para saber como especificar uma base de cdigo, consulte Especificar local um conjunto na. Criando o conjunto da diretiva Publisher Do Vinculador do conjunto (AL.exe) uso para criar o conjunto da diretiva do editor.

Para criar um conjunto da diretiva do editor

Digite o seguinte comando no prompt de comando: al /link:publisherPolicyFile /out:publisherPolicyAssemblyFile /keyfile:keyPairFile Neste comando:

o o

O publisherPolicyFile argumento o nome do arquivo de diretiva do editor. O publisherPolicyAssemblyFile argumento o nome da montagem da diretiva do editor que resulta deste comando. O nome arquivo do conjunto deve seguir o formato: policy.majorNumber.minorNumber.mainAssemblyName.dll O keyPairFile argumento o nome do arquivo que contm o par de chaves. Voc dever assinar o conjunto e editor conjunto da Diretiva com o mesmo par de chaves. O seguinte comando cria um conjunto da diretiva do editor chamado policy.1.0.myAssembly a partir de um arquivo de diretiva do editor chamado pub.config, e atribui um nome de alta segurana ao conjunto usando o par de chaves no arquivo sgKey.snk.
al /link:pub.config /out:policy.1.0.myAssembly.dll /keyfile:sgKey.snk

Adicionando o conjunto da diretiva Publisher no cache do conjunto de mdulos (assembly) global Do Ferramenta Assembly Cache global (Gacutil.exe) uso para adicionar o conjunto da diretiva do editor a cache de conjunto global.

Para adicionar o conjunto da diretiva do editor a cache de conjunto global Visual C# Consolidado 629

Digite o seguinte comando no prompt de comando: gacutil /i publisherPolicyAssemblyFile O comando a seguir adiciona policy.1.0.myAssembly.dll a cache de conjunto global.
gacutil /i policy.1.0.myAssembly.dll

COMO: Remover Grupos de Cdigo Usando Caspol.exe


Do Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe) voc pode usar para remover grupos de cdigos das hierarquias de grupo de cdigo. Quando voc exclui um grupo de cdigo que tenha grupos de cdigos filho, voc tambm excluir os grupos de cdigos filho. Voc no pode copiar parte de uma hierarquia de grupo de cdigo para outra parte do grupo de cdigos ou para outra hierarquia de grupo de cdigo. Portanto, a excluso de um grupo de cdigo pai destri qualquer comportamento de segurana que foi definido na sua hierarquia filho. Cuidado Como ele altamente pode afetar a segurana, tome cuidado extremos quando voc exclui grupos de cdigos. Para remover um grupo de cdigos de uma hierarquia de grupo de cdigo

Digite o seguinte comando no prompt de comando: caspol [-enterprise|-machine|-user] remgroup {label|name} Especificar a opo Nvel diretiva antes da remgroup opo.Se voc omitir a opo Nvel de diretiva, Caspol.exe remover a hierarquia de grupo de cdigos especificada do nvel de diretiva padro. Para administradores de computadores, o nvel padro o nvel de diretiva da mquina; para outros, ele o nvel de diretiva de usurio. O comando a seguir exclui o grupo de cdigos rotulado 1.1.2..
caspol remgroup 1.1.2.

O comando a seguir exclui o grupo de cdigos chamado MyApp_CodeGroup.


caspol remgroup MyApp_CodeGroup

COMO: Criar um Modelo de Canal num Arquivo de Configurao


O exemplo a seguir mostra como criar um modelo do canal em um arquivo de configurao. Exemplo
<configuration> <system.runtime.remoting> <application> </application> <channels> <channel id="MyChannel" type="MyChannel,MyChannelAssembly" > <clientProviders> <formatter ref="soap"> </formatter> <provider type="Channels.AuthenticationSink,MyChannels" /> </clientProviders> </channel> </channels> </system.runtime.remoting> </configuration>

COMO: Alterar Conjuntos de Permisso Usando Caspol.exe


Voc pode alterar o contedo de uma permisso especfica definida por importar um novo arquivo XML que contm um conjunto de permisses que substitui o conjunto de permisses original. O conjunto de permisses somente mutveis fornecido pelo SDK do .NET Framework o Everything conjunto de permisso. Do Ferramenta Diretiva de segurana para acesso de cdigo

Visual C# Consolidado

630

(Caspol.exe) voc pode usar para substituir a permisso original de disco com o novo conjunto especificado no arquivo XML. Para alterar uma permisso defina

Digite o seguinte comando no prompt de comando: caspol chgpset pset_file pset_name. O comando a seguir altera a FilePset permisso definida na diretiva de usurio para o estado especificado no arquivo NewPset.xml.
caspol user chgpset NewPset.xml FilePset

COMO: Remover Conjuntos de Permisso


Use a ferramenta .NET Framework Configuration (Mscorcfg.msc) para remover um conjunto em um nvel especfico de permisses. Para remover uma permisso defina usando Mscorcfg.msc 1. Execute a ferramenta .NET Framework Configuration (Mscorcfg.msc). 1. 2.
o o

No Painel de Controle, abra Ferramentas administrativas. Clique duas vezes Microsoft .NET Framework <version> Configuration.

Como alternativa, voc pode executar a ferramenta em um prompt de comando: No.NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva que deseja remover um conjunto de permisses. Expanda o Permission Sets n. Clique com o boto direito do mouse no conjunto de permisso voc deseja remover e escolha Delete. Observao No possvel remover conjuntos de permisso interna ou conjuntos de permisses que esto associados a um grupo de cdigos.

2. 3. 4. 5.

COMO: Criar Conjuntos de Permisso


Use a ferramenta .NET Framework Configuration (Mscorcfg.msc) para criar uma permisso definido para uma determinada nvel e associ-lo a um grupo de cdigos nova ou existente. Para criar uma permisso conjunto usando Mscorcfg.msc 1. Execute a ferramenta .NET Framework Configuration (Mscorcfg.msc). 1. 2. No Painel de Controle, abra Ferramentas administrativas. Clique duas vezes Microsoft .NET Framework <version> Configuration.

Como alternativa, voc pode executar a ferramenta em um prompt de comando:

Visual C# Consolidado

631

o o

Nas verses do .NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva voc deseja adicionar uma permisso definida. Clique com o boto direito do mouse Permission Sets e escolha New. Dar o conjunto de permisses um nome e, opcionalmente, uma descrio. Clique em Next. Selecione uma permisso a partir da Available Permissions lista e clique em Add. A Permission Settings caixa de dilogo ser exibida, que contm informaes sobre a permisso selecionada. Digite as informaes necessrias para essa permisso e clique em OK. Se voc desejar adicionar uma permisso personalizada, clique no Import boto e navegue at o arquivo XML que contm informaes sobre a permisso personalizada.

2. 3. 4. 5. 6.

7. 8.

Repita a etapa seis at todas as permisses desejadas so adicionadas ao conjunto de permisses. Quando voc tiver terminado adicionar permisses, clique em Finish.

COMO: Tornar Grupos de Cdigo Exclusivos ou Nvel Final


Opcionalmente, usando a ferramenta .NET Framework Configuration (Mscorcfg.msc), voc pode fazer um cdigo exclusivo de grupo ou Nvel final, como mostrado nas seguintes instrues. Para tornar cdigo grupos exclusivo ou final usando Mscorcfg.msc 1. Execute a ferramenta .NET Framework Configuration (Mscorcfg.msc). 1. 2.
o o

No Painel de Controle, abra Ferramentas administrativas. Clique duas vezes Microsoft .NET Framework <version> Configuration.

Como alternativa, voc pode executar a ferramenta em um prompt de comando: Nas verses do .NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva que contm o grupo de cdigo voc deseja tornar exclusivo ou final. Expanda o Code Groups n e expanda rvore sob o All_code n. Clique com o boto direito do mouse no grupo de cdigo que voc deseja que seja exclusivo ou final e selecione Properties. Para fazer um grupo de cdigos exclusivos, marque a caixa de seleo rotulada " Este nvel de diretiva s ter a permisses do conjunto de permisses associado a este grupo de cdigo ". OuPara fazer um nvel de grupo de cdigo final, marque a caixa de seleo rotulada " nveis de diretiva abaixo deste nvel no sero avaliados ". 7. Clique em OK.

2. 3. 4. 5. 6.

COMO: Adicionar uma lista de Poltica de Assemblies Visual C# Consolidado 632

Para o sistema de segurana para avaliar diretiva em um nvel que tenha objetos de segurana que no so fornecidos com o SDK do .NET Framework, com xito o conjunto deve ter confiana total no nvel de diretiva. Do Ferramenta .NET Framework Configuration (Mscorcfg.msc) Quando voc receber um conjunto que contm um novo componente de segurana, use para adicionar o conjunto lista do conjunto totalmente confivel. Observao Colocar um conjunto na lista do conjunto totalmente confivel fornece confiana total ao conjunto somente no nvel. Se o conjunto no estiver na lista de confiana total em todos os outros nveis, o conjunto no ter confiana total mas sim a interseo da qual concedido por aqueles outros nveis. Para adicionar um conjunto lista do conjunto totalmente confivel 1. Em.NET Framework 1.0 e 1.1, na linha de comando, digite %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no .NET Framework 2.0, inicie e tipo mscorcfg.msc. A interface de usurio para a ferramenta exibida. 2. 3. 4. 5. 6. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva voc deseja adicionar o novo conjunto para. Clique com o boto direito do mouse Policy Assemblies e escolha Add. Selecione o nome do conjunto a partir da lista que aparece. Esses so os conjuntos que esto em cache de conjunto global. Clique em Select.

COMO: Importar um Conjunto de Permisso Usando um Arquivo XML


O arquivo XML pode conter um conjunto de permisso (com ou sem uma permisso personalizada) que contm as permisses do aplicativo precisa ser executado. Voc pode importar a permisso definir em Diretiva de segurana usando o Ferramenta Configurao estrutura .NET (Mscorcfg.msc) ou usando o Ferramenta Code Access Security Policy (Caspol.exe). Adicionando uma permisso personalizada usando a ferramenta Configurao .NET Framework O exemplo a seguir mostra um conjunto de permisses e uma permisso dentro de um arquivo XML.
<PermissionSet class="NamedPermissionSet" version="1" Name="MyPermissionSet" Description="Permission set containing my custom permission"> <IPermission class="myCustomNamespace.CustomPermission, customPerm, Version=0.0.0.0, Culture=neutral, PublicKeyToken=64a85a7d791b1a32" version="1" Unrestricted="True"/> </PermissionSet>

O <PermissionSet> elemento pode conter qualquer nmero de <IPermission> elementos, que representam as permisses no conjunto de permisses. O class atributo normalmente contm o valor "NamedPermissionSet" ou "System.Security.NamedPermissionSet". O version atributo indica a verso do .NET Framework. O Name atributo o nome da permisso definido como ele aparece na ferramenta .NET Framework Configuration. O Description atributo fornece uma

Visual C# Consolidado

633

descrio do conjunto de permisses. Do Name voc pode modificar ambos e Description atributos. Cuidado Antes de adicionar permisso definida como diretiva de segurana, voc talvez precise alterar o arquivo XML para que o estado das permisses atenda s suas necessidades. Consulte a documentao do aplicativo para saber sobre os atributos especficos para a permisso e como alterar seu estado.

Para importar uma permisso definir de um arquivo XML utilizando Mscorcfg.msc


1. No.NET Framework 1.0 e 1.1, digite o seguinte no %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc Prompt de comando. Do Prompt de comando SDK no .NET Framework 2.0, inicie e tipo mscorcfg.msc. A interface de usurio para a ferramenta exibida. 2. 3. 4. 5. 6. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva voc deseja adicionar uma permisso definida. Clique com o boto direito do mouse Permission Sets e selecione New. Clique em Import e selecione o arquivo XML que contm as informaes sobre o conjunto de permisses. Associar permisso definido com um grupo de cdigos. Para obter detalhes, consulte Configurar grupos de cdigos usando a ferramenta Configurao .NET Framework (Mscorcfg.msc).

Adicionando uma permisso personalizada usando Access Cdigo a ferramenta Diretiva de segurana Os Ferramenta Code Access Security Policy (Caspol.exe) ships com o .NET Framework SDK e oferece suporte script para alterar a diretiva de segurana. Voc pode usar Caspol.exe para adicionar novos conjuntos de permisses, mas no para modificar permisso conjuntos. Se o arquivo XML tiver somente uma permisso um conjunto de permisses e voc no desejar adicionar a permisso usando Caspol.exe, voc deve coloc a permisso entre um conjunto de permisses.

Para adicionar uma permisso definida por meio Caspol.exe

Digite o seguinte comando no prompt de comando: caspol {-enterprise|-machine|-user} -addpset xmlFile Neste comando, xmlFile o nome do arquivo que contm o conjunto de permisses e a permisso.

COMO: Localizar Assemblies Usando DEVPATH


Os desenvolvedores podem desejar certificar-se que um conjunto compartilhado que est criando funciona corretamente com vrios aplicativos. Em vez de continuamente colocar o conjunto no cache de conjunto global durante o ciclo de desenvolvimento, o desenvolvedor pode criar uma varivel de ambiente DEVPATH que aponta para o diretrio de sada da compilao para o conjunto.

Visual C# Consolidado

634

Por exemplo, suponha que que voc estiver criando um conjunto compartilhado chamado MySharedAssembly e a pasta de sada C:\MySharedAssembly\Debug. Voc pode colocar C:\MySharedAssembly\Debug na varivel DEVPATH. Em seguida, especifique o < developmentMode > elemento no arquivo de configurao do computador. Este elemento informa o Common Language Runtime para usar DEVPATH para localizar conjuntos. O conjunto compartilhado deve ser localizvel pelo tempo de execuo. Para especificar uma pasta particular para resolver conjunto referncias usam o &lt;codeBase&gt; Element ou <probing> Element Em uma configurao arquivo, conforme descrito em Especificar local um conjunto na. Voc tambm pode colocar o conjunto em um subdiretrio do diretrio do aplicativo. Para obter mais informaes, consulte Como o tempo de execuo localiza conjuntos de mdulos (assemblies). Observao Isso um recurso avanado, direcionado somente para desenvolvimento. O exemplo a seguir mostra como para fazer com que o tempo de execuo para procurar por conjuntos em diretrios especificados pela varivel do ambiente DEVPATH. Exemplo
<configuration> <runtime> <developmentMode developerInstallation="true"/> </runtime> </configuration>

Essa configurao ser definido padro como False. Observao Use esta configurao somente no tempo de desenvolvimento. Tempo de execuo no verifica as verses em conjuntos de nome seguro encontrados no DEVPATH. Ele simplesmente usa o primeiro conjunto que encontrar.

COMO: Registrar um Objeto Ativado pelo Servidor e um Objeto Ativado pelo Cliente para um Domnio de Aplicativo de Host
O exemplo a seguir mostra como registrar um objeto servidor-activated e um objeto activated cliente-para um domnio do aplicativo host. O type atributo na <activated> marca indica o nome completo do tipo e nome do conjunto do objeto, como ele aparece na marca <wellknown> . Exemplo
<configuration> <system.runtime.remoting> <application> <service> <wellknown mode = "SingleCall" type = "myType,myAssembly" objectUri = "myType.soap" /> <activated type="MyActivatedType, TypeAssembly" /> </service> </application> </system.runtime.remoting> </configuration>

COMO: Exibir a Poltica de Segurana Usando Caspol.exe


Do Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe) voc pode usar para exibir a diretiva de segurana (hieraquia de grupo de cdigo) e uma lista de conjuntos de permisses conhecidos para todos os nveis de diretiva ou para um nvel nico diretiva.

Visual C# Consolidado

635

Para exibir a diretiva de segurana

Digite o seguinte comando no prompt de comando: [caspol -enterprise | -all | -machine | -user] list Especificar a opo Nvel diretiva antes da list opo.Se voc omitir a opo Nvel de diretiva, Caspol.exe mostra a hierarquia de grupo de cdigo e conhecido permisso nomeada Define a diretiva padro no nvel Para administradores de computadores, o nvel padro o nvel de diretiva da mquina; para outros, ele o nvel de diretiva de usurio.

Ter Grupos de cdigos um nmero de referncia e, opcionalmente, um nome. Voc pode usar um para se referir a grupos de cdigos especficos. Lista Caspol.exe o nome condio de participao e um valor condio de participao (se houver), seguido do nome de conjunto de permisses associado a esse grupo de cdigos. Se o grupo de cdigos mescla as permisses de seus grupos de cdigo filho usando lgica match first-, Caspol.exe indica isso atravs da exibio (FirstMatchCodeGroup.) ao lado do grupo de cdigo A lgica de mesclagem padro executa uma unio das permisses que grupos de cdigos filho conceder. Para obter mais informaes, consulte Modelo de diretiva de segurana. Aps a hierarquia de grupo de cdigo uma lista dos conjuntos nomeados de permisso conhecido em que nvel de diretiva e uma lista de conjuntos confiana total, tambm conhecidos como conjuntos de diretiva.

COMO: Adicionar Conjuntos de Permisso usando Caspol.exe


Voc pode usar para adicionar permisso define como um grupo de cdigos. o Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe) Antes voc pode associar uma permisso nomeada definido com um grupo de cdigos, ele deve ser conhecido no nvel de diretiva do grupo de cdigo. Antes que voc possa adicionar permisso definida com nvel de diretiva do grupo de cdigo, voc deve cri-lo como um arquivo XML. Para adicionar uma permisso nomeada defina como um nvel de diretiva

Digite o seguinte comando no prompt de comando: [caspol -enterprise [permissionSetName | -machine | -user] -addpset xmlFile ] Especificar a opo Nvel diretiva antes da addpset opo.Se voc omitir a opo Nvel de diretiva, Caspol.exe adiciona o conjunto de permisses no nvel de diretiva padro. Para administradores de computadores, o nvel padro o nvel de diretiva da mquina; para outros, ele o nvel de diretiva de usurio. Fornea um nome conjunto de permisso se o arquivo XML no contiver um na forma de um valor de atributo nome. O comando a seguir importa o MyPermissions.xml arquivo conjunto de permisso como a MyPermissions permisso definida no nvel de diretiva da mquina.
caspol -machine addpset MyPermissions.xml MyPermissions

COMO: Alterar Grupos de Cdigo Usando Caspol.exe


Use a chggroup opo de para alterar o nome, condio de membro, conjunto de permisses, sinalizadores, ou a descrio de um grupo de cdigos. o Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe)Voc pode alterar um, alguns, ou todos os esses atributos de grupo de cdigo Para alterar um grupo de cdigos

Visual C# Consolidado

636

Digite o seguinte comando no prompt de comando: caspol [-enterprise|-machine|-user] chggroup label|name {[mship] [pset_name] [-exclusive {on|off}][-levelfinal {on|off}] [-name name] [-description description_text] } Especificar a opo Nvel diretiva antes da chggroup opo.Se voc omitir a opo Nvel de diretiva, Caspol.exe altera o grupo de cdigos especificada no nvel de diretiva padro. Para administradores de computadores, o nvel padro o nvel de diretiva da mquina; para outros, ele o nvel de diretiva de usurio. A sintaxe e significado de mship, pset_name, -exclusive, e -levelfinal so o mesmo usado para a addgroup opo.Para obter mais informaes sobre esses argumentos e opes, consulte Como adicionar grupos de cdigos usando Caspol.exe:. O comando a seguir altera a condio de membro para o grupo de cdigos rotulado 1.2.1. para a Internet condio de membro da zona.
caspol chggroup 1.2.1. zone Internet

O comando a seguir altera o nome do rotulado 1.2.1.1. para MyApp_CodeGroup o grupo de cdigos.
caspol chgroup 1.2.1.1. name MyApp_CodeGroup

O comando a seguir associa permisso Internet definido com o grupo 1.3. de cdigos e desliga o -exclusive Sinalizador.
caspol chggroup 1.3. Internet exclusive off

Cuidado Alterar um grupo de cdigos pode ter largura repercusses para segurana. Use esta opo com cuidado.

COMO: Configurar Canais


O exemplo a seguir, mostra como para criar com um nome que diferente de " http " e utiliz-la de um aplicativo do servidor. um HttpChannel Exemplo
<configuration> <system.runtime.remoting> <application> <service> <wellknown type="Type,Assembly" mode="Singleton" objectUri="endpoint" /> </service> <channels> <channel ref="OtherChannel"/> </channel> </application> <channels> <channel id="OtherChannel" type="CompleteTypeInformation including versiong and strong-name information" /> </channels> </system.runtime.remoting> </configuration>

Consulte tambm

COMO: Ativar e Desativar a Segurana Usando Caspol.exe


Voc pode usar para Ativar segurana e a. o Ferramenta Diretiva de segurana para acesso de cdigo (Caspol.exe) Quando a segurana de acesso ao cdigo desativada, todas as demandas de acesso ao cdigo xito. Desativar a segurana de acesso ao cdigo torna o sistema vulnervel a ataques por cdigo mal-intencionado, como vrus e worms. A desativao de segurana obtm alguns desempenho extra mas s deve ser feito quando outras medidas de segurana ter sido seguidas para ajudar a proteger exemplos de segurana do sistema. Exemplos de outras precaues de segurana incluem desconectando de redes pblicas, fisicamente proteger computadores, e assim por diante.

Visual C# Consolidado

637

Cuidado Desativando a segurana de acesso ao cdigo uma operao todo computador-que termina verificaes de segurana para todo cdigo gerenciado e para todos os usurios no computador. Embora a list opo mostra que Segurana est desativada, nada mais claramente indica para outros usurios que segurana tenha sido desativada.Se verses lado a lado-do Common Language Runtime so instaladas, esse comando desativa a segurana para cada verso do tempo de execuo instalado no computador. Para desativar a segurana

Digite o seguinte comando no prompt de comando:


caspol security off

Para ativar segurana

Digite o seguinte comando no prompt de comando:


caspol security on

COMO: Remover Permisses de um Conjunto de Permisses


Use a ferramenta .NET Framework Configuration (Mscorcfg.msc) para remover uma permisso de um conjunto de permisso. Observao O.NET Framework inclui diversos conjuntos de permisso interna. O conjunto de permisses somente internos que pode ser alterado o Everything conjunto de permisso. Para remover uma permisso de uma permisso definido usando Mscorcfg.msc 1. Execute a ferramenta .NET Framework Configuration (Mscorcfg.msc). 1. 2.
o o

No Painel de Controle, abra Ferramentas administrativas. Clique duas vezes Microsoft .NET Framework <version> Configuration.

Como alternativa, voc pode executar a ferramenta em um prompt de comando: Nas verses do .NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. Expanda o Runtime Security Policy n. Expanda o n para o nvel de diretiva que deseja remover a permisso de. Expanda o Permission Sets n. Clique com o boto direito do mouse no conjunto de permisso voc deseja remover a permisso de e escolha Change Permissions. Selecione uma permisso a partir da Assigned Permissions lista e clique em Remove. Clique em Finish.

2. 3. 4. 5. 6. 7.

Como: Executar tarefas de poltica de segurana comuns usando a ferramenta de configurao do .NET Framework (Mscorcfg.msc) Visual C# Consolidado 638

Do Ferramenta Configurao estrutura .NET (Mscorcfg.msc) voc pode usar para configurar a diretiva de segurana para atender s suas necessidades. A tabela a seguir descreve algumas das tarefas voc pode executar. Tarefas de diretiva de segurana Novo

Descrio Criar um novo arquivo de diretiva. Use esta opo para criar e implantar novos arquivos de nvel de diretiva sem afetar a diretiva no computador atual. Abra um nvel de diretiva. Use esta opo para abrir arquivos criados usando a New opo de diretiva. Redefinir todos os nveis de diretiva para o padro. Ajuste o nvel de segurana para cada zona. Exibir as permisses concedidas a um conjunto ou os grupos de cdigos que conceder permisses a um conjunto. Atribuir um nvel de confiana a um conjunto. Criar e implantar a diretiva de segurana em uma rede.

Abrir Redefinir tudo Ajustar Segurana Avaliar Conjunto de Mdulos (Assembly) Confiar assembly Criar um pacote de implantao

Para executar essas tarefas com base em segurana 1. Execute a ferramenta .NET Framework Configuration (Mscorcfg.msc). 1. 2.
o o

No Painel de Controle, abra Ferramentas administrativas. Clique duas vezes Microsoft .NET Framework <version> Configuration.

Como alternativa, voc pode executar a ferramenta em um prompt de comando: Nas verses do .NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc. Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc. No painel esquerdo, clique com o boto direito do mouse no Runtime Security Policy n. Escolha a tarefa que deseja executar a partir do menu.

2. 3.

Como Criar um Gerenciador de Recursos de Compensao (CRM)


Exemplo do cdigo Um gerenciador de recursos de compensao (CRM) um servio fornecido pelo COM + que permite que voc para incluir objetos no transacional em transaes Microsoft Distributed transaes distribudas (DTC). Embora os CRMs no fornecem os recursos do Gerenciador de recursos completo, eles fazer fornecem atomicidade transacional (comportamento All-or-Nothing) e durabilidade atravs o log de recuperao. Para criar um gerenciador de recursos Compensating 1. Importar os espaos para nome EnterpriseServices e CompensatingResourceManager. C#
using System.EnterpriseServices; using System.EnterpriseServices.CompensatingResourceManager;

Visual C# Consolidado

639

2. Ativar o suporte do CRM para o conjunto. C#


[assembly: ApplicationCrmEnabled]

3. Definir uma classe do operador CRM que deriva da classe ServicedComponent. Por exemplo, o cdigo a seguir mostra uma classe CRMWorker que deriva diretamente de ServicedComponent. C#
[Transaction] public class CRMWorker:ServicedComponent { }

4. Implementar um mtodo pblico que cria um objeto Clerk e confirma ou anula a transao. O mtodo deve atualizar o log do CRM usando o objeto Clerk. Por exemplo, o cdigo a seguir mostra um mtodo CRMMethod que atualiza o log do CRM e confirma ou anula a transao. C#
public void CRMMethod(string fileName, bool bCommit) { // Create clerk object. Clerk clerk = new Clerk(typeof(CRMCompensator), "CRMCompensator", CompensatorOptions.AllPhases); clerk.WriteLogRecord(fileName); clerk.ForceLog(); if (bCommit) ContextUtil.SetComplete(); else ContextUtil.SetAbort(); }

5. Definir uma classe que deriva da classe compensao. C#


[JustInTimeActivation] public class CRMCompensator:Compensator { }

Observao Voc deve aplicar o JustInTimeActivation atributo para o compensador; caso contrrio anular chamado duas vezes. 1. Substituir e EndAbort membros da classe Compensator., EndPrepare, CommitRecordBeginCommit, BeginAbortEndCommit, AbortRecord a BeginPrepare,
PrepareRecord

2. Criar um aplicativo do cliente para testar os componentes do operador CRM e Compensator. 1. Importar os nomes necessrios, como o System.EnterpriseServices e espao para nome que implementa as classes do operador CRM e Compensator. C#
using System; using System.IO; using System.EnterpriseServices; using CrmServer; using System.Runtime.InteropServices;

2. Definir uma classe e implementar o mtodo principal para criar uma instncia da classe do operador CRM, e chamar esse mtodo que cria o objeto Clerk CRM. Por exemplo, o cdigo a seguir cria um objeto do tipo CRMWorker e chama o mtodo CRMMethod para criar o objeto Clerk CRM. C#
class CRM { public static int Main() { string logfilename = "crm.log"; Console.WriteLine("Creating a managed CRM worker object..."); CRMWorker crmworker = new CRMWorker(); Console.WriteLine("Demonstrating a worker commit..."); crmworker.CRMMethod(logfilename, true); Console.WriteLine("Demonstrating a worker

Visual C# Consolidado

640

abort..."); crmworker.CRMMethod(logfilename, false); Console.WriteLine("DONE!"); return 0; } }

3. Gerar uma chave forte e compilar o exemplo a seguir. C#


sn k crm.key csc /t:library /r:System.EnterpriseServices.dll crm.cs csc /r:crm.dll crmclient.cs

Exemplo C#
using System; using System.IO; using System.Reflection; using System.EnterpriseServices; using System.EnterpriseServices.CompensatingResourceManager; [assembly: ApplicationActivation(ActivationOption.Server)] [assembly: ApplicationCrmEnabled] [assembly: AssemblyKeyFile("crm.key")] namespace CrmServer { [Transaction] // Create a Worker class. public class CRMWorker:ServicedComponent { public void CRMMethod(string fileName, bool bCommit) { // Create clerk object. Clerk clerk = new Clerk(typeof(CRMCompensator), "CRMCompensator", CompensatorOptions.AllPhases); clerk.WriteLogRecord(fileName); clerk.ForceLog(); if (bCommit) ContextUtil.SetComplete(); else ContextUtil.SetAbort(); } } // Create class derived from Compensator class. [JustInTimeActivation] public class CRMCompensator:Compensator { bool bBeginPrepareCalled = false; bool bPrepareRecordCalled = false; bool bBeginCommitCalled = false; bool bCommitRecordCalled = false; bool bBeginAbortCalled = false; bool bAbortRecordCalled = false; String _fileName; public override void BeginPrepare() { bBeginPrepareCalled = true; } public override bool PrepareRecord(LogRecord rec) { Object o = rec.Record; _fileName = o.ToString(); bPrepareRecordCalled = true; return false; } public override bool EndPrepare() { if (!bBeginPrepareCalled) {return false;} if (!bPrepareRecordCalled) {return false;} if (_fileName==null) {return false;} // This is a Prepare Phase success. return true; } public override void BeginCommit(bool fRecovery) { bBeginCommitCalled = true; } public override bool CommitRecord(LogRecord rec) { bCommitRecordCalled = true; return true; } public override void EndCommit() { if (!bBeginCommitCalled) {return;} if (!bCommitRecordCalled) {return;} if (_fileName==null) {return;} // This is a Commit Phase success. } public override void BeginAbort(bool fRecovery) { bBeginAbortCalled = true; } public override bool AbortRecord(LogRecord rec) { bAbortRecordCalled = true; Object o = rec.Record; _fileName = o.ToString(); return true; } public override void EndAbort() { if (!bBeginAbortCalled) {return;} if (!bAbortRecordCalled) {return;} if (_fileName==null) {return;} // This is an Abort Phase success. } } }

Como Criar um Serviced Component


O procedimento a seguir descreve como criar um novo componente de servio. Para criar um componente de servio 1. Definir uma classe que deriva direta ou indiretamente a partir da ServicedComponent classe. Por exemplo, o cdigo a seguir garante que a Calculator classe hospedada por um aplicativo do COM +. C#
using System.EnterpriseServices; public class Calculator : ServicedComponent { public int Add (int x, int y) { return(x+y); } }

2. Aplicar atributos para indicar como cada conjunto, classe, ou mtodo deve interagir com funcionalidade com +.

Visual C# Consolidado

641

Observao No.NET Framework verso 1.1, a configurao de segurana do COM + habilitada por padro se o ApplicationAccessControlAttribute atributo no est presente no conjunto. Isso uma alterao no comportamento de .NET Framework verso 1.0. C#
[assembly: ApplicationName("Calculator")] [assembly: System.Reflection.AssemblyKeyFile("Calculator.snk")] [MustRunInClientContext] public class Calculator : ServicedComponent { // Member definitions. }

3. Gerar uma chave forte e compilar o exemplo a seguir: C#


sn k Calculator.snk csc /t:library /r:System.EnterpriseServices.dll Calculator.cs

4. Implantar o aplicativo de componentes atendidos por registrar seu conjunto dinamicamente ou manualmente. 5. Aps um componente de servio estiver registrado, os clientes podem criar instncias do componente como eles criar instncias de qualquer outro componente. Para obter um exemplo completo, consulte Exemplo de servio do componente. Observao Em plataformas Windows 2000, com + sempre carrega a verso mais recente do Common Language Runtime do para o componente voc est criando. Isso significa que em um computador com o .NET Framework verso 1.0 e .NET Framework verso 1.1 instalado,.NET Framework verso 1.1 carregado sempre. Como uma soluo, voc pode criar um arquivo Dllhost.exe.Configuration COM + que permite que voc para bloquear todos os aplicativos para uma verso especfica do .NET Framework. No Windows xp e plataformas Windows Server 2003, a configurao diretrio raiz de aplicativo pode ser usada para apontar com + para uma pasta apropriada para seu arquivo de configurao. Exemplo C#
using System.EnterpriseServices; [assembly: ApplicationName("Calculator")] [assembly: System.Reflection.AssemblyKeyFile("Calculator.snk")] [MustRunInClientContext] public class Calculator : ServicedComponent { public int Add (int x, int y) { return(x+y); } }

Como Aplicar o Atributo Description a um Assembly


O exemplo a seguir mostra como aplicar o DescriptionAttribute atributo para definir a descrio de um conjunto. Exemplo C#
using System.EnterpriseServices; [ assembly: Description("BankComponent assembly")] public class Account : ServicedComponent { static void Main() {} }

Visual C# Consolidado

642

Compilando o cdigo Este exemplo requer:

Referncias a espaos para nome do sistema e System.EnterpriseServices.

Como Usar os Mtodos SetAbort e SetComplete


Este exemplo mostra como usar o esttico SetComplete e SetAbort mtodos da classe System.EnterpriseServices.ContextUtil. Para obter mais informaes sobre esses mtodos, consulte Votao em uma transao automticas. Exemplo C#
//Try to do something crucial to the transaction in progress. if( !DoSomeWork() ) { ContextUtil.SetAbort(); //Something goes wrong. } else { ContextUtil.SetComplete(); //All goes well. }

Compilando o cdigo Este exemplo requer:

Referncias a espaos para nome do sistema e System.EnterpriseServices.

Como Aplicar o Atributo ApplicationID a um Assembly


Este exemplo mostra como aplicar o atributo ApplicationID a um conjunto. Exemplo C#
using System.EnterpriseServices; [ assembly: ApplicationName("BankComponent")] [ assembly: ApplicationID("4fb2d46f-efc8-4643-bcd0-6e5bfa6a174c")] public class Account : ServicedComponent { static void Main() {} }

Compilando o cdigo Este exemplo requer:

Referncias a espaos para nome do sistema e System.EnterpriseServices

Como Criar um Objeto de Pool e Definir seus Limites de Tamanho e de Tempo


Para uma classe que deriva da classe System.EnterpriseServices.ServicedComponent, com + Objeto pool pode usar para evitar a sobrecarga de instanciar objetos de zero. Em vez disso objetos obter recebidos de um pool quando ativado. Para obter mais informaes, consulte Objeto pool. Para criar um objeto agrupado e definir seu tamanho e tempo limite limita 1. Definir uma classe que deriva da classe System.EnterpriseServices.ServicedComponent, e aplique o ObjectPoolingAttribute atributo classe. Por exemplo, o cdigo a seguir define uma classe denominada TestObjectPooling e define e CreationTimeout propriedades para a classe. o MinPoolSize, MaxPoolSize C#

Visual C# Consolidado

643

[ObjectPooling(Enabled=true, MinPoolSize=2, MaxPoolSize=5, CreationTimeout=20000)] public class TestObjectPooling : ServicedComponent { }

2. 3.

Substituir o Activate, Deactivate., e CanBePooled mtodos de classe System.EnterpriseServices.ServicedComponent Teste o objeto em pool, em um aplicativo do cliente: 1. Criar uma instncia da classe do objeto agrupada e chamar os mtodos no objeto em pool. Por exemplo, o cdigo a seguir cria uma instncia da classe TestObjectPooling e chama um Perform mtodo. C#
public class App { public static int Main(string[] args) { TestObjectPooling order = new TestObjectPooling(); order.Perform();

2.

Chame o mtodo DisposeObject para retornar o objeto para o pool. C#


ServicedComponent.DisposeObject (order);

Exemplo C#
[ObjectPooling(Enabled=true, MinPoolSize=2, MaxPoolSize=5, CreationTimeout=20000)] public class TestObjectPooling : ServicedComponent { public void Perform () { // Method contents go here. } protected override void Activate() { // Called when removed from the pool. } protected override void Deactivate() { // Called before deactivating or placing back in pool. } protected override bool CanBePooled() { // Called after Deactivate. Indicate your vote here. return true; } }

Como criar um Mtodo de Web Service que Usa Transaes Automticas


O procedimento a seguir descreve como criar um mtodo de servio da Web que usa transaes automticas. Se ocorrer uma exceo enquanto um mtodo de servio da Web est participando em uma transao, ASP.NET anula automaticamente a transao. Da mesma forma, se nenhuma exceo ocorrer, a transao confirmada automaticamente. Para criar um servio da Web que usa transaes automticas 1. Importar os espaos para nome System.WebServices e System.EnterpriseServices. Outros espaos para nomes, tais como System.Data e System.Data.SqlClient, podem ser importado conforme necessrio. C#
<%@ WebService Language="C#" Class="Orders" %> <%@ assembly name="System.EnterpriseServices" %> using System.Web.Services; using System.EnterpriseServices;

2.

Definir uma classe que deriva da classe WebService. Por exemplo, o cdigo a seguir define uma classe denominado Pedidos que deriva da classe WebService. C#
public class Orders : WebService { }

3.

Para cada mtodo Web que deve participar automaticamente de uma transao, aplicar o WebMethodAttribute atributo, e definir a opo da transao. Por exemplo, no cdigo a seguir o atributo WebMethod aplicado para o DeleteAuthor mtodo, e a TransactionOption propriedade definida como TransactionOption.RequiresNew.

Visual C# Consolidado

644

C#
[ WebMethod(TransactionOption=TransactionOption.RequiresNew)] public int DeleteAuthor(string lastName) { // Perform the required database task. }

Exemplo C#
<%@ WebService Language="C#" Class="Orders" %> <%@ assembly name="System.EnterpriseServices" %> using System; using System.Data; using System.Data.SqlClient; using System.Web.Services; using System.Web.Util; using System.EnterpriseServices; public class Orders : WebService { [ WebMethod(TransactionOption=TransactionOption.RequiresNew)] public int DeleteAuthor(string lastName) { String deleteCmd = "DELETE FROM authors2 where au_lname='" + lastName + "'" ; SqlConnection sqlConn = new SqlConnection("Integrated Security=SSPI;database=pubs;server=myserver"); SqlCommand myCommand = new SqlCommand(deleteCmd,sqlConn); // If a Web service method is participating in a transaction and an // exception occurs, ASP.NET automatically aborts the transaction. // Likewise, if no exception occurs, then the transaction is // automatically committed. myCommand.Connection.Open(); return myCommand.ExecuteNonQuery(); } }

Como Definir a Propriedade SoapRoot Property para um Aplicativo


Este exemplo mostra como definir a propriedade SoapVRoot " MyVRoot ". Exemplo C#
[ApplicationActivation(ActivationOption.Library, SoapVRoot="MyVRoot")]

Compilando o cdigo Este exemplo requer:

Referncias para o sistema e System.EnterpriseServices Namespace espaos para nome

Como Definir o Tempo Limite da Transao


Este exemplo mostra como definir o limite de transao como 10 segundos. Exemplo C#
[Transaction(TransactionOption.Required, Isolation=TransactionIsolationLevel.Serializable, Timeout=10)]

Compilando o cdigo Este exemplo requer:

Referncias ao espao para nome System.EnterpriseServices.

Como Definir o Nome do Aplicativo Usando o Atributo ApplicationName


Este exemplo mostra como para fornecer o nome do aplicativo, usando o conjunto - atributo ApplicationName.

Visual C# Consolidado

645

Exemplo C#
using System.EnterpriseServices; [ assembly: ApplicationName("BankComponent")] public class Account : ServicedComponent { static void Main() {} }

Compilando o cdigo Este exemplo requer:

Referncias para o sistema e System.EnterpriseServices espaos para nome.

Como Usar o Recurso BYOT (Bring Your Own Transaction - Traga sua Prpria Transao) do COM+
Exemplo do cdigo O procedimento e exemplo a seguir mostram como uma classe derivada da classe ServicedComponent pode usar o recurso BYOT do COM + para acessar um coordenador transaes distribudas (DTC). Para obter mais informaes como utilizar o recurso BYOT de dentro do espao de nome System.EnterpriseServices, consulte BYOT (colocar seu prprio Transaction). Para criar um objeto que usa a transao de outro objeto. 1. Definir uma classe que deriva da classe ServicedComponent, e expe uma propriedade pblica que retorna o objeto transaes DTC com + atual. Por exemplo, no cdigo a seguir a classe Base, herda a classe ServicedComponent e tem uma propriedade pblica que retorna o objeto ContextUtil.Transaction para a transao COM + DTC atual no qual o objeto instanciado. C#
using System.EnterpriseServices; public class Base : ServicedComponent { public Object Transaction { get { return ContextUtil.Transaction; } } }

2.

Crie duas classes que derivar da classe definida na etapa 1 e defina o atributo de transaes para ambas as classes. Por exemplo, o cdigo a seguir declara duas classes CTransaction1 e CTransaction2 derivar de classe Base, e tm seu conjunto de atributos de transaes. C#
[Transaction] public class CTransaction1 : Base { // Insert your transaction logic here. } [Transaction] public class CTransaction2 : Base { // Insert your transaction logic here. }

3.

Criar um aplicativo do cliente que usa as classes criadas na etapa 2 para testar o recurso BYOT. 1. Criar uma instncia de uma das classes definidas na etapa 2. Por exemplo, o cdigo a seguir cria uma instncia da classe CTransaction1. C#
class BYOTDemonstration { static void Main() { CTransaction1 tx1 = new CTransaction1(); } }

2.

Recuperar a transao COM + DTC atual do objeto criado no 3.a etapa. Por exemplo, o cdigo a seguir recupera o objeto transaes a partir da propriedade Transaction pblica da classe CTransaction1. C#

Visual C# Consolidado

646

Object tx = tx1.Transaction;

3.

Criar uma instncia da classe segundo definiu na etapa 2, usando o objeto Transaction recuperado em 3.b etapa. Por exemplo, o cdigo a seguir cria uma instncia da classe CTransaction2 usando o Transaction recuperada em 3.b etapa. C#
CTransaction2 tx2 = (CTransaction2)BYOT.CreateWithTransaction(tx, typeof(CTransaction2));

4.

Gerar uma chave forte e compilar o exemplo a seguir: C#


sn k BYOTDemo.snk

Exemplo C#
using System; using System.Reflection; using System.EnterpriseServices; [assembly: AssemblyKeyFileAttribute("byotdemo.snk")] public class Base : ServicedComponent { public Object Transaction { get { return ContextUtil.Transaction; } } } [Transaction] public class CTransaction1 : Base { // Insert your transaction logic here. } [Transaction] public class CTransaction2 : Base { // Insert your transaction logic here. } class BYOTDemonstration { static void Main() { /* Create a transactional object, and then get its transaction. */ CTransaction1 tx1 = new CTransaction1(); Console.WriteLine("Created transaction1."); Object tx = tx1.Transaction; Console.WriteLine("Got the transaction of transaction1."); CTransaction2 tx2 = (CTransaction2)BYOT.CreateWithTransaction(tx, typeof(CTransaction2)); Console.WriteLine("Created transaction2 using the transaction of transaction1."); } }

Como Criar um Componente Privado


Este exemplo mostra como usar o atributo PrivateComponentAttribute em uma classe. Exemplo C#
[PrivateComponent] public class CPrivate : ServicedComponent

Compilando o cdigo Este exemplo requer:

Referncias ao espao para nome System.ServiceProcess.

Como Definir o Tipo de Ativao de um Aplicativo


Este exemplo mostra como definir o tipo de ativao para " Servidor ". Exemplo C#
using System.EnterpriseServices; [ assembly: ApplicationActivation(ActivationOption.Server)] public class Account : ServicedComponent { static void Main() {} }

Compilando o cdigo

Visual C# Consolidado

647

Este exemplo requer:

Referncias para o sistema e System.EnterpriseServices espaos para nome.

Como Habilitar Sincronizao em Instncias de uma Classe


O exemplo a seguir mostra como habilitar a sincronizao em instncias da classe TestSync . Exemplo C#
[Synchronization] public class TestSync : ServicedComponent

Compilando o cdigo Este exemplo requer:

Referncias para o sistema e System.EnterpriseServices espaos para nome.

Como Usar Transaes Automticas em uma Classe do .NET Framework


O procedimento a seguir descreve como preparar uma classe para participar de uma transao automtica. Para preparar uma classe para participar de uma transao automtica 1. Do TransactionAttribute derivar sua classe de classe ServicedComponent, e aplicar sua classe. O exemplo a seguir mostra como aplicar o atributo TransactionAttribute a uma classe derivada da classe ServicedComponent. C#
[Transaction(TransactionOption.Required)] public class Account : ServicedComponent { //. . . }

2.

Aplicar o atributo AutoCompletar para cada mtodo para o qual o mtodo ContextUtil.SetComplete deve ser chamado automaticamente na ausncia de excees. O exemplo a seguir mostra como aplicar o atributo AutoCompletar. C#
[AutoComplete] public void Debit(int amount) { // Do some database work. Any exception thrown here aborts the // transaction; otherwise, transaction commits. }

3.

Assinar o assembly com um strong name. Do AssemblyKeyFileAttribute para assinar o conjunto usando atributos, crie um par de chaves usando Sn.exe, e adicione ou AssemblyKeyNameAttribute Conjunto atributo e especifique o nome do arquivo que contm o par de chaves para assinar o conjunto com um nome de alta segurana. C#
[assembly: AssemblyKeyFileAttribute("TestApp.snk")]

4. 5.

Registrar o conjunto que contm a classe com o catlogo COM +. Se as instncias de chamada de sua classe do cliente gerenciado pelo Common Language Runtime, o registro ser executado para voc. No entanto, se voc prev que um chamador no gerenciado pode criar e chamar instncias da sua classe, usar a ferramenta de instalao dos Servios .NET (Regsvcs.exe) para executar o Registro manualmente.

Exemplo C#

Visual C# Consolidado

648

// ----------------------------------------------------------------- // TestApp.cs // Generate a Strong name: // sn -k TestApp.snk // Compile the code: // csc /target:exe /r:System.EnterpriseServices.dll TestApp.cs // Run TestApp: // start TestApp.exe // ----------------------------------------------------------------- using System; using System.Runtime.CompilerServices; using System.EnterpriseServices; using System.Reflection; //Registration details. //COM+ application name as it appears in the COM+ catalog. [assembly: ApplicationName("TestApp")] //Strong name for assembly. [assembly: AssemblyKeyFileAttribute("TestApp.snk")] [Transaction(TransactionOption.Required)] public class Account : ServicedComponent { //Provides SetComplete behavior in the absence of exceptions. [AutoComplete] public void Debit(int amount) { // Do some database work. Any exception thrown here aborts the // transaction; otherwise, transaction commits. } } public class client { public static int Main() { Account accountX = new Account(); accountX.Debit(100); return 0; } }

Como Habilitar Ativao JIT


Este exemplo mostra como habilitar ativao JIT e desativao e de uma classe. Exemplo C#
[JustInTimeActivation] public class TestJITObjectPooling : ServicedComponent

Compilando o cdigo Este exemplo requer:

Referncias para o sistema e System.EnterpriseServices espaos para nome.

Como Definir o Atributo AutoComplete em uma Classe Transaction-Aware


Este exemplo mostra a colocao de atributo AutoCompletar em uma classe reconhecem transaes. Para obter mais informaes sobre o AutoCompletar atributo, consulte Votao em uma transao automticas. Exemplo C#
[Transaction(TransactionOption.Supported)] public class Account : ServicedComponent { [AutoComplete] public void Debit(int amount) { // Do some database work. Any exception thrown here aborts the // transaction; otherwise, transaction commits. } }

Compilando o cdigo Este exemplo requer:

Referncias a espaos para nome do sistema e System.EnterpriseServices.

Como Implementar um Componente Enfileirado que Exibe uma Mensagem de Forma Assncrona
Exemplo do cdigo O servio QC COM + fornece uma maneira de uma classe componente para ser chamado assincronamente USAR O enfileiramento de mensagens Microsoft. Para obter mais informaes

Visual C# Consolidado

649

sobre componentes enfileirados derivados da System.EnterpriseServices.ServicedComponent classe, consulte O QC (queueds Components). Para implementar um componente enfileirado que exibe uma mensagem de forma assncrona 1. Importar espao para nome System.EnterpriseServices. C#
using System.EnterpriseServices;

2.

Defina o ApplicationActivation atributo como ActivationOption.Server; ativar o ouvinte da fila aplicativo enfileiramento e definindo o ApplicationQueuing atributo assembly, como mostrado no cdigo de exemplo a seguir: C#
[assembly: ApplicationActivation(ActivationOption.Server)] [assembly: ApplicationQueuing(Enabled=true, QueueListenerEnabled=true)]

3.

Definir uma interface na fila, e aplique o InterfaceQueuing atributo interface. Por exemplo o cdigo a seguir mostra o atributo InterfaceQueuing aplicada para a IQComponent interface que tenha um nico mtodo DisplayMessage. C#
[InterfaceQueuing] public interface IQComponent { void DisplayMessage(string msg); }

4.

Definir uma classe que deriva da classe System.EnterpriseServices.ServicedComponent e implementa a interface na fila. Por exemplo, o cdigo de exemplo a seguir declara uma classe denominada QComponent que deriva da classe System.EnterpriseServices.ServicedComponent e implementa a IQComponent interface. C#
public class QComponent : ServicedComponent, IQComponent { public void DisplayMessage(string msg) { MessageBox.Show(msg, "Processing message"); } }

5.

Criar um aplicativo cliente e testar o componente enfileirado. 1. Criar uma varivel cujo tipo de dados a interface na fila do qual a classe componente enfileirado derivada. C#
IQComponent iQc = null;

2.

Vincular ao moniker correspondente interface na fila, e chamamos o mtodo no componente enfileirado para exibir a mensagem de forma assncrona. Por exemplo o cdigo a seguir vincula ao componente enfileirado que corresponda interface IQComponent, e chama o mtodo DisplayMessage para exibir uma mensagem de forma assncrona. C#
IQComponent iQc = null; try { iQc = (IQComponent) Marshal.BindToMoniker("queue:/new:QCDemo.QComponent"); } catch { MessageBox.Show("Cannot create Queued Component"); } iQc.DisplayMessage (messageToSend.Text); Marshal.ReleaseComObject(iQc);

Exemplo C#
using System.Reflection; using System.EnterpriseServices; [assembly: ApplicationName("QCDemoSvr")] [assembly: ApplicationActivation(ActivationOption.Server)] [assembly: ApplicationQueuing(Enabled=true,

Visual C# Consolidado

650

QueueListenerEnabled=true)] [assembly: AssemblyKeyFile("QCDemoSvr.snk")] namespace QCDemo { [InterfaceQueuing] public interface IQComponent { void DisplayMessage(string msg); } public class QComponent : ServicedComponent, IQComponent { public void DisplayMessage(string msg) { MessageBox.Show(msg, "Processing message"); } } }

Como Implementar Eventos Fracamente Acoplados


Exemplo do cdigo O procedimento e exemplo a seguir mostram como para implementar uma classe de evento e coletor de eventos que implementam uma interface de eventos comuns, mais um editor para acionar um evento. Para obter mais informaes sobre como usar o modelo flexvel coupled Eventos COM +, consulte Eventos flexvel Coupled. Para implementar flexvel aliada eventos 1. Definir uma interface de eventos. Por exemplo, o cdigo a seguir define uma interface de evento denominada IlceMsg que tenha um mtodo chamado EventMethod. C#
public interface ILceMsg { void EventMethod(string message); }

2.

Definir uma classe de evento que deriva da classe System.EnterpriseServices.ServicedComponent e implementa a interface de evento definiu na etapa 1. Por exemplo, o cdigo a seguir define uma classe de evento chamado LceClass. C#
[EventClass] public class LceClass : ServicedComponent, ILceMsg { public void EventMethod(string message){} }

3.

Definir uma classe mesmo do coletor que deriva da classe System.EnterpriseServices.ServicedComponent e implementa a interface de evento definiu na etapa 1. Por exemplo, o cdigo a seguir define uma classe do coletor de evento chamado LceSink. C#
public class LceSink : ServicedComponent, ILceMsg { public void EventMethod(string message) { MessageBox.Show(message, "Event sink"); } }

4.

Criar um editor de eventos para disparar o LCE. C#


protected void Fire_Click (object sender, System.EventArgs e) { ILceMsg evt = (ILceMsg) new LceClass(); evt.EventMethod("Hello events"); }

Exemplo C#
using System; using System.IO; using System.Reflection; using System.EnterpriseServices; using System.Runtime.InteropServices; [assembly: ApplicationName("EventDemo")] [assembly: ApplicationActivation(ActivationOption.Library)] [assembly: AssemblyKeyFile("EventDemoSvr.snk")] namespace EventDemo { public interface ILceMsg { void EventMethod(string message); } [EventClass] public class LceClass : ServicedComponent, ILceMsg { public void EventMethod(string message){} } public class LceSink : ServicedComponent, ILceMsg { public void EventMethod(string message) { MessageBox.Show(message, "Event sink"); } } }

Visual C# Consolidado

651

C#
//Publisher protected void Fire_Click (object sender, System.EventArgs e) { ILceMsg evt = (ILceMsg) new LceClass(); evt.EventMethod("Hello events"); }

Como Configurar a Construo de Objetos


O procedimento e exemplo a seguir descrevem como configurar construo de objeto e definir a seqncia de inicializao padro da classe TestObjectConstruct para a seqncia "Initial Catalog=Northwind;Data Source=.\\SQLServerInstance;Trusted_Connection=yes". Essa seqncia usada para conectar a um banco de dados SQL Server. O tpico Construo de objeto,. explica mais o uso do COM + construo de objeto a partir da System.EnterpriseServices.ServicedComponent classe Para configurar construo de objeto e definir a seqncia de inicializao padro para uma classe 1. Definir uma classe que deriva direta ou indiretamente a partir da System.EnterpriseServices.ServicedComponent classe. Por exemplo, o cdigo a seguir mostra uma classe TestObjectConstruct que deriva diretamente da classe System.EnterpriseServices.ServicedComponent. C#
using System; using System.EnterpriseServices; using System.Data; using System.Data.SqlClient; public class TestObjectConstruct : ServicedComponent { }

2.

Aplicar o ConstructionEnabled atributo para a classe e definir propriedade do atributo Default. Por exemplo, o cdigo a seguir se aplica o ConstructionEnabled atributo da TestObjectConstruct classe e define a Padro propriedade como a seqncia de conexo SQL Server. C#
[ConstructionEnabled(Default="Initial Catalog=Northwind;Data Source=.\\SQLServerInstance;Trusted_Connection=yes")] public class TestObjectConstruct : ServicedComponent { }

3.

Substituir o mtodo construir. Visual Basic


<ConstructionEnabled([Default] := "Initial Catalog=Northwind;Data Source=.\\SQLServerInstance;Trusted_Connection=yes")> _ Public Class TestObjectConstruct Inherits ServicedComponent Private m_connectStr As String Private conn as SqlConnection Protected Overrides Sub Construct(constructString As String) ' Called after constructor. m_connectStr = constructString End Sub Public Sub ConnectToDatabase() conn = New SqlConnection(m_connectStr) End Sub End Class [C#] [ConstructionEnabled(Default="Initial Catalog=Northwind;Data Source=.\\SQLServerInstance;Trusted_Connection=yes")] public class TestObjectConstruct : ServicedComponent { private string connectStr; SqlConnection conn; public TestObjectConstruct() { } protected override void Construct(string constructString) { // Called after constructor. connectStr = constructString; } public void ConnectToDatabase() { conn = new SqlConnection(connectStr); conn.Open(); } }

4.

No aplicativo do cliente, criar uma instncia da classe do componente sem especificar uma seqncia de construo, para que o padro usado. Por exemplo, o cdigo a seguir cria

Visual C# Consolidado

652

uma instncia da classe TestObjectConstruct, e a seqncia de construo padro ser "Initial Catalog=Northwind;Data Source=.\\SQLServerInstance;Trusted_Connection=yes". C#
public class App { public static void Main() { TestObjectConstruct order = new TestObjectConstruct(); order. ConnectToDatabase(); } }

Depois de instalar o aplicativo Servios componente, voc pode especificar seqncias de construo por meio da ferramenta administrativa Servios de componente. Para inserir uma seqncia de construo de objeto para um componente, execute as seguintes etapas: 1. 2. 3. Abra a ferramenta administrativa Servios de componente. Clique com boto direito na ferramenta administrativa Servios de componente, mouse no componente que voc deseja configurar, e, em seguida, clique em Properties. Se voc no tenha definido o atributo ConstructionEnabled para True, na caixa Properties de dilogo, na guia Activation, marque a Enable object construction caixa de seleo para ativar o uso da seqncia de caracteres de construo do objeto. Se voc desejar alterar a seqncia de construo do padro especificado com o atributo ConstructionEnabled, na caixa Constructor string, insira a seqncia de construo.

4.

Exemplo C#
using System; using System.EnterpriseServices; using System.Data; using System.Data.SqlClient; [assembly : ApplicationName("OCDemo")] namespace OCDemo { [ConstructionEnabled(Default="Initial Catalog=Northwind; Data Source=.\\SQLServerInstance;Trusted_Connection=yes")] public class TestObjectConstruct : ServicedComponent { private string connectStr; SqlConnection conn; public TestObjectConstruct() { } protected override void Construct(string constructString) { // Called after constructor. connectStr = constructString; } public void ConnectToDatabase() { conn = new SqlConnection(connectStr); conn.Open(); } } }

Como Obter Informaes de Tipo e Membros de um Assembly


O System.Reflection espao para nome contm vrios mtodos para obter informaes de um conjunto de mdulos (assembly). Esta seo demonstra um dos mtodos. Para obter informaes adicionais, consulte Viso geral de reflexo. O exemplo a seguir obtm informaes Tipo e membro de um conjunto. Exemplo C#
using System; using System.Reflection; class Asminfo1 { public static void Main(string[] args) { Console.WriteLine ("\nReflection.MemberInfo"); //Get the Type and MemberInfo. //Insert the fully qualified class name inside the quotation marks in the following statement. Type MyType =Type.GetType("System.IO.BinaryReader"); MemberInfo[] Mymemberinfoarray = MyType.GetMembers(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Static|BindingFlags.Insta nce|BindingFlags.DeclaredOnly); //Get and display the DeclaringType method. Console.Write("\nThere are {0} documentable members in ", Mymemberinfoarray.Length); Console.Write("{0}.", MyType.FullName); foreach (MemberInfo Mymemberinfo in Mymemberinfoarray) { Console.Write("\n" + Mymemberinfo.Name); } } }

Visual C# Consolidado

653

Como Criar um Assembly de Arquivo nico


Um conjunto de Arquivo nico, que o tipo mais simples do conjunto, contm informaes de tipo e implementao,, bem como o Manifesto do conjunto. Voc pode usar Compiladores de linha de comando ou Visual Studio 2005 Para criar um conjunto de Arquivo nico. Por padro, o compilador cria um arquivo de montagem com uma extenso.exe. Observao Para Visual Studio 2005 C# e Visual Basic pode ser usada somente para criar conjuntos de Arquivo nico. Se voc deseja criar vrios arquivos conjuntos, use Compiladores de linha de comando ou Visual Studio 2005 com as extenses Managed do C++.. ou Visual Studio 2005 Com o Managed Extensions para C++ Os procedimentos a seguir mostram como criar conjuntos de Arquivo nico usando Compiladores de linha de comando. Para criar um conjunto com uma extenso.exe

No prompt de comando, digite o seguinte comando: < compiler command> <module name> Neste comando, compiler command o comando do compilador para o idioma usado em seu mdulo de cdigo, e module name o nome do mdulo de cdigo para compilar para o conjunto.

O exemplo a seguir cria um conjunto chamado myCode.exe de um mdulo de cdigo chamado myCode. C#
csc myCode.cs

Visual Basic
vbc myCode.vb

Para criar um conjunto com uma extenso.exe e especificar o nome do arquivo de sada

No prompt de comando, digite o seguinte comando: < compiler command> /out:<file name> <module name> Neste comando, compiler command o comando do compilador para o idioma usado em seu mdulo de cdigo, file name o nome de arquivo de sada, e module name o nome do mdulo de cdigo para compilar para o conjunto.

O exemplo a seguir cria um conjunto chamado myAssembly.exe de um mdulo de cdigo chamado myCode. C#
csc /out:myAssembly.exe myCode.cs

Visual C# Consolidado

654

Visual Basic
vbc /out:myAssembly.exe myCode.vb

Criando conjuntos da biblioteca Um conjunto de biblioteca semelhante a uma biblioteca de classes. Ele contm tipos que sero referenciados por outros conjuntos, mas ele tem nenhum ponto de entrada para iniciar a execuo.

Para criar um conjunto de biblioteca

No prompt de comando, digite o seguinte comando: < compiler command> /t:library <module name> Neste comando, compiler command o comando do compilador para o idioma usado em seu mdulo de cdigo, e module name o nome do mdulo de cdigo para compilar para o conjunto. Voc pode usar outras opes do compilador, como a /out: opo.

O exemplo a seguir cria um conjunto de biblioteca chamado myCodeAssembly.dll de um mdulo de cdigo chamado myCode. C#
csc /out:myCodeLibrary.dll /t:library myCode.cs

Visual Basic
vbc /out:myCodeLibrary.dll /t:library myCode.vb

Como: Criar um domnio de aplicativo


Um host Runtime de idioma comum cria domnios aplicativos automaticamente quando eles so necessrios. No entanto, voc pode criar seus prprios domnios aplicativos e carreg-los esses conjuntos que voc deseja gerenciar pessoal. Voc tambm pode criar domnios de aplicativo do qual voc executar cdigo. Criar um novo domnio do aplicativo usando um dos mtodos sobrecarregados CreateDomain na classe System.AppDomain. Voc pode dar o domnio do aplicativo um nome e fazer referncia a ela com esse nome. O exemplo a seguir cria um novo domnio do aplicativo, atribui o nome MyDomain, e seguida, imprime o nome de domnio host e domnio de aplicativo filho recm-criado para o console. Exemplo C#
using System; using System.Reflection; class AppDomain1 { public static void Main() { Console.WriteLine("Creating new AppDomain."); AppDomain domain = AppDomain.CreateDomain("MyDomain"); Console.WriteLine("Host domain: " + AppDomain.CurrentDomain.FriendlyName); Console.WriteLine("child domain: " + domain.FriendlyName); }}

Visual C# Consolidado

655

Como determinar um conjunto o nome totalmente qualificado:


H vrias maneiras para descobrir o nome totalmente qualificado de um conjunto no cache de conjunto global:

Use o Ferramenta Configurao estrutura .NET (Mscorcfg.msc). Exibir o diretrio do cache de conjunto de mdulos global. Use o Global ferramenta cache assembly (Gacutil.exe).

Procedimentos

Para exibir os nomes de conjuntos totalmente qualificados no cache de conjunto global usando a ferramenta .NET Framework Configuration
1. 2. Clique no Start boto, aponte para Administrative Tools, e clique em Microsoft .NET Framework Configuration Clique em Manage the Assembly Cache e, clique em View List of Assemblies in the Assembly Cache.

Para obter informaes sobre como usar a ferramenta Global Assembly Cache para exibir os nomes de conjuntos, totalmente qualificados Consulte Como Visualizar o Contedo da Cache Global de Assemblies. Do Disassembler MSIL (Ildasm.exe) para conjuntos de mdulos (assemblies) que no esto no cache de conjunto global, voc pode usar cdigo para exibir as informaes para o console ou a uma varivel, ou voc pode usar para examinar metadados do conjunto, que contm o nome totalmente qualificado. Para obter mais informaes sobre como definir atributos do conjunto, como verso, cultura e nome do conjunto, consulte Definir atributos Assembly. Para obter mais informaes sobre dar um conjunto um nome de alta segurana, consulte Criando e usando assemblies de nome forte. Exemplo O exemplo de cdigo a seguir mostra como exibir o nome totalmente qualificado de um conjunto que contm uma classe especificada para o console. C#
using System; using System.Reflection; class asmname { public static void Main() { Type t = typeof(System.Data.DataSet); string s = t.Assembly.FullName.ToString(); Console.WriteLine("The fully qualified assembly name containing the specified class is {0}.", s); } } Imports System Imports System.Reflection Imports Microsoft.VisualBasic ' For a class not contained in mscorlib.dll, compile this code with ' the /r:<dllname> option; for example,compile the code below using: ' vbc asmname.vb /r:System.Data.dll /r:System.dll /r:System.Xml.dll ' If the class is contained in mscorlib.dll, the /r:<dllname> compiler option is unnecessary. Class asmname Public Shared Sub Main() Dim t As Type = GetType(System.Data.DataSet) Console.WriteLine("The fully qualified assembly name containing the specified class is {0}.", t.Assembly.FullName.ToString()) End Sub 'Main End Class 'asmname

Como Configurar um Domnio de Aplicativo

Visual C# Consolidado

656

Voc pode fornecer o Common Language Runtime com informaes de configurao para um novo domnio do aplicativo usando a AppDomainSetup classe. Ao criar seus prprios domnios de aplicativo, a propriedade mais importante ApplicationBase. As outras AppDomainSetup propriedades so usadas principalmente por hosts de tempo de execuo para configurar um domnio aplicativo especfico. A ApplicationBase propriedade Define o Diretrio de raiz do aplicativo. Quando o Runtime precisa atender uma requisio tipo, ele investiga para o conjunto que contm o tipo no diretrio especificado pela propriedade ApplicationBase. Observao Um novo domnio do aplicativo herdar apenas a ApplicationBase propriedade do criador. O exemplo a seguir cria uma instncia da classe AppDomainSetup, usa esta classe para criar um novo domnio do aplicativo, grava as informaes ao console, e depois descarrega o domnio do aplicativo. Exemplo C#
using System; using System.Reflection; class AppDomain4 { public static void Main() { // Create application domain setup information. AppDomainSetup domaininfo = new AppDomainSetup(); domaininfo.ApplicationBase = "f:\\work\\development\\latest"; // Create the application domain. AppDomain domain = AppDomain.CreateDomain("MyDomain", null, domaininfo); // Write application domain information to the console. Console.WriteLine("Host domain: " + AppDomain.CurrentDomain.FriendlyName); Console.WriteLine("child domain: " + domain.FriendlyName); Console.WriteLine("Application base is: " + domain.SetupInformation.ApplicationBase); // Unload the application domain. AppDomain.Unload(domain); } }

Como Visualizar o Contedo de um Assembly


Voc pode usar para exibir informaes linguagem intermediria (MSIL) Microsoft em um arquivo. o Disassembler MSIL (Ildasm.exe) Se o arquivo sendo examinado for um conjunto, essas informaes podem incluir atributos do conjunto,, bem como referncias a outros mdulos e conjuntos. Essas informaes podem ser til para determinar se um arquivo um conjunto ou parte de um conjunto, e se o arquivo possui referncias a outros mdulos ou conjuntos. Para exibir o contedo de um conjunto usando Ildasm.exe

Type ildasm <assembly name> at the command prompt. Por exemplo, o comando a seguir desmonta o Hello.exe conjunto.
ildasm Hello.exe

Para exibir informaes manifesto do conjunto

Clique duas vezes no cone MANIFEST na janela Disassembler MSIL.

Exemplo O exemplo a seguir inicia com " Um Hello, bsico " World programa. Depois compilar o programa, use Ildasm.exe para desmontar o conjunto Hello.exe e exibir o manifesto do conjunto.

Visual C# Consolidado

657

Visual Basic
Imports System Public Module modmain Sub Main() Console.WriteLine ("Hello World using Visual Basic!") End Sub End Module using System; class MainApp { public static void Main() { Console.WriteLine("Hello World using C#!"); } } #using <mscorlib.dll> using namespace System; void main() { Console::WriteLine(L"Hello World using Managed Extensions!"); }

Executando o ildasm.exe Comando no conjunto Hello.exe e duas vezes no cone MANIFEST na janela DASM IL produz o seguinte resultado:
.assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 1:0:2411:0 } .assembly Hello { // --- The following custom attribute is added automatically; do not uncomment. ------- // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(bool, // bool) = ( 01 00 00 01 00 00 ) .hash algorithm 0x00008004 .ver 0:0:0:0 } .module Hello.exe // MVID: {58AD9DFD-63A6462A-8AD5-42CBC95AA147} .subsystem 0x00000003 .file alignment 512 .corflags 0x00000001 // Image base: 0x03330000

A tabela a seguir descreve cada diretiva no conjunto do manifesto da montagem Hello.exe usado no exemplo. Diretiva .assembly extern <assembly name> Descrio Especifica outro conjunto que contm itens referenciados pelo mdulo atual (, neste exemplo, mscorlib).

.publickeytoken <token> Especifica o smbolo da chave real da montagem referenciada. .ver <version number> .assembly <assembly name> .hash algorithm <int32 value> .ver <version number> .module <file name> .subsystem <value> Especifica o nmero de verso da montagem referenciada. Especifica o nome do conjunto. Especifica o algoritmo hash usado. Especifica o nmero de verso do conjunto. Especifica o nome dos mdulos que compem o conjunto. Neste exemplo, o conjunto consiste em apenas um arquivo. Especifica o ambiente do aplicativo necessrio para o programa. Neste exemplo, o valor 3 indica que este executvel executado de um console. Atualmente um campo reservado nos metadados.

corflags

Um manifesto do conjunto pode conter um nmero de diretivas diferentes, dependendo do contedo do conjunto. Para obter uma lista abrangente das diretivas no manifesto do conjunto, consulte a documentao ECMA, especialmente " ii partio metadados: e semntica " definio e " partio III: CIL instruo Set ". A documentao est disponvel online em http://msdn.microsoft.com/net/ECMA/ e http://www.ECMAInternational.org/publications/Standards/ECMA-335.htm.

Como Referenciar um Assembly de Nome Forte

Visual C# Consolidado

658

O processo na referncia tipos ou recursos em um conjunto de nome seguro normalmente transparente. Voc pode fazer a referncia no tempo de compilao (antecipada ligao) ou em tempo de execuo. Uma referncia em tempo de compilao ocorre quando voc indicar o compilador para que seu conjunto faz referncia outro conjunto explicitamente. Quando voc usar em tempo de compilao referncia, automaticamente o compilador obtm a chave pblica do conjunto de nome seguro de destino e coloca-na referncia do conjunto da montagem sendo compilada. Observao Um conjunto de nome seguro s pode usar tipos de outros conjuntos de nome seguro. Caso contrrio a segurana do conjunto de nome seguro deve ser comprometida. Fazer uma referncia a um conjunto de nome seguro em tempo de compilao

No prompt de comando, digite o seguinte comando: < compiler command> /reference:<assembly name> Neste comando, compiler command o comando do compilador para o idioma que voc est usando e assembly name o nome do conjunto de nome seguro sendo referenciado. Voc pode usar outras opes do compilador, como a /t:library opo para criar um conjunto de biblioteca.

O exemplo a seguir cria um conjunto chamado myAssembly.dll que referncias um conjunto de nome seguro chamado myLibAssembly.dll a partir de um mdulo de cdigo chamado myAssembly.cs.
csc /t:library myAssembly.cs /reference:myLibAssembly.dll

Fazer uma referncia a um conjunto de nome seguro em tempo de execuo

Quando voc fazer uma referncia em tempo de execuo a um conjunto de nome seguro, por exemplo, usando voc deve usar o nome de exibio do conjunto de nome seguro referenciado. ou Assembly.GetType mtodos, o Assembly.Load A sintaxe de um nome de exibio a seguinte:

< assembly name>, <version number>, <culture>, <public key token> Por exemplo:
myDll, Version=1.1.0.0, Culture=en, PublicKeyToken=03689116d3a4ae33

Do PublicKeyToken, neste exemplo, a forma hexadecimal do smbolo de chave pblica. Se houver nenhum valor de cultura, use Culture=neutral. O exemplo de cdigo a seguir mostra como usar essas informaes com o Assembly.Load mtodo. C#
Assembly.Load("myDll,Version=1.0.0.1,Culture=neutral,PublicKeyToken=9b35aa32c18d4fb1");

Voc pode imprimir o formato hexadecimal da chave pblica e smbolo de chave pblica para um conjunto especfico usando o seguinte Ferramenta nome forte (SN.exe) Comando:

Visual C# Consolidado

659

sn -Tp <assembly> Se voc tiver um arquivo chave pblico, use o seguinte comando em vez disso (observe a diferena no caso com a opo de linha de comando):: (observe a diferena no caso com a opo de linha de comando) sn -tp <assembly>

Como: Descarregar um domnio de aplicativo


Quando voc tiver terminado usando um domnio de aplicativo, descarreg-lo usando o System.AppDomain.Unload mtodo. O Unload mtodo normalmente desliga o domnio do aplicativo especificado. Durante o processo descarregando, nenhum novo segmento pode acessar o domnio de aplicativo, e so liberadas estruturas dados especficos de domnio do aplicativo todos os. Conjuntos carregados no domnio de aplicativo so removidas e no esto mais disponveis. Se um conjunto no domnio do aplicativo domnio neutro-, dados para o conjunto permanece na memria at que o processo inteiro desligado. No h nenhum mecanismo para descarregar um conjunto-domnio neutro diferente desligar o processo inteiro. H situaes em que a solicitao para descarregar um domnio de aplicativo no funciona e resulta em um CannotUnloadAppDomainException.. um CannotUnloadAppDomainException O exemplo a seguir cria um novo domnio denominado MyDomain do aplicativo, imprime algumas informaes ao console, e depois descarrega o domnio do aplicativo. Observe que o cdigo tenta imprimir o nome amigvel do domnio do aplicativo descarregado para o console. Essa ao gera uma exceo que tratada pelas instrues try / catch no final do programa. Exemplo C#
using System; using System.Reflection; class AppDomain2 { public static void Main() { Console.WriteLine("Creating new AppDomain."); AppDomain domain = AppDomain.CreateDomain("MyDomain", null); Console.WriteLine("Host domain: " + AppDomain.CurrentDomain.FriendlyName); Console.WriteLine("child domain: " + domain.FriendlyName); AppDomain.Unload(domain); try { Console.WriteLine(); Console.WriteLine("Host domain: " + AppDomain.CurrentDomain.FriendlyName); // The following statement creates an exception because the domain no longer exists. Console.WriteLine("child domain: " + domain.FriendlyName); } catch (AppDomainUnloadedException e) { Console.WriteLine("The appdomain MyDomain does not exist."); } } }

Como Remover um Assembly de Cache Global de Assemblies


Do Ferramenta Assembly Cache global (Gacutil.exe) uso para remover um conjunto de cache de conjunto global. Para remover um conjunto de cache de conjunto global

No prompt de comando, digite o seguinte comando: gacutil u <assembly name> Neste comando, assembly name o nome da montagem para remover do cache de conjunto global.

O exemplo a seguir remove um conjunto chamado hello.dll do cache de conjunto global.

Visual C# Consolidado

660

gacutil -u hello

O SDK do .NET Framework tambm fornece uma extenso Shell do Windows chamado que voc pode usar para remover conjuntos de cache de conjunto global. o Visualizador cache do conjunto (Shfusion.dll),

Como Instalar um Assembly na Cache Global de Assemblies


Existem quatro maneiras para instalar um conjunto no cache de conjunto global:

Usando o Ferramenta Assembly Cache global (Gacutil.exe). Voc pode usar Gacutil.exe para adicionar conjuntos de nome seguro de cache de conjunto global e para exibir o contedo do cache de montagem global. Observao Gacutil.exe serve apenas para fins de desenvolvimento e no deve ser usado para instalar conjuntos de produo no cache de conjunto global.

Usando o Microsoft Windows Installer 2.0. Essa a maneira recomendada e mais comum para adicionar conjuntos de cache de conjunto global. O instalador fornece referncia Contagem de conjuntos no cache de conjunto global, e outros benefcios.

Usando uma extenso do shell do Windows fornecido pelo SDK do .NET Framework chamado o Visualizador cache do conjunto (Shfusion.dll). A extenso do shell permite que voc a arrastar conjuntos para cache de conjunto global. Usando o Ferramenta Configurao estrutura .NET (Mscorcfg.msc). O Ferramenta Configurao estrutura .NET (Mscorcfg.msc) permite que voc se exibir o cache de conjunto de mdulos global e adicionar novos conjuntos de no cache.

Para instalar um conjunto de nome seguro no cache de conjunto global usando a ferramenta Global Assembly Cache (Gacutil.exe)

No prompt de comando, digite o seguinte comando: gacutil I <assembly name> Neste comando, assembly name o nome da montagem para instalar em cache de conjunto global.

O exemplo a seguir instala um conjunto com o nome hello.dll de arquivo no cache de conjunto global.
gacutil -i hello.dll

Como Criar um Assembly de Mltiplos Arquivos


Esta seo descreve o procedimento utilizado para criar um conjunto de vrios arquivos e fornece um exemplo completo que ilustra cada uma das etapas no procedimento. Para criar um conjunto de vrios arquivos 1. Compilar todos os arquivos que contm espaos para nome referido por outros mdulos na montagem em mdulos de cdigo. A extenso padro para mdulos de cdigo

Visual C# Consolidado

661

.netmodule. Por exemplo, se criar um arquivo chamado Stringer espao para nome chamada myStringer que referenciado no arquivo Cdigo do cliente, Stringer deve ser compilado em um mdulo de cdigo primeiro. 2. 3. Compilar todos os outros mdulos, usando as opes do compilador necessrio para indicar os outros mdulos que so referenciados no cdigo. Do Vinculador do conjunto (AL.exe) uso para criar o arquivo de sada que contm o manifesto do conjunto. Esse arquivo contm informaes de referncia para todos os mdulos ou recursos que fazem parte do conjunto. Observao O Visual Studio 2005 IDE de C# e Visual Basic poder somente usar para criar conjuntos de Arquivo nico. Se voc desejar criar vrios arquivos conjuntos, deve usar os compiladores de linha de comando ou Visual Studio 2005 com Visual C++.. ou Visual Studio 2005 com Visual C++ O exemplo a seguir ilustra a etapa 1 do procedimento acima, por compilao arquivos com espaos para nome referido por outros arquivos. Este exemplo inicia com alguns cdigo simples para o Stringer arquivo. Espao para nome chamado myStringer com uma classe chamado StringerStringer. A Stringer classe contm um mtodo chamado StringerMethod que grava uma nica linha para o console. C#
// Assembly building example in the .NET Framework SDK. using System; namespace myStringer { public class Stringer { public void StringerMethod() { System.Console.WriteLine("This is a line from StringerMethod."); } } }

Use o seguinte comando para compilar este cdigo: Visual Basic


vbc /t:module Stringer.vb

C#
csc /t:module Stringer.cs

Especificando o module parmetro com a /t: opo de compilador indica que o arquivo deve ser compilado como um mdulo em vez de como um conjunto. O compilador produz um mdulo chamado Stringer.netmodule, que pode ser adicionado a um conjunto. Na Etapa dois do procedimento acima, voc deve compilar mdulos com referncias a outros mdulos. Essa etapa usa a /addmodule opo de compilador. No exemplo a seguir, um mdulo de cdigo chamado Client tem um mtodo ponto Main de entrada que referencia um mtodo no mdulo Stringer.dll criado na etapa 1. O exemplo a seguir mostra o cdigo para Client. C#
using System; using myStringer; //The namespace created in Stringer.netmodule. class MainClientApp { // Static method Main is the entry point method. public static void Main() { Stringer myStringInstance = new Stringer(); Console.WriteLine("Client code executes"); //myStringComp.Stringer(); myStringInstance.StringerMethod(); } }

Visual C# Consolidado

662

Use o seguinte comando para compilar este cdigo: Visual Basic


vbc /addmodule:Stringer.netmodule /t:module Client.vb

C#
csc /addmodule:Stringer.netmodule /t:module Client.cs

Especificar a /t:module opo porque este mdulo ir ser adicionado a uma montagem em uma etapa futura. Especificar a /addmodule opo porque o cdigo em Client Referncias criado pelo cdigo em Stringer.netmodule um espao para nome. O compilador produz um mdulo chamado Client.netmodule que contm uma referncia a outro mdulo, Stringer.netmodule. Observao O C# e Visual Basic compiladores suportam diretamente criao usando as seguintes sintaxes diferentes dois conjuntos de vrios arquivos.

Dois compilations criar um conjunto-dois arquivos: Visual Basic


vbc /t:module Stringer.vb vbc Client.vb /addmodule:Stringer.netmodule

C#
csc /t:module Stringer.cs csc Client.cs /addmodule:Stringer.netmodule

Uma compilao cria um conjunto-dois arquivos: Visual Basic


vbc /out:Stringer.netmodule Stringer.vb /out:Client.exe Client.vb

C#
csc /out:Client.exe Client.cs /out:Stringer.netmodule Stringer.cs

Do Vinculador do conjunto (AL.exe) voc pode usar para criar um conjunto de uma coleo de compilado mdulos de cdigo.

Para criar um conjunto de vrios arquivos usando o vinculador assembly

No prompt de comando, digite o seguinte comando: al <module name> <module name> /main:<method name> /out:<file name> /target:<assembly file type> Os module name argumentos neste comando, especifique o nome de cada mdulo para incluir no conjunto. A /main: opo especifica o nome do mtodo que ponto de entrada do conjunto. A /out: opo especifica o nome do arquivo de sada, que contm metadados do conjunto. A /target: opo especifica que o conjunto um arquivo executvel (.exe) do aplicativo Console, um arquivo executvel (.Win) do Windows, ou um arquivo biblioteca (.lib).

No exemplo a seguir, a Al.exe cria um conjunto que um aplicativo de console executvel chamado myAssembly.exe. O aplicativo consiste de dois mdulos chamados Client.netmodule e Stringer.netmodule. e o arquivo executvel chamado myAssembly.exe, que contm somente

Visual C# Consolidado

663

metadados conjunto O ponto de entrada do conjunto o Main mtodo na classe MainClientApp, que est localizado em Client.dll.
al Client.netmodule Stringer.netmodule /main:MainClientApp.Main /out:myAssembly.exe /target:exe

Do Disassembler MSIL (Ildasm.exe) voc pode usar para examinar o contedo de um conjunto ou determinar se um arquivo um conjunto ou um mdulo.

Como Carregar Assemblies em um Domnio de Aplicativo


No.NET Framework, existem vrias maneiras para carregar um conjunto em um domnio de aplicativo. Cada forma usa uma classe diferente. Voc pode usar os seguintes mtodos sobrecarregados para carregar um conjunto em um domnio de aplicativo:

A System.AppDomain classe contm vrios mtodos sobrecarregados Carga. Esses mtodos principalmente so usados para interoperabilidade com, embora eles podem ser usados para carregar qualquer conjunto na atual ou um novo domnio do aplicativo com xito. Tambm possvel carregar um conjunto usando os CreateInstance mtodos. A System.Reflection.Assembly classe contm dois mtodos sobrecarregados estticos, Carga e LoadFrom. Os dois mtodos variar pelo contexto de carga.

O exemplo seguinte carrega um conjunto no domnio de aplicativo atual e executa o conjunto. Para uma discusso completa sobre como obter informaes de um conjunto carregado, consulte Carregar dinamicamente e Usando tipos. Observao Na verso do .NET Framework 2.0 domnios do aplicativo possuem um contexto somente Reflection-. Conjuntos carregados neste contexto podem ser examinados mas no executado, permitindo exame de conjuntos que destino outras plataformas. Consulte Como Carregar Assemblies no Contexto Somente de Reflexo e ReflectionOnlyLoad. Exemplo C#
using System; using System.Reflection; public class Asmload0 { public static void Main () { // Use the file name to load the assembly into the current application domain. Assembly a = Assembly.LoadFrom("adname.exe"); //Get the type to use. Type myType = a.GetType("adname"); //Get the method to call. MethodInfo mymethod = myType.GetMethod("adnamemethod"); //Create an instance. Object obj = Activator.CreateInstance(myType); //Execute the adnamemethod method. mymethod.Invoke(obj,null); } }

COMO: Assinar uma Assembly com Nome Forte


H duas maneiras para assinar um conjunto com um nome de alta segurana:

Do Vinculador do conjunto (AL.exe) Usando fornecido pelo .NET Framework SDK.

Visual C# Consolidado

664

Usando atributos do conjunto para inserir as informaes de nome de alta segurana em seu cdigo. Voc pode usar ou AssemblyKeyFileAttribute a AssemblyKeyNameAttribute, dependendo da onde o arquivo de chave a ser usado est localizado.

Voc deve ter um par de chaves de criptografia para assinar um conjunto com um nome de alta segurana. Para obter mais informaes sobre como criar um par de chaves, consulte Como criar um par de chaves pblica / Private:. Para criar e assinar um conjunto com um nome de alta segurana usando o vinculador assembly

No prompt de comando, digite o seguinte comando: al /out:<assembly name> <module name> /keyfile:<file name> Neste comando, assembly name o nome da montagem para entrar com um nome de alta segurana, module name o nome do mdulo do cdigo usado para criar o conjunto, e file name o nome do recipiente ou arquivo que contm o par de chaves.

O exemplo a seguir assina o conjunto MyAssembly.dll com um nome de alta segurana usando o arquivo sgKey.snk de chave.
al /out:MyAssembly.dll MyModule.netmodule /keyfile:sgKey.snk

Para assinar um conjunto com um nome de alta segurana com atributos

Entre um mdulo de cdigo, adicione o AssemblyKeyFileAttribute ou o AssemblyKeyNameAttribute, especificando o nome do arquivo ou recipiente que contm o par de chaves para usar ao assinar o conjunto com um nome de alta segurana.

Do AssemblyKeyFileAttribute exemplo usa o seguinte cdigo com um arquivo de chave chamado sgKey.snk, localizado na pasta onde o conjunto compilado. Isso pressupe que o conjunto compilado usando o vbc.exe Compiladores de linha de comando e csc.exe. C#
[assembly:AssemblyKeyFileAttribute(@"sgKey.snk")]

Observao Em ambientes de desenvolvimento, como Visual Studio, o conjunto no pode ser compilado no diretrio do projeto. Por exemplo, algumas verses do Visual Studio Compilar projetos C# em um bin\Debug subdiretrio. Nesse caso, o caminho no exemplo de cdigo seria ".. \\ \\sgKey.snk ". No Visual Studio 2005 arquivo de chave no C# pode ser especificado nas configuraes do projeto. Voc tambm pode atrasar assinar um conjunto durante a compilao. Para obter mais informaes, consulte Atraso assinatura um conjunto. Ao assinar um conjunto com um nome de alta segurana, a Vinculador do conjunto (AL.exe) Aparncia da chave arquivos relativo para a pasta atual e para o diretrio de sada. Ao usar linha comando compiladores, basta copiar a chave para a pasta atual que contm seus mdulos de cdigo.

Como Visualizar o Contedo da Cache Global de Assemblies


Do Ferramenta Assembly Cache global (Gacutil.exe) uso para exibir o contedo do cache de montagem global.

Visual C# Consolidado

665

Para exibir uma lista das montagens no cache de conjunto global

No prompt de comando, digite o seguinte comando: l Gacutil

O SDK do .NET Framework tambm fornece uma extenso Shell do Windows chamado que voc pode usar para exibir o contedo do cache de conjunto global. o Visualizador cache do conjunto (Shfusion.dll),

Como Criar um par de chaves Public/Private


Para assinar um conjunto com um nome de alta segurana, voc deve ter um par de chaves pblica / particular Criptografia esse par de chaves pblica e privada usado durante a compilao para criar um conjunto de nome seguro. Voc pode criar um par de chaves usando o Ferramenta nome forte (SN.exe). Par de Chaves arquivos geralmente tm uma extenso.snk. Para criar um par de chaves

No prompt de comando, digite o seguinte comando: sn k <file name> Neste comando, file name o nome do arquivo de sada que contm o par de chaves.

O exemplo a seguir cria um par de chaves denominado sgKey.snk.


sn -k sgKey.snk

Se voc pretende atrasar a assinatura um conjunto e voc controlar o par de chaves toda (que improvvel fora cenrios de teste), voc pode usar o seguinte comandos para gerar um par de chaves e ento extrair a chave pblica em um arquivo separado. Primeiro, crie o par de chaves:
sn -k keypair.snk

Em seguida, extrair a chave pblica do par de chaves e copi-la para um arquivo separado:

sn -p keypair.snk public.snk

Assim que voc criar o par de chaves, voc deve colocar o arquivo em que ele pode localizar o nome de alta segurana assinatura ferramentas.

Ao assinar um conjunto com um nome de alta segurana, a Vinculador do conjunto (AL.exe) Aparncia da chave arquivos relativo para a pasta atual e para o diretrio de sada. Ao usar linha comando compiladores, basta copiar a chave para a pasta atual que contm seus mdulos de cdigo. Se voc estiver usando um IDE, tais como Visual Studio 2005, para assinar um conjunto com um nome de alta segurana, necessrio compreender onde o IDE procura o arquivo de chave. Por exemplo, Visual Basic 2005 procura pelo arquivo de chave no diretrio que contm a Soluo Visual Studio, enquanto o compilador C# procura o arquivo de chave no diretrio que contm o binrio. Coloque o arquivo de chave no diretrio do projeto adequado e defina o atributo de arquivo da seguinte maneira: Visual Basic
<Assembly: AssemblyKeyFileAttribute("key.snk")>

C#

Visual C# Consolidado

666

[assembly: AssemblyKeyFileAttribute(@"..\..\key.snk")]

Como Incorporar Bibliotecas de Tipo como Recursos Win32 em Aplicativos Baseados no .NET
Voc pode compactar uma biblioteca de tipos como um arquivo separado ou incorpor-lo como arquivo recurso Win32 dentro de um aplicativo baseado em .NET. O Microsoft Visual Basic 6.0 executado essa tarefa para voc automaticamente; no entanto, ao usar Microsoft Visual Basic 2005, voc deve incorporar sua biblioteca tipo manualmente. Para incorporar uma biblioteca de tipos como um recurso do Win32 em um aplicativo baseado em .NET 1. Compilar o aplicativo gerenciado como um arquivo de biblioteca. Por exemplo, para criar um conjunto para um aplicativo chamado MyApp, digite o seguinte comando no prompt de comando: Visual Basic
vbc /t:library MyApp.vb

C#
csc /t:library MyApp.cs

2.

Exportar um arquivo biblioteca tipo do seu conjunto usando o Tipo Exporter da biblioteca (TlbExp.exe). No prompt de comando, digite o seguinte comando:
tlbexp MyApp.dll /out:mytypelib.tlb

3.

Criar um script de recursos que contenha a instruo a seguir:


IDR_TYPELIB1 typelib "mytypelib.tlb"

Para este exemplo, o nome de arquivo script myresource.rc. 4. Compilar o script usando o Microsoft Windows Resource compiler (Rc.exe). No prompt de comando, digite o seguinte comando:
rc myresource.rc

Rc.exe produz ao myresource.res arquivo de recurso. 5. Compile o arquivo de origem novamente e especifique o arquivo de recurso. No prompt de comando, digite o seguinte comando: Visual Basic
vbc /t:library MyApp.vb /win32res:myresource.res

C#
csc /t:library MyApp.cs /win32res:myresource.res

Como Gerar Assemblies de Interoperabilidade Primrios Usando Tlbimp.exe


A maneira mais simples para produzir conjuntos de interoperabilidade primrias consiste em usar o Importador de Biblioteca de Tipos (TLBIMP.exe). Para gerar um conjunto de interoperabilidade primrio usando TLBIMP.exe

No prompt de comando, digite: tlbimp tlbfile /primary /keyfile:filename /out:assemblyname

Visual C# Consolidado

667

Neste comando, tlbfile o arquivo que contm a biblioteca de tipos COM, filename o nome do recipiente ou arquivo que contm o par de chaves e assemblyname o nome da montagem para entrar com um nome de alta segurana. Conjuntos de interoperabilidade primrias podem referenciar apenas outros conjuntos de interoperabilidade primrias. Se seu conjunto faz referncia tipos de uma biblioteca de tipos com de terceiros, voc dever obter um conjunto interoperacional primrio do editor antes voc pode gerar seu conjunto interoperacional primrio. Se voc for o editor, voc deve gerar um conjunto de interoperabilidade primrio para a biblioteca de tipos dependente antes de gerar conjunto de mdulos (assembly referncia o) de interoperabilidade primria. Primrio um conjunto interoperacional dependente com um nmero de verso que seja diferente da biblioteca de tipos original no localizvel quando instalado no diretrio atual. Voc deve registrar Principal conjunto interoperacional do dependente no Registro do Windows ou use a /reference Opo para ter certeza que localiza TLBIMP.exe a DLL dependente. Voc tambm poder dispor vrias verses de uma biblioteca de tipos. Para obter instrues, consulte Como Empacotar Vrias Verses de Bibliotecas de Tipos. Exemplo O exemplo a seguir importa a biblioteca LibUtil.tlb de tipos COM e assina o conjunto LibUtil.dll com um nome de alta segurana usando o arquivo CompanyA.snk de chave. Omitindo um nome de espao para nome especfico, este exemplo produz o espao para nome LibUtil padro.
tlbimp LibUtil.tlb /primary /keyfile:CompanyA.snk /out:LibUtil.dll

Para um nome mais descritivo). (usando, o exemplo a seguir substitui o nome de arquivo do conjunto padro e nome namespace nomeao diretriz. LibraryName o VendorName
tlbimp LibUtil.tlb /primary /keyfile:CompanyA.snk /namespace:CompanyA.LibUtil /out:CompanyA.LibUtil.dll

O exemplo a seguir importa MyLib.tlb, quais referncias CompanyA.LibUtil.dll, e assina o conjunto CompanyB.MyLib.dll com um nome de alta segurana usando o arquivo CompanyB.snk de chave. Espao para nome, CompanyB.MyLib,. substitui o nome de espao para nome padro
tlbimp MyLib.tlb /primary /keyfile:CompanyB.snk /namespace:CompanyB.MyLib /reference:CompanyA.LibUtil.dll /out:CompanyB.MyLib.dll

Como Criar Assemblies de Interoperabilidade Primrios Manualmente


Uma abordagem menos usada para produzir uma biblioteca de tipos envolve criar um conjunto de interoperabilidade primrio manualmente no cdigo fonte, usando uma linguagem que compatvel com o COM comum especificao (cls), como C# idioma. Essa abordagem til quando uma biblioteca de tipos no est disponvel. Para gerar um conjunto interoperacional primrio no cdigo fonte 1. Crie um conjunto de interoperabilidade no cdigo fonte. Para obter instrues, consulte Criando um wrapper manualmente. Observao Se voc deve incluir todos os tipos COM da biblioteca Tipo original quando voc cria um conjunto de interoperabilidade primrio manualmente. No nvel do conjunto, aplicar os seguintes atributos:

2.

Visual C# Consolidado

668

1.

ou AssemblyKeyFileAttributeAssemblyKeyNameAttribute, para especificar o nome do arquivo ou recipiente que contm o par de chaves para usar ao assinar o conjunto com um nome de alta segurana. GuidAttribute Para especificar o identificador de biblioteca (LIBID) da biblioteca de tipos de destino. PrimaryInteropAssemblyAttribute Para identificar o conjunto como um conjunto interoperacional primrio. Observao Voc tambm pode atrasar assinar um conjunto durante a compilao. Para obter mais informaes, consulte Atraso assinatura um conjunto.

2. 3.

3.

O exemplo de cdigo a seguir aplica chamado CompanyA.snk com um arquivo de chave e especifica que este conjunto de mdulos (assembly) um conjunto de interoperabilidade primrio suporte verses de biblioteca tipo 4.2 e 5.2. o AssemblyKeyFileAttribute Como mostra o exemplo, voc pode dispor mais de uma verso de uma biblioteca tipo Aplicando atributos adicionais conjunto-nvel.

C#
[assembly:AssemblyKeyFile(@"..\..\CompanyA.snk")] [assembly:Guid("97d25db0-0363-1cf-abc4-02608 c9e7553"] [assembly:PrimaryInteropAssembly(4, 2)] [assembly:PrimaryInteropAssembly(5, 2)]

Como Gerar Assemblies de Interoperabilidade a partir de Bibliotecas de Tipo


O Importador da biblioteca Tipo (TLBIMP.exe) uma ferramenta de linha de comando que converte o coclasses e interfaces contidos em uma biblioteca de tipos com aos metadados. Essa ferramenta cria um conjunto interoperacional e espao para nome para as informaes tipo automaticamente. Depois os metadados de uma classe estiver disponvel, clientes gerenciados podem criar instncias do tipo COM e chamar seus mtodos, apenas como se fosse uma instncia .NET. TLBIMP.exe converte uma biblioteca inteira tipo aos metadados de uma vez e no pode gerar informaes sobre tipo de um subconjunto dos tipos definidas em uma biblioteca de tipos. Para gerar um conjunto de interoperabilidade de uma biblioteca de tipos

Use o seguinte comando: TLBIMP < type-library-file> Adicionando a /out: opo produz um conjunto de interoperabilidade com um nome alterada, como LOANLib.dll. Alterar o nome Conjunto interoperacional pode ajudar a distingui-lo da DLL com original e evitar problemas que podem ocorrer tenham nomes duplicados.

Exemplo O seguinte comando produz o conjunto Loanlib.DLL no espao para nome Loanlib.
tlbimp Loanlib.dll

O seguinte comando produz um conjunto de interoperabilidade com um nome alterada (LOANLib.dll).


tlbimp LoanLib.dll /out: LOANLib.dll

Visual C# Consolidado

669

Como Gerar Eventos Manipulados por um Coletor COM


Se voc estiver familiarizado com o modelo baseado em delegate-evento fornecido pelo .NET Framework, no Consulte Manipulando e disparando eventos. Para obter detalhes especficos que se aplicam a este tpico, consulte Disparar um evento na mesma seo. O.NET Framework fornece um sistema baseado em delegate-evento para conectar-se um remetente de evento (origem) a um destinatrio de evento (PIA). Quando o coletor um cliente COM, a origem deve incluir elementos para simular pontos de conexo adicionais. Com essas modificaes, um cliente COM pode registrar sua interface do coletor de eventos no modo tradicional chamando o IConnectionPoint::Advise mtodo. (Visual Basic oculta detalhes ponto de conexo, para que no faa precise chamar esses mtodos diretamente.) Para interoperar com um coletor de eventos com 1. Definir a interface do coletor de eventos no cdigo gerenciado. Esta interface pode conter um subconjunto dos eventos sourced por uma classe gerenciado. Os nomes mtodo da interface deve ser a mesma os nomes de eventos. Do ComSourceInterfacesAttribute aplicar se conectar a interface do coletor de eventos a classe gerenciada. Exportar o conjunto que contm a classe para uma biblioteca de tipos. Use API equivalente ou Tipo Exporter da biblioteca (TlbExp.exe) um para exportar o conjunto. Implementar a interface do coletor de eventos em COM. Para clientes com que coletar eventos, implementar a interface do coletor de eventos definido pela fonte de eventos na sua biblioteca de tipos. Usar o mecanismo ponto de conexo para conectar-se a interface do coletor fonte de eventos.

2. 3. 4. 5.

Exemplo O exemplo a seguir mostra um servidor gerenciado como a origem de eventos e um cliente COM como o coletor de eventos. O servidor gerenciado declara ButtonEvents como uma interface do coletor de eventos e se conecta a interface a Button classe. O cliente no gerenciado cria uma instncia da classe Button e implementa a interface do coletor de eventos. Visual Basic
' Managed server (event source) Option Explicit Option Strict Imports System Imports System.Runtime.InteropServices Namespace EventSource Public Delegate Sub ClickDelegate(x As Integer, y As Integer) Public Delegate Sub ResizeDelegate() Public Delegate Sub PulseDelegate() ' Step 1: Defines an event sink interface (ButtonEvents) to be ' implemented by the COM sink. <GuidAttribute("1A585C4D-337148dc-AF8A-AFFECC1B0967"), _ InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)> _ Public Interface ButtonEvents Sub Click(x As Integer, y As Integer) Sub Resize() Sub Pulse() End Interface ' Step 2: Connects the event sink interface to a class ' by passing the namespace and event sink interface ' ("EventSource.ButtonEvents, EventSrc"). <ComSourceInterfaces(GetType(ButtonEvents))> _ Public Class Button Public Event Click As ClickDelegate Public Event Resize As ResizeDelegate Public Event Pulse As PulseDelegate Public Sub CauseClickEvent(x As Integer, y As Integer) RaiseEvent Click(x, y) End Sub Public Sub CauseResizeEvent() RaiseEvent Resize() End Sub Public Sub CausePulse() RaiseEvent Pulse() End Sub End Class End Namespace using System; using System.Runtime.InteropServices; namespace EventSource { public delegate void ClickDelegate(int x, int y); public delegate void ResizeDelegate(); public delegate void PulseDelegate(); // Step 1: Defines an event sink interface (ButtonEvents) to be // implemented by the COM sink. [GuidAttribute("1A585C4D-3371-48dc-AF8A-AFFECC1B0967") ]

Visual C# Consolidado

670

[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)] public interface ButtonEvents { void Click(int x, int y); void Resize(); void Pulse(); } // Step 2: Connects the event sink interface to a class // by passing the namespace and event sink interface // ("EventSource.ButtonEvents, EventSrc"). [ComSourceInterfaces(GetType(ButtonEvents))] public class Button { public event ClickDelegate Click; public event ResizeDelegate Resize; public event PulseDelegate Pulse; public Button() { } public void CauseClickEvent(int x, int y) { Click(x, y); } public void CauseResizeEvent() { Resize(); } public void CausePulse() { Pulse(); } } } ' COM client (event sink) ' This Visual Basic 6.0 client creates an instance of the Button class and ' implements the event sink interface. The WithEvents directive ' registers the sink interface pointer with the source. Public WithEvents myButton As Button Private Sub Class_Initialize() Dim o As Object Set o = New Button Set myButton = o End Sub ' Events and methods are matched by name and signature. Private Sub myButton_Click(ByVal x As Long, ByVal y As Long) MsgBox "Click event" End Sub Private Sub myButton_Resize() MsgBox "Resize event" End Sub Private Sub myButton_Pulse() End Sub

Como Personalizar Wrappers Invocveis em Tempo de Execuo


H duas maneiras para personalizar um wrapper Callable Runtime (RCW). Se voc pode modificar a fonte interface Definition Language (IDL), voc pode aplicar atributos de arquivo (tlb) de biblioteca Tipo e importar a biblioteca de tipos Como alternativa, voc pode aplicar atributos especficos interop-a tipos importados e gerar um novo conjunto. Suporte para personalizar RCWs padro limitado por esses atributos. Para modificar a fonte IDL 1. Se aplicam atributos TLB a bibliotecas, tipos, membros, e parmetros. Use a custom palavra-chave e um valor de atributo para alterar metadados. Aplicando atributos TLB, voc pode: Especifique o nome de um tipo COM importados, em vez de permitir que o Utilitrio de Importao para selecionar o nome de acordo com regras converso padro gerenciado. Definir um espao para nome de destino para os tipos em uma biblioteca com explicitamente. Compilar o cdigo fonte IDL. Gerar um conjunto do arquivo resultante de biblioteca tipo ou de um arquivo de biblioteca de vnculo dinmico (DLL) que contm o tipo que pretende implementar. Importe o arquivo de biblioteca tipo. Do Importador da biblioteca Tipo (TLBIMP.exe) uso para gerar um conjunto DLL. Criar um arquivo de texto do conjunto importado usando o Disassembler MSIL (Ildasm.exe). Aplicar Atributos de interoperabilidade ao arquivo de texto. Gerar um novo conjunto do arquivo de texto modificada usando o Assembler MSIL (Ilasm.exe).

o o

2. 3.

Para modificar um conjunto importados 1. 2. 3. 4.

Como Configurar Componentes Baseado em .NET para Habilitar Livre Registro


Ativao livre registro-para componentes baseado em .NET apenas um pouco mais complicado que ele para componentes COM. A instalao requer dois manifestos:

Aplicativos COM devem ter um manifesto de aplicativo estilo Win32-para identificar o componente gerenciado.

Visual C# Consolidado

671

Componentes baseado em .NET devem ter um manifesto componente para ativao informaes necessrias em tempo de execuo.

Este tpico descreve como associar um manifesto de aplicativo a um aplicativo; associar um manifesto componente a um componente; e incorporar um manifesto componente em um conjunto. Para criar um manifesto de aplicativo 1. 2. Usando um editor XML, criar (ou modificar) manifesto de aplicativo pertencentes ao aplicativo do COM que interoperar com um ou mais componentes gerenciados. Insira o cabealho padro a seguir no incio do arquivo:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemasmicrosoft-com:asm.v1" manifestVersion="1.0">

Para informaes sobre elementos manifesto e seus atributos, procure por " Reference Manifests Application " na Biblioteca do MSDN. 3. Identificar o proprietrio do manifesto. No exemplo a seguir, myComApp Verso 1 possui o arquivo de manifesto.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemasmicrosoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type="win32" name="myOrganization.myDivision.myComApp" version="1.0.0.0" processorArchitecture="x86" />

4.

Identificar conjuntos de mdulos (assemblies) dependentes. No exemplo a seguir,


myComApp depende da myManagedComp. <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemasmicrosoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type="win32" name="myOrganization.myDivision.myComApp" version="1.0.0.0" processorArchitecture="x86" publicKeyToken="8275b28176rcbbef" /> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="myOrganization.myDivision.myManagedComp" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="8275b28176rcbbef" language="*" /> </dependentAssembly> </dependency> </assembly>

5.

Salvar e nomear o arquivo de manifesto. O nome de um manifesto de aplicativo o nome do conjunto executvel seguido pela extenso.manifest. Por exemplo, o nome arquivo manifesto do aplicativo para myComApp.exe myComApp.exe.manifest

Voc pode instalar um manifesto de aplicativo no mesmo diretrio como o aplicativo COM. Como alternativa, voc pode adicion-lo como um recurso para arquivo.exe do aplicativo. Para obter mais informaes, procure por " conjuntos lado a lado na Biblioteca do MSDN ".

Para criar um manifesto componente


1. 2. Usando um editor XML, criar um manifesto componente para descrever o conjunto gerenciado. Insira o cabealho padro a seguir no incio do arquivo:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemasmicrosoft-com:asm.v1" manifestVersion="1.0">

3.

Identificar o proprietrio do arquivo. O <assemblyIdentity> elemento do elemento <dependentAssembly> no arquivo de manifesto de aplicativo deve corresponder ao nome

Visual C# Consolidado

672

no manifesto do componente. No exemplo a seguir, myManagedComp Verso 1.2.3.4 possui o arquivo de manifesto.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemasmicrosoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity name="myOrganization.myDivision.myManagedComp" version="1.2.3.4" /> publicKeyToken="8275b28176rcbbef"

4.

Identificar cada classe no conjunto. Use o <clrClass> elemento para identificar exclusivamente cada classe no conjunto de mdulos (assembly) gerenciado. O elemento, que um subelemento do elemento <assembly> tem dos atributos descritos na tabela a seguir. Descrio O identificador que especifica a classe para ser ativado. Seqncia que informe ao usurio sobre o componente. Uma seqncia vazia o padro. Uma seqncia de caracteres que representa a classe gerenciada. O identificador a ser usado para ativao vinculados as. Required Sim No Sim No No No

Atributo Clsid description name ProgID

threadingModel O modelo de segmentao com. "Both" o valor padro. runtimeVersion Este atributo ignorado. Se o Runtime no est carregado, a verso mais recente ser carregada antes da classe ativado. Caso contrrio, a verso atualmente carregado usada.

tlbid 5.

O identificador da biblioteca de tipos que contm informaes sobre No a classe tipo. Todas as marcas de atributo diferenciam maisculas de minsculas. Voc pode obter CLSIDs, ProgIDs, segmentao modelos, e a verso de tempo de execuo, exibindo a biblioteca de tipos exportada para o conjunto com o ObjectViewer OLE / com (Oleview.exe). O manifesto componente a seguir identifica uma classe nica com dois mtodos.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemasmicrosoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity name="myOrganization.myDivision.myManagedComp" version="1.2.3.4" /> publicKeyToken="8275b28176rcbbef" <clrClass clsid="{65722BE6-3449-4628-ABD374B6864F9739}" progid="myManagedComp.testClass1" threadingModel="Both" name="myManagedComp.testClass1" runtimeVersion="v1.0.3705"> </clrClass> <clrClass clsid="{367221D6-3559-3328-ABD3-45B6825F9732}" progid="myManagedComp.testClass2" threadingModel="Both" name="myManagedComp.testClass2" runtimeVersion="v1.0.3705"> </clrClass> <file name="MyManagedComp.dll"> </file> </assembly>

6.
7.

8.

Salvar e nomear o arquivo de manifesto. O nome do componente um manifesto o nome da biblioteca do conjunto seguida pela extenso.manifest. Por exemplo, o myManagedComp.dll myManagedComp.manifest.

Voc deve incorporar o manifesto componente como um recurso no conjunto.

Para incorporar um manifesto componente em um conjunto gerenciado


1. Criar um script de recursos que contenha a instruo a seguir:

Visual C# Consolidado

673

RT_MANIFEST 1 myManagedComp.manifest

Nesta instruo myManagedComp.manifest o nome do manifesto componente sendo incorporado. Para este exemplo, o nome de arquivo script myresource.rc. 2. Compilar o script usando o Microsoft Windows Resource compiler (Rc.exe). No prompt de comando, digite o seguinte comando:
rc myresource.rc

Rc.exe produz ao myresource.res arquivo de recurso. 3. Compilar arquivo de origem do conjunto novamente e especifique o arquivo de recurso usando a /win32res opo:
/win32res:myresource.res

Novamente, myresource.res o nome do arquivo de recurso contendo recurso incorporado.

Como Implementar Funes CallBack


O procedimento e exemplo a seguir demonstram como um aplicativo gerenciado, usando plataforma chamar, pode imprimir o valor o identificador de cada janela para o computador local. Especificamente, o procedimento e exemplo use a EnumWindows funo a que o guiar pela lista de janelas e uma funo de retorno de chamada gerenciado (denominada CallBack) para imprimir o valor do identificador de janela. Para implementar uma funo de retorno de chamada 1. Examine a assinatura para a EnumWindows funo antes passar mais com a implementao. Possui EnumWindows a assinatura a seguir:
BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)

Uma pista que essa funo requer um retorno de chamada a presena do argumento lpEnumFunc. comum para ver o lp prefixo (ponteiro longo) combinado com o Func sufixo do nome do argumentos que se um ponteiro para uma funo de retorno de chamada. Para obter documentao sobre funes Win32, consulte Microsoft Platform SDK. 2. Crie a funo de retorno de chamada gerenciado. O exemplo declara um tipo delegate, que utiliza dois argumentos chamado CallBack, (hwnd e lparam.) O primeiro argumento um identificador para a janela; o segundo argumento definido pelo aplicativo. Nesta verso, ambos os argumentos devem ser inteiros. Funes de retorno de chamada geralmente retornam valores diferentes de zero para indicar xito e zero para indicar falha. Este exemplo explicitamente define o valor de retorno para true para continuar a enumerao. 3. Criar um representante e transfira-como um argumento para a EnumWindows funo. Chamar plataforma converte o representante em um formato de retorno de chamada familiarizado automaticamente. Verifique o coletor de lixo que no no recuperou o representante antes a funo de retorno de chamada conclua seu trabalho. Quando voc passar um representante como um parmetro, ou passar um representante contido como um campo em uma estrutura, ela permanece uncollected para a durao da chamada. Portanto, como o caso no seguinte exemplo de enumerao, a funo de retorno de chamada completa seu trabalho antes da chamada retorna e no requer nenhuma ao adicional pelo chamador gerenciado. Se, no entanto, a funo de retorno de chamada pode ser chamada depois retorna a chamada, o chamador gerenciado dever executar etapas para garantir que o representante permanece uncollected at terminar a funo de retorno de chamada. Para

4.

Visual C# Consolidado

674

obter informaes detalhadas sobre como evitar coleta de lixo, consulte Interoperabilidade Marshaling COM Invoke Platform. Exemplo C#
using System; using System.Runtime.InteropServices; public delegate bool CallBack(int hwnd, int lParam); public class EnumReportApp { [DllImport("user32")] public static extern int EnumWindows(CallBack x, int y); public static void Main() { CallBack myCallBack = new CallBack(EnumReportApp.Report); EnumWindows(myCallBack, 0); } public static bool Report(int hwnd, int lParam) { Console.Write("Window handle is "); Console.WriteLine(hwnd); return true; } }

Como: Mapear HRESULTs e excees


Mtodos com Relatar Erros, retornando HRESULTs; Mtodos .NET relat-los por organizando excees. Tempo de Execuo trata a transio entre os dois. Cada classe de exceo no .NET Framework mapeia para um HRESULT. Classes de exceo definida pelo usurio podem especificar qualquer HRESULT apropriado. Essas classes de exceo dinamicamente podem alterar o HRESULT a ser retornado quando a exceo gerada, definindo o HResult campo no objeto de exceo. Informaes adicionais sobre a exceo fornecidas para o cliente por meio da IErrorInfo interface, que implementado no objeto .NET durante o processo no gerenciado. Se voc criar uma classe que estende System.Exception, deve definir o campo HRESULT durante construo. Caso contrrio, a classe base atribui o valor HRESULT. Voc pode mapear novas classes de exceo para um HRESULT existente, fornecendo o valor no construtor a exceo . Observe que o Runtime s vezes ignorar uma HRESULT casos em onde h um IErrorInfo presente no segmento. Este comportamento pode ocorrer em casos onde. e HRESULT o IErrorInfo no representam o mesmo erro Para criar uma nova classe de exceo e mape-lo para um HRESULT

Use o seguinte cdigo para criar uma nova classe de exceo chamado NoAccessException e mape-lo para o HRESULT E_ACCESSDENIED. C++
Class NoAccessException : public ApplicationException { NoAccessException () { HResult = E_ACCESSDENIED; } } CMyClass::MethodThatThrows { throw new NoAccessException(); }

Voc pode encontrar um programa (em qualquer linguagem de programao) que usa um cdigo tanto gerenciados e no gerenciados ao mesmo tempo. Por exemplo, o empacotador personalizado no exemplo de cdigo a seguir usa o Marshal.ThrowExceptionForHR(int HResult) mtodo para acionar uma exceo com um valor HRESULT especfico. O mtodo procura o HRESULT e gera o tipo de exceo apropriado. Por exemplo, o HRESULT no fragmento de cdigo a seguir gera ArgumentException. C++
CMyClass::MethodThatThrows { Marshal.ThrowExceptionForHR(COR_E_ARGUMENT); }

A tabela a seguir fornece o mapeamento completo de cada HRESULT sua classe de exceo comparvel no .NET Framework.

Visual C# Consolidado

675

HRESULT MSEE_E_APPDOMAINUNLOADED COR_E_APPLICATION COR_E_ARGUMENT ou E_INVALIDARG COR_E_ARGUMENTOUTOFRANGE COR_E_ARITHMETIC ou ERROR_ARITHMETIC_OVERFLOW COR_E_ARRAYTYPEMISMATCH COR_E_BADIMAGEFORMAT ou ERROR_BAD_FORMAT COR_E_COMEMULATE_ERROR COR_E_CONTEXTMARSHAL COR_E_CORE NTE_FAIL COR_E_DIRECTORYNOTFOUND ou ERROR_PATH_NOT_FOUND COR_E_DIVIDEBYZERO COR_E_DUPLICATEWAITOBJECT COR_E_ENDOFSTREAM COR_E_TYPELOAD COR_E_EXCEPTION COR_E_EXECUTIONENGINE COR_E_FIELDACCESS COR_E_FILENOTFOUND ou ERROR_FILE_NOT_FOUND COR_E_FORMAT COR_E_INDEXOUTOFRANGE COR_E_INVALIDCAST ou E_NOINTERFACE COR_E_INVALIDCOMOBJECT COR_E_INVALIDFILTERCRITERIA COR_E_INVALIDOLEVARIANTTYPE COR_E_INVALIDOPERATION COR_E_IO COR_E_MEMBERACCESS COR_E_METHODACCESS

Exceo .NET AppDomainUnloadedException ApplicationException ArgumentException ArgumentOutOfRangeException ArithmeticException ArrayTypeMismatchException BadImageFormatException COMEmulateException ContextMarshalException CoreException CryptographicException DirectoryNotFoundException DivideByZeroException DuplicateWaitObjectException EndOfStreamException EntryPointNotFoundException Exceo ExecutionEngineException FieldAccessException FileNotFoundException FormatException IndexOutOfRangeException InvalidCastException InvalidComObjectException InvalidFilterCriteriaException InvalidOleVariantTypeException InvalidOperationException IOException AccessException MethodAccessException

Visual C# Consolidado

676

COR_E_MISSINGFIELD COR_E_MISSINGMANIFESTRESOURCE COR_E_MISSINGMEMBER COR_E_MISSINGMETHOD COR_E_MULTICASTNOTSUPPORTED COR_E_NOTFINITENUMBER E_NOTIMPL COR_E_NOTSUPPORTED OrE_POINTER COR_E_NULLREFERENCE COR_E_OUTOFMEMORY ou E_OUTOFMEMORY COR_E_OVERFLOW COR_E_PATHTOOLONG ou ERROR_FILENAME_EXCED_RANGE COR_E_RANK COR_E_REFLECTIONTYPELOAD COR_E_REMOTING COR_E_SAFEARRAYTYPEMISMATCH COR_E_SECURITY COR_E_SERIALIZATION OrERROR_STACK_OVERFLOW COR_E_STACKOVERFLOW COR_E_SYNCHRONIZATIONLOCK COR_E_SYSTEM COR_E_TARGET COR_E_TARGETINVOCATION COR_E_TARGETPARAMCOUNT COR_E_THREADABORTED COR_E_THREADINTERRUPTED COR_E_THREADSTATE COR_E_THREADSTOP COR_E_TYPELOAD COR_E_TYPEINITIALIZATION COR_E_VERIFICATION COR_E_WEAKREFERENCE

MissingFieldException MissingManifestResourceException MissingMemberException MissingMethodException MulticastNotSupportedException NotFiniteNumberException NotImplementedException NotSupportedException NullReferenceException OutOfMemoryException OverflowException PathTooLongException RankException ReflectionTypeLoadException RemotingException SafeArrayTypeMismatchException SecurityException SerializationException StackOverflowException SynchronizationLockException SystemException TargetException TargetInvocationException TargetParameterCountException ThreadAbortException ThreadInterruptedException ThreadStateException ThreadStopException TypeLoadException TypeInitializationException VerificationException WeakReferenceException

Visual C# Consolidado

677

COR_E_VTABLECALLSNOTSUPPORTED Todos os outros HRESULTs

VTableCallsNotSupportedException COMException

Para recuperar informaes de erro estendidas, o cliente gerenciado deve examinar os campos do objeto de exceo que foi gerado. Para o objeto de exceo para fornecer informaes teis sobre um erro, o objeto COM deve implementa a IErrorInfo interface. Tempo de Execuo utiliza as informaes fornecidas por IErrorInfo para inicializar o objeto de exceo. Se o objeto COM no oferece suporte IErrorInfo, o Runtime Inicializa um objeto de exceo com valores padro. A tabela a seguir lista cada campo associado a um objeto de exceo e identifica a fonte de informaes padro quando o objeto com oferece suporte IErrorInfo. Observe que o Runtime s vezes ignorar uma HRESULT casos em onde h um IErrorInfo presente no segmento. Este comportamento pode ocorrer em casos onde. e HRESULT o IErrorInfo no representam o mesmo erro Campo Exceo ErrorCode HelpLink Fonte de informaes de com HRESULT retornado da chamada. Se IErrorInfo->HelpContext diferente de zero, a seqncia formada pelas concatenao IErrorInfo->GetHelpFile e " # ". e IErrorInfo>GetHelpContext Caso contrrio a seqncia retornada de IErrorInfo>GetHelpFile. Sempre uma referncia nula (Nothing no Visual Basic.) Seqncia de caracteres retornada de IErrorInfo->GetDescription. Seqncia de caracteres retornada de IErrorInfo->GetSource. O rastreamento da pilha. O nome do mtodo que retornados a falha HRESULT.

InnerException Message (Mensagem) Origem StackTrace TargetSite

Campos exceo, como Message, Source a StackOverflowException., e StackTrace no esto disponveis para

Como Editar Assemblies de Interoperabilidade


O Importador da biblioteca Tipo (TLBIMP.exe) converte assinaturas mtodo com a maioria em assinaturas gerenciadas. No entanto, vrios tipos requer informaes adicionais que voc pode especificar, editando o conjunto de interoperabilidade. Este tpico descreve como editar um conjunto de interoperabilidade. O Empacotamento alteraes tpico identifica vrios casos que exigem que voc para editar o conjunto de interoperabilidade e descreve as alteraes necessrias. Para especificar empacotamento alteraes no Microsoft intermedirios idioma (MSIL) 1. Gerar conjunto interoperacional inicial usando TLBIMP.exe. Por exemplo, para produzir um conjunto chamado New.dll de New. TLB, digite o seguinte comando no prompt de comando:
tlbimp New.tlb /out:New.dll

2.

No prompt de comando, digite o seguinte comando para produzir MSIL para o conjunto:
ildasm New.dll /out:new.il

Visual C# Consolidado

678

3. 4.

Editar o MSIL conforme necessrio. No prompt de comando, digite o seguinte comando para produzir a sintaxe apropriada definindo um novo New.dll:
ilasm New.il /dll

Como Adicionar Referncias a Bibliotecas de Tipo


Gera Visual Studio 2005 um conjunto interoperacional que contm metadados quando voc adiciona uma referncia a uma biblioteca de tipos determinado. Se um conjunto interoperacional primrio estiver disponvel, Visual Studio usar o conjunto existente antes de gerar um novo conjunto de interoperabilidade. Para adicionar uma referncia a uma biblioteca de tipos 1. 2. 3. 4. 5. Instale o arquivo exe ou dll com em seu computador, a menos que um instalar.exe do Windows executa a instalao para voc. No menu Project, selecione References. Selecione a COM guia. Selecionar a biblioteca de tipos na lista Available References, ou procure o arquivo TLB. Clique em OK.

Como Manipular Eventos Gerados por uma Fonte COM


Se voc estiver familiarizado com o modelo baseado em delegate-evento fornecido pelo .NET Framework, no Consulte Tratamento e Raising eventos. Para obter detalhes especficos que se aplicam a nesta seo, consulte Consumir eventos na mesma seo. Um cliente .NET (coletor de eventos) pode receber eventos criados por um servidor COM existente (origem de evento). Interoperabilidade com gera os representantes necessrios nos metadados que forem includos no seu cliente gerenciado. Uma assinatura de representante importados compreende a interface de evento do coletor, um sublinhado, o nome de evento, e a palavra EventHandler: SinkEventInterface _ EventName EventHandler. Observe que objetos com eventos em um cliente .NET que elevar exigir duas colees Garbage Collector (GC) antes que so lanadas. Isso ocorre quando o ciclo de referncia que ocorre entre objetos COM e clientes gerenciados. Caso voc precise explicitamente liberar um objeto com voc deve chamar o Collect mtodo duas vezes. Para interoperar com uma fonte de eventos COM existente 1. Obter Conjunto de Mdulos (Assembly o) de interoperabilidade primria para o servidor COM se os tipos com forem a ser compartilhada por outros aplicativos. Um conjunto de interoperabilidade primrio contm metadados que representa a biblioteca de tipos convertido e assinado no editor. Observao Se o conjunto de interoperabilidade primrio no disponvel ou se o conjunto for a ser usado de forma privada, voc pode importar a biblioteca de tipos usando API equivalente ou a Importador da biblioteca Tipo (TLBIMP.exe) um. 2. O processo de converso gera um representante para cada evento; no entanto, voc s precisa para coletar os eventos de seu interesse.

Visual C# Consolidado

679

3. 4.

Voc pode usar um navegador de metadados, como para identificar eventos representantes. o Disassembler MSIL (Ildasm.exe), Consumir eventos da fonte de eventos COM da mesma maneira que consome eventos de uma origem de evento gerenciado.

Exemplo O exemplo a seguir demonstra como abrir uma janela do Internet Explorer e Wire eventos criados pelo InternetExplorer Objeto para manipuladores de eventos implementado no cdigo gerenciado. Definies de tipos Internet Explorer (incluindo representantes de evento) so importadas como metadados do SHDocVw.dll. O exemplo recpetores o TitleChange evento. C#
namespace InternetExplorer { using System; using System.Runtime.InteropServices; using SHDocVw; public class Explorer { public static void Main() { Explorer explorer = new Explorer(); explorer.Run(); } public void Run() { Object o = null; String s; try { // Starts the browser. m_IExplorer = new SHDocVw.InternetExplorer(); } catch(Exception e) { Console.WriteLine("Exception when creating Internet Explorer object {0}", e); return; } // Wires your event handlers to m_IExplorer. SetAllEvents(); try { // Goes to the home page. m_WebBrowser = (IWebBrowserApp) m_IExplorer; m_WebBrowser.Visible = true; m_WebBrowser.GoHome(); // Starts navigating to different URLs. Console.Write("Enter URL (or enter to quit): "); s = Console.ReadLine(); while (s != "" && m_IExplorer != null && m_WebBrowser != null) { m_WebBrowser.Navigate(s, ref o, ref o, ref o, ref o); Console.Write("Enter URL (or enter to quit): "); s = Console.ReadLine(); } m_WebBrowser.Quit(); } catch(Exception sE) { if (m_IExplorer == null && m_WebBrowser == null) { Console.WriteLine("Internet Explorer has gone away"); } else { Console.WriteLine("Exception happens {0}", sE); } } } // Uses the += syntax for adding delegates to events. void SetAllEvents() { if (m_IExplorer != null) { // Title Change event // DWebBrowserEvents2 is the name of the sink event //interface. // TitleChange is the name of the event. // DWebBrowserEvents2_TitleChangeEventHandler is the // delegate name assigned by TlbImp.exe. DWebBrowserEvents2_TitleChangeEventHandler DTitleChangeE = new DWebBrowserEvents2_TitleChangeEventHandler(OnTitleChange); m_IExplorer.TitleChange += DTitleChangeE; } } /////////////////////////////////////////////////////////////////////// // Define event handlers. // Document title changed static void OnTitleChange(String Text) { Console.WriteLine("Title changes to {0}", Text); } ////////////////////////////////////////////////////////////////////////// // The following are class fields. static private SHDocVw.InternetExplorer m_IExplorer = null; static private IWebBrowserApp m_WebBrowser = null; } }

Como Criar Wrappers Manualmente


Se voc optar por declarar tipos com manualmente no cdigo fonte gerenciado, o melhor lugar para comear com uma biblioteca Arquivo ou tipo interface Definition Language (IDL) existente. Quando voc no tem o arquivo IDL ou no possvel gerar um arquivo de biblioteca Tipo, voc pode simular os tipos com criando declaraes gerenciadas e exportar o conjunto resultante para uma biblioteca de tipos. Para simular com tipos de fonte gerenciado 1. 2. Declarar os tipos em um idioma que seja compatvel o com comum especificao (cls) idioma e compilar o arquivo. Exportar o conjunto que contm os tipos com o Tipo Exporter da biblioteca (TlbExp.exe).

Visual C# Consolidado

680

3.

Usar a biblioteca de tipos com exportado como uma base para declarar tipos gerenciados orientado com. Supondo que voc tiver um arquivo IDL ou arquivo biblioteca Tipo, decidir quais classes e interfaces voc deseja incluir no RCW personalizado. Voc pode excluir qualquer tipos que voc no pretende usar diretamente ou indiretamente em seu aplicativo. Criar um arquivo de origem em um idioma compatvel com CLS e declarar os tipos. Consulte Biblioteca tipo para resumo de converso assembly Para uma descrio completa do processo de converso de importao. Efetivamente, quando voc cria um RCW personalizado, voc est executando a atividade de converso fornecida pelo tipo manualmente o Importador da biblioteca Tipo (TLBIMP.exe). O Exemplo que segue este tipos mostra procedimento em um arquivo de biblioteca IDL ou tipo e seus tipos correspondentes no cdigo C#. Quando as declaraes estiverem concludas, compile o arquivo como voc compila qualquer outro cdigo de fonte gerenciado. Como com os tipos importados com TLBIMP.exe, algumas exigem informaes adicionais que voc pode adicionar diretamente a seu cdigo. Para obter detalhes, consulte Como editar conjuntos Interop:.

Para criar um invlucro Callable Runtime (RCW) 1.

2.

3. 4.

Exemplo O cdigo a seguir mostra um exemplo da interface e ISATestSATest Classe em IDL e os tipos correspondentes no cdigo fonte C#. Arquivo de biblioteca IDL ou tipo
[ object, uuid(40A8C65D-2448-447A-B786-64682CBEF133), dual, helpstring("ISATest Interface"), pointer_default(unique) ] interface ISATest : IDispatch { [id(1), helpstring("method InSArray")] HRESULT InSArray([in] SAFEARRAY(int) *ppsa, [out,retval] int *pSum); }; [ uuid(116CCA1E-7E39-4515-984990790DA6431E), helpstring("SATest Class") ] coclass SATest { [default] interface ISATest; };

Wrapper no cdigo fonte gerenciado C#


using System; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; [assembly:Guid("E4A992B8-6F5C-442C-96E7-C4778924C753")] [assembly:ImportedFromTypeLib("SAServerLib")] namespace SAServer { [ComImport] [Guid("40A8C65D2448-447A-B786-64682CBEF133")] [TypeLibType(TypeLibTypeFlags.FLicensed)] public interface ISATest { [DispId(1)] //[MethodImpl(MethodImplOptions.InternalCall, // MethodCodeType=MethodCodeType.Runtime)] int InSArray( [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_I4)] ref int[] param ); } [ComImport] [Guid("116CCA1E-7E39-4515-984990790DA6431E")] [ClassInterface(ClassInterfaceType.None)] [TypeLibType(TypeLibTypeFlags.FCanCreate)] public class SATest : ISATest { [DispId(1)] [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] extern int ISATest.InSArray( [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_I4)] ref int[] param ); } }

Como Registrar Assemblies de Interoperabilidade Primrios

Visual C# Consolidado

681

Voc dever registrar todos os adquirida primrio conjuntos interoperabilidade no seu computador de desenvolvimento antes voc pode referi-las com Microsoft Visual Studio 2005. O Visual Studio procurar e usa um conjunto interoperacional primrio na primeira vez que voc referncia um tipo de uma biblioteca de tipos COM. Se Visual Studio no possvel localizar conjunto de mdulos (assembly o) de interoperabilidade primria associado biblioteca tipo, ele solicitar que voc a adquiri-lo ou oferece para criar um conjunto de interoperabilidade. Do Importador da biblioteca Tipo (TLBIMP.exe) da mesma forma, tambm usa o Registro para localizar conjuntos de interoperabilidade primrias. Embora ele no seja necessrio para registrar conjuntos de interoperabilidade primrias a menos que voc pretende usar Visual Studio, registro oferece duas vantagens:

Um conjunto de interoperabilidade primrio registrado claramente est marcado sob a chave de registro da biblioteca de tipos original. Registro a melhor maneira de se localizar um conjunto de interoperabilidade primrio no seu computador. Voc pode evitar acidentalmente gerar e usando um novo conjunto interoperacional se, em algum momento no futuro, voc usar o Visual Studio para fazer referncia a um tipo para as quais voc tem Conjunto de Mdulos (Assembly no registrado um) de interoperabilidade primria.

Do Ferramenta de registro do conjunto (RegAsm.exe) uso para registrar um conjunto interoperacional primrio. Para registrar um conjunto interoperacional primrio

No prompt de comando, digite: regasm assemblyname Neste comando, assemblyname o nome de arquivo do conjunto que est registrado. RegAsm.exe adiciona uma entrada para o conjunto de interoperabilidade primrio sob a mesma chave de Registro como a biblioteca tipo original.

Exemplo O exemplo a seguir registra o CompanyA.UtilLib.dll conjunto de mdulos (assembly) de interoperabilidade primria.
regasm CompanyA.UtilLib.dll

Como Empacotar Vrias Verses de Bibliotecas de Tipos


Opcionalmente, voc pode dispor mais de uma verso de uma biblioteca de tipos. Por exemplo, voc pode indicar um conjunto de interoperabilidade primrio que oferece suporte tipo verses de biblioteca 1.0 e 1.1. Para ajustar vrias verses de uma biblioteca de tipos 1. Importar um arquivo de biblioteca tipo:
tlbimp LibUtil.tlb /primary /keyfile:CompanyA.snk /out:LibUtil.dll

2.

Criar um arquivo de texto do conjunto importado usando o Disassembler MSIL (Ildasm.exe):


ildasm LibUtil.dll /out:LibUtil.il

3.

Usando um editor de texto, insira um atributo segundo PrimaryInteropAssemblyAttribute abaixo o atributo adicionado por TLBIMP.exe. Incluir os nmeros de verso primria e secundria que representam a segunda verso de biblioteca tipo.

Visual C# Consolidado

682

4.

Gerar e assinar um novo conjunto do arquivo de texto modificado por meio do Assembler MSIL (Ilasm.exe):
ilasm LibUtil.il /dll /key:CompanyA.snk

Como Desserializar um Objeto


Quando voc desserializar um objeto, o formato transporte determina voc se ir criar um objeto fluxo ou arquivo. Aps o formato de transporte determinado, voc pode chamar ou Deserialize mtodos, conforme necessrio. o Serialize Para desserializar um objeto 1. 2. Construir usando um XmlSerializer para desserializar o tipo de objeto. Chame o Deserialize mtodo para produzir uma rplica do objeto. Quando deserializing, voc deve convertido o objeto retornado para o tipo de original, como mostra o exemplo a seguir, que deserializes o objeto em um arquivo (embora ele tambm pde ser desserializado em um fluxo). C#
MySerializableClass myObject; // Construct an instance of the XmlSerializer with the type // of object that is being deserialized. XmlSerializer mySerializer = new XmlSerializer(typeof(MySerializableClass)); // To read the file, create a FileStream. FileStream myFileStream = new FileStream("myFileName.xml", FileMode.Open); // Call the Deserialize method and cast to the object type. myObject = (MySerializableClass) mySerializer.Deserialize(myFileStream)

Como Usar Ferramenta de Definio de Esquema XML para Gerar Classes e Documentos de Esquema XML
A ferramenta definio de esquema XML (XSD.exe) permite que voc para gerar um esquema XML que descreve uma classe ou para gerar a classe definido por um esquema XML. Os procedimentos a seguir mostram como executar essas operaes. Para gerar classes que esto em conformidade com um esquema especfico 1. 2. Abra um prompt de comando. Passar o Esquema XML como um argumento para a ferramenta definio de esquema XML, que cria um conjunto de classes que precisamente correspondem ao Esquema XML, por exemplo:
xsd mySchema.xsd

A ferramenta s pode processar esquemas que fazem referncia a W3C (World Wide Web Consortium) XML Especificao de maro de 2001 16. Em outras palavras, o espao para nome Esquema XML deve estar " http://www.w3.org/2001/XMLSchema " que mostrado no exemplo a seguir.
<?xml version="1.0" encoding="utf-8"?> <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="" xmlns:xs="http://www.w3.org/2001/XMLSchema">

3.

Modificar as classes COM mtodos, propriedades, ou campos, conforme necessrio. Para obter mais informaes sobre como modificar uma classe com atributos, consulte Controlando a serializao XML usando atributos e Atributos que controlam serializao SOAP codificado.

Visual C# Consolidado

683

Geralmente til para examinar o esquema do no fluxo XML que gerado quando as instncias de uma classe (ou classes) so serializados. Por exemplo, voc pode publicar o esquema para outros usurios a ser usado, ou voc poder compar-lo a um esquema com o qual voc est tentando se atingir conformity.

Para gerar um documento de esquema XML de um conjunto de classes


1. 2. 3. Compilar a Classe ou Classes em uma DLL. Abra um prompt de comando. Passar a DLL como um argumento para XSD.exe, por exemplo:
xsd MyFile.dll

O esquema (ou esquemas) sero gravadas, comeando com " a schema0.xsd " Nome.

Como Especificar um Nome de Elemento Alternativo para um Fluxo XML


Exemplo do cdigo Usando voc pode gerar mais de um fluxo XML com o mesmo conjunto de classes. o XmlSerializer Convm fazer isso porque dois servios XML da Web diferentes exigem as mesmas informaes bsicas, com apenas pequenas diferenas. Por exemplo, imagine dois servios XML da Web que processam pedidos de livros, e assim ambos requerem nmeros ISBN. One service uses the tag <ISBN> while the second uses the tag <BookID>. Voc ter uma classe denominada Book que contm um campo chamado ISBN. Por padro, quando uma instncia da classe Book for serializado, ele poder, usar o nome membro (ISBN) como o nome do elemento marca. Para o primeiro servio XML da Web, este conforme esperado. Mas para enviar o fluxo XML para o servio da Web XML segundo, voc deve substituir a serializao para que seja BookID nome elemento a marca na. Para criar um fluxo XML com um nome de elemento alternativo 1. 2. 3. 4. 5. 6. 7. 8. C#
public class SerializeOverride() { // Creates an XmlElementAttribute with the alternate name. XmlElementAttribute myElementAttribute = new XmlElementAttribute(); myElementAttribute.ElementName = "BookID"; XmlAttributes myAttributes = new XmlAttributes(); myAttributes.XmlElements.Add(myElementAttribute); XmlAttributeOverrides myOverrides = new XmlAttributeOverrides(); myOverrides.Add(typeof(Book), "ISBN", myAttributes); XmlSerializer mySerializer = new XmlSerializer(typeof(Book), myOverrides) Book b = new Book(); b.ISBN = "123456789"

Criar uma instncia da classe XmlElementAttribute. Definir para " BookID ". da ElementName a XmlElementAttribute Criar uma instncia da classe XmlAttributes. Adicione o XmlElementAttribute objeto para a coleo acessada atravs da XmlElements propriedade do XmlAttributes. Criar uma instncia da classe XmlAttributeOverrides. Adicionar para o XmlAttributeOverrides, passando o tipo de objeto para substituir e o nome do membro seja substitudo. o XmlAttributes Criar uma instncia da classe XmlSerializer com XmlAttributeOverrides. Cria uma instncia da classe Book, e serializado ou desserializar-lo.

Exemplo

Visual C# Consolidado

684

// Creates a StreamWriter to write the XML stream to. StreamWriter writer = new StreamWriter("Book.xml"); mySerializer.Serialize(writer, b); }

Se parecer o fluxo XML pode com o seguinte.


<Book> <BookID>123456789</BookID> </Book>

Como: Controlar serializao de classes derivadas


Usando o XmlElementAttribute atributo para alterar o nome de um elemento XML a nica maneira no para personalizar serializao objeto. Voc tambm pode personalizar o fluxo XML, derivar de uma classe existente e instruindo a XmlSerializer instncia como serializar a nova classe. Por exemplo, fornecido uma Book classe, voc pode derivar a partir dele e criar uma ExpandedBook classe que tenha mais de algumas propriedades No entanto, voc dever instruir para aceitar o tipo derivado quando serializing ou deserializing. o XmlSerializer Isso pode ser feito, criando uma XmlElementAttribute instncia e definindo sua Type propriedade para o tipo classe derivada. Adicionar a uma XmlAttributes instncia. o XmlElementAttribute Em seguida, adicione a uma XmlAttributeOverrides instncia, especifica o tipo seja substitudo e o nome do membro que aceite a classe derivada. o XmlAttributes Isso mostrado no exemplo a seguir. Exemplo C#
public class Orders { public Book[] Books; } public class Book { public string ISBN; } public class ExpandedBook:Book { public bool NewEdition; } public class Run { public void SerializeObject(string filename) { // Each overridden field, property, or type requires // an XmlAttributes instance. XmlAttributes attrs = new XmlAttributes(); // Creates an XmlElementAttribute instance to override the // field that returns Book objects. The overridden field // returns Expanded objects instead. XmlElementAttribute attr = new XmlElementAttribute(); attr.ElementName = "NewBook"; attr.Type = typeof(ExpandedBook); // Adds the element to the collection of elements. attrs.XmlElements.Add(attr); // Creates the XmlAttributeOverrides instance. XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides(); // Adds the type of the class that contains the overridden // member, as well as the XmlAttributes instance to override it // with, to the XmlAttributeOverrides. attrOverrides.Add(typeof(Orders), "Books", attrs); // Creates the XmlSerializer using the XmlAttributeOverrides. XmlSerializer s = new XmlSerializer(typeof(Orders), attrOverrides); // Writing the file requires a TextWriter instance. TextWriter writer = new StreamWriter(filename); // Creates the object to be serialized. Orders myOrders = new Orders(); // Creates an object of the derived type. ExpandedBook b = new ExpandedBook(); b.ISBN= "123456789"; b.NewEdition = true; myOrders.Books = new ExpandedBook[]{b}; // Serializes the object. s.Serialize(writer,myOrders); writer.Close(); } public void DeserializeObject(string filename) { XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides(); XmlAttributes attrs = new XmlAttributes(); // Creates an XmlElementAttribute to override the // field that returns Book objects. The overridden field // returns Expanded objects instead. XmlElementAttribute attr = new XmlElementAttribute(); attr.ElementName = "NewBook"; attr.Type = typeof(ExpandedBook); // Adds the XmlElementAttribute to the collection of objects. attrs.XmlElements.Add(attr); attrOverrides.Add(typeof(Orders), "Books", attrs); // Creates the XmlSerializer using the XmlAttributeOverrides. XmlSerializer s = new XmlSerializer(typeof(Orders), attrOverrides); FileStream fs = new FileStream(filename, FileMode.Open); Orders myOrders = (Orders) s.Deserialize(fs); Console.WriteLine("ExpandedBook:"); // The difference between deserializing the overridden // XML document and serializing it is this: To read the derived // object values, you must declare an object of the

Visual C# Consolidado

685

derived type // and cast the returned object to it. ExpandedBook expanded; foreach(Book b in myOrders.Books) { expanded = (ExpandedBook)b; Console.WriteLine( expanded.ISBN + "\n" + expanded.NewEdition); } } }

Como: Serializar um objeto como um fluxo XML codificado por SOAP


Exemplo do cdigo Porque uma mensagem SOAP criado usando XML, o XmlSerializer pode ser usado para serializar classes e gerar mensagens SOAP codificado. O XML resultante obedea seo 5 do documento " simples Protocolo de acesso a objetos " (SOAP) 1.1 W3C (World Wide Web Consortium) (www.w3.org). Quando voc est criando um servio XML da Web que se comunica atravs mensagens SOAP, voc pode personalizar o fluxo XML aplicando um conjunto de atributos SOAP especial s classes e membros de classes Para obter uma lista de atributos, consulte Atributos que controlam serializao SOAP codificado. Para serializar um objeto como um fluxo codificado SOAP-XML 1. 2. 3. Criar a classe usando o Ferramenta de definio do esquema XML (XSD.exe). Aplicar um ou mais dos atributos especial encontrado no System.Xml.Serialization. Consulte a lista em " atributos que serializao SOAP Encoded Controle. " Criar, criando um novo SoapReflectionImporter, e chamar o ImportTypeMapping mtodo com o tipo de classe serializado. um XmlTypeMapping O exemplo de cdigo a seguir chama o ImportTypeMapping mtodo da classe SoapReflectionImporter para criar um XmlTypeMapping. C#
// Serializes a class named Group as a SOAP message. XmlTypeMapping myTypeMapping = (new SoapReflectionImporter(). ImportTypeMapping(typeof(Group));

4.

Criar uma instncia de classe XmlSerializer, passando para o XmlSerializer Construtor. o XmlTypeMapping C#
XmlSerializer mySerializer = new XmlSerializer(myTypeMapping);

5. C#

Chamar ou Deserialize Mtodo. o Serialize

Exemplo
// Serializes a class named Group as a SOAP message. XmlTypeMapping myTypeMapping = (new SoapReflectionImporter().ImportTypeMapping(typeof(Group)); XmlSerializer mySerializer = new XmlSerializer(myTypeMapping);

Como Particionar Dados Serializados


Dois problemas que ocorrem quando enviar grandes conjuntos de dados em mensagens do servio da Web so: 1. 2. Um conjunto de trabalho grande devido a buffer pelo mecanismo de serializao (memria). O consumo de largura de banda inordinate devido a inflation % 33 aps a codificao Base64.

Visual C# Consolidado

686

Para resolver esses problemas, implementar a IXmlSerializable interface para controlar a serializao e a desserializao. Especificamente, implementar e ReadXml mtodos para chunk os dados. o WriteXml Para implementar reunir do lado do servidor 1. 2. 1. No computador servidor, o mtodo Web deve desativar o buffer ASP.NET e retornar um tipo que implementa IXmlSerializable. O tipo que implementa IXmlSerializable chunks os dados no mtodo WriteXml. Alterar o mtodo da Web em para retornar o tipo que implementa IXmlSerializable o proxy cliente. Voc pode usar fazer isso automaticamente, mas isso no mostrado aqui. para um SchemaImporterExtension Implementar o ReadXml mtodo para ler os dados em partes fluxo e gravar os bytes em disco. Essa implementao tambm aumenta eventos andamento que podem ser usados por um controle grfico, como uma barra de progresso.

Para implementar o processamento do lado do cliente

2.

Exemplo O exemplo de cdigo a seguir mostra o mtodo web no cliente que desativa o buffer do ASP.NET. Ele tambm mostra a implementao do lado do cliente da interface IXmlSerializable que chunks os dados no mtodo WriteXml. C#
[WebMethod] [System.Web.Services.Protocols.SoapDocumentMethodAttribute (ParameterStyle= SoapParameterStyle.Bare)] public SongStream DownloadSong(DownloadAuthorization Authorization, string filePath) { // Turn off response buffering. System.Web.HttpContext.Current.Response.Buffer = false; // Return a song. SongStream song = new SongStream(filePath); return song; } ...[XmlSchemaProvider("MySchema")] public class SongStream : IXmlSerializable { private const string ns = "http://demos.Contoso.com/webservices"; private string filePath; public SongStream(){ } public SongStream(string filePath) { this.filePath = filePath; } // This is the method named by the XmlSchemaProviderAttribute applied to the type. public static XmlQualifiedName MySchema(XmlSchemaSet xs) { // This method is called by the framework to get the schema for this type. // We return an existing schema from disk. XmlSerializer schemaSerializer = new XmlSerializer(typeof(XmlSchema)); string xsdPath = null; // NOTE: replace the string with your own path. xsdPath = System.Web.HttpContext.Current.Server.MapPath("SongStream.xsd"); XmlSchema s = (XmlSchema)schemaSerializer.Deserialize( new XmlTextReader(xsdPath), null); xs.XmlResolver = new XmlUrlResolver(); xs.Add(s); return new XmlQualifiedName("songStream", ns); } void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer) { // This is the chunking code. // ASP.NET buffering must be turned off for this to work. int bufferSize = 4096; char[] songBytes = new char[bufferSize]; FileStream inFile = File.Open(this.filePath, FileMode.Open, FileAccess.Read); long length = inFile.Length; // Write the file name. writer.WriteElementString("fileName", ns, Path.GetFileNameWithoutExtension(this.filePath)); // Write the size. writer.WriteElementString("size", ns, length.ToString()); // Write the song bytes. writer.WriteStartElement("song", ns); StreamReader sr = new StreamReader(inFile, true); int readLen = sr.Read(songBytes, 0, bufferSize); while (readLen > 0) { writer.WriteStartElement("chunk", ns); writer.WriteChars(songBytes, 0, readLen); writer.WriteEndElement(); writer.Flush(); readLen = sr.Read(songBytes, 0, bufferSize); } writer.WriteEndElement(); inFile.Close(); } System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema() { throw new System.NotImplementedException(); } void IXmlSerializable.ReadXml(System.Xml.XmlReader

Visual C# Consolidado

687

reader) { throw new System.NotImplementedException(); } } ...public class SongFile : IXmlSerializable { public static event ProgressMade OnProgress; public SongFile() { } private const string ns = "http://demos.teched2004.com/webservices"; public static string MusicPath; private string filePath; private double size; void IXmlSerializable.ReadXml(System.Xml.XmlReader reader) { reader.ReadStartElement("DownloadSongResult", ns); ReadFileName(reader); ReadSongSize(reader); ReadAndSaveSong(reader); reader.ReadEndElement(); } void ReadFileName(XmlReader reader) { string fileName = reader.ReadElementString("fileName", ns); this.filePath = Path.Combine(MusicPath, Path.ChangeExtension(fileName, ".mp3")); } void ReadSongSize(XmlReader reader) { this.size = Convert.ToDouble(reader.ReadElementString("size", ns)); } void ReadAndSaveSong(XmlReader reader) { FileStream outFile = File.Open( this.filePath, FileMode.Create, FileAccess.Write); string songBase64; byte[] songBytes; reader.ReadStartElement("song", ns); double totalRead=0; while(true) { if (reader.IsStartElement("chunk", ns)) { songBase64 = reader.ReadElementString(); totalRead += songBase64.Length; songBytes = Convert.FromBase64String(songBase64); outFile.Write(songBytes, 0, songBytes.Length); outFile.Flush(); if (OnProgress != null) { OnProgress(100 * (totalRead / size)); } } else { break; } } outFile.Close(); reader.ReadEndElement(); } [PermissionSet(SecurityAction.Demand, Name="FullTrust")] public void Play() { System.Diagnostics.Process.Start(this.filePath); } System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema() { throw new System.NotImplementedException(); } public void WriteXml(XmlWriter writer) { throw new System.NotImplementedException(); } }

Compilando o cdigo

O cdigo usa espaos para nome a seguir: System., System.XmlSystem.Web.Services.Protocols, System.Web.ServicesSystem.Runtime.Serialization, System.Xml.Serialization e System.Xml.Schema

Como: Serializar um objeto


Para serializar um objeto, primeiro criar o objeto que est para ser serializado e definir suas propriedades pblicas e campos. Para fazer isso, voc deve determinam o formato de transporte em que o fluxo XML para ser armazenado, como um fluxo ou como um arquivo. Por exemplo, se o fluxo XML deve ser salvo em um formulrio permanente, criar um FileStream objeto. Observao Para obter mais exemplos de serializao XML, consulte Exemplos de serializao XML. Para um objeto serializado 1. 2. 3. Crie o objeto e defina suas propriedades e campos pblica. Construir usando um XmlSerializer o tipo de objeto. Para obter mais informaes, consulte os XmlSerializer construtores de classe. Chame o Serialize mtodo para gerar um fluxo XML ou uma representao em arquivo de propriedades pblicas do objeto e campos. O exemplo a seguir cria um arquivo. C#
MySerializableClass myObject = new MySerializableClass(); // Insert code to set properties and fields of the object. XmlSerializer mySerializer = new XmlSerializer(typeof(MySerializableClass)); // To

Visual C# Consolidado

688

write to a file, create a StreamWriter object. StreamWriter myWriter = new StreamWriter("myFileName.xml"); mySerializer.Serialize(myWriter, myObject); myWriter.Close();

Como Qualificar um Elemento XML e Nomes Atributos XML


Code Example Esto espaos para nome XML contidos, as instncias da classe XmlSerializerNamespaces deve conformidade com a especificao W3C (World Wide Web Consortium) (www.w3.org) chamado " Namespaces em XML. " Espaos para nome XML fornecem um mtodo para qualificao os nomes de elementos XML e atributos XML em documentos XML. Um nome qualificado consiste de um prefixo e um nome local, separados por dois-pontos. O prefixo funciona apenas como um espao reservado; ele mapeado para um URI que especifica um espao para nome. A combinao de espao para nome URI universalmente gerenciado e o nome local produz um nome que garantida seja universalmente exclusivo. Criando uma instncia do XmlSerializerNamespaces e adicionando os pares espao para nome para o objeto, voc pode especificar os prefixos usados em um documento XML. Para criar nomes qualificado em um documento XML 1. 2. 3. Criar uma instncia da classe XmlSerializerNamespaces. Adicionar todos os prefixos e pares espao para nome para o XmlSerializerNamespaces. Aplicar o atributo apropriado System.Xml.Serialization a cada membro ou classe que possvel serializar em um documento XML. o XmlSerializer Os atributos disponveis so: XmlAnyElementAttribute., XmlElementAttributeXmlAttributeAttribute, XmlArrayItemAttributeXmlArrayAttribute, XmlRootAttribute e XmlTypeAttribute 4. 5. Defina a Namespace propriedade de cada atributo como um dos valores de espao para nome a XmlSerializerNamespaces. Passar o XmlSerializerNamespaces. para o Serialize mtodo da XmlSerializer

Exemplo O exemplo a seguir cria e adiciona dois pares prefixo e espao para nome ao objeto. an XmlSerializerNamespaces, O cdigo cria um XmlSerializer que usado para serializar uma instncia da classe Books. O cdigo chama o Serialize mtodo com o XML para conter espaos para nome prefixed permitindo o XmlSerializerNamespaces. C#
using System; using System.IO; using System.Xml; using System.Xml.Serialization; public class Run { public static void Main() { Run test = new Run(); test.SerializeObject("XmlNamespaces.xml"); } public void SerializeObject(string filename) { XmlSerializer mySerializer = new XmlSerializer(typeof(Books)); // Writing a file requires a TextWriter. TextWriter myWriter = new StreamWriter(filename); // Creates an XmlSerializerNamespaces and adds two // prefix-namespace pairs. XmlSerializerNamespaces myNamespaces = new XmlSerializerNamespaces(); myNamespaces.Add("books", "http://www.cpandl.com"); myNamespaces.Add("money", "http://www.cohowinery.com"); // Creates a Book. Book myBook = new Book(); myBook.TITLE = "A Book Title"; Price myPrice = new Price(); myPrice.price = (decimal) 9.95; myPrice.currency = "US Dollar"; myBook.PRICE = myPrice; Books myBooks = new Books(); myBooks.Book = myBook; mySerializer.Serialize(myWriter,myBooks,myNamespaces);

Visual C# Consolidado

689

myWriter.Close(); } } public class Books { [XmlElement(Namespace = "http://www.cohowinery.com")] public Book Book; } [XmlType(Namespace ="http://www.cpandl.com")] public class Book { [XmlElement(Namespace = "http://www.cpandl.com")] public string TITLE; [XmlElement(Namespace ="http://www.cohowinery.com")] public Price PRICE; }

Como: Substituir serializao de SOAP XML codificado


Exemplo do cdigo O processo para substituir a serializao de XML de objetos como mensagens SOAP semelhante para o processo para substituir a serializao de XML padro. Para obter informaes sobre substituio padro serializao XML, consulte Como Especificar um Nome de Elemento Alternativo para um Fluxo XML. Para substituir a serializao de objetos como mensagens SOAP 1. 2. 3. Criar uma instncia da classe SoapAttributeOverrides. Criar para cada membro da classe que est sendo serializado. um SoapAttributes Criar uma instncia de uma ou mais dos atributos que afetam a serializao de XML, conforme apropriado, para o membro sendo serializado. Para obter mais informaes, consulte " atributos que codificado serializao SOAP controle ". Defina a propriedade de SoapAttributes apropriado para o atributo criado na etapa 3. Adicionar SoapAttributes a SoapAttributeOverrides. Criar um XmlTypeMapping usando o SoapAttributeOverrides. Use o SoapReflectionImporter.ImportTypeMapping mtodo. Criar um XmlSerializer usando XmlTypeMapping. Serializado ou desserializar o objeto.

4. 5. 6. 7. 8.

Exemplo O exemplo de cdigo a seguir serializes um arquivo em duas maneiras: primeiro, sem substituindo o comportamento a XmlSerializer classe, e em segundo lugar, por substituindo o comportamento. O exemplo contm uma classe denominada Group com vrios membros. Diversos atributos,, como o SoapElementAttribute, que foi. aplicado a membros de classe Quando a classe serializado com o SerializeOriginal mtodo, os atributos controlar o contedo da mensagem SOAP. Quando o SerializeOverride mtodo chamado, o comportamento do para esses atributos (conforme adequado). seja substitudo, criando vrios atributos e definio das propriedades da XmlSerializer uma SoapAttributes C#
using System; using System.IO; using System.Xml; using System.Xml.Serialization; using System.Xml.Schema; public class Group { [SoapAttribute (Namespace = "http://www.cpandl.com")] public string GroupName; [SoapAttribute(DataType = "base64Binary")] public Byte [] GroupNumber; [SoapAttribute(DataType = "date", AttributeName = "CreationDate")] public DateTime Today; [SoapElement(DataType = "nonNegativeInteger", ElementName = "PosInt")] public string PostitiveInt; // This is ignored when serialized unless it is overridden. [SoapIgnore] public bool IgnoreThis; public GroupType Grouptype; [SoapInclude(typeof(Car))] public Vehicle myCar(string licNumber) { Vehicle v; if(licNumber == "") { v = new Car(); v.licenseNumber = "!!!!!!"; } else { v = new Car(); v.licenseNumber = licNumber; } return v; } } public abstract class Vehicle { public string licenseNumber; public DateTime makeDate; } public class Car: Vehicle { } public enum GroupType { // These enums can be overridden. small,

Visual C# Consolidado

690

large } public class Run { public static void Main() { Run test = new Run(); test.SerializeOriginal("SoapOriginal.xml"); test.SerializeOverride("SoapOverrides.xml"); test.DeserializeOriginal("SoapOriginal.xml"); test.DeserializeOverride("SoapOverrides.xml"); } public void SerializeOriginal(string filename) { // Creates an instance of the XmlSerializer class. XmlTypeMapping myMapping = (new SoapReflectionImporter().ImportTypeMapping( typeof(Group))); XmlSerializer mySerializer = new XmlSerializer(myMapping); // Writing the file requires a TextWriter. TextWriter writer = new StreamWriter(filename); // Creates an instance of the class that will be serialized. Group myGroup = new Group(); // Sets the object properties. myGroup.GroupName = ".NET"; Byte [] hexByte = new Byte[2]{Convert.ToByte(100), Convert.ToByte(50)}; myGroup.GroupNumber = hexByte; DateTime myDate = new DateTime(2002,5,2); myGroup.Today = myDate; myGroup.PostitiveInt= "10000"; myGroup.IgnoreThis=true; myGroup.Grouptype= GroupType.small; Car thisCar =(Car) myGroup.myCar("1234566"); // Prints the license number just to prove the car was created. Console.WriteLine("License#: " + thisCar.licenseNumber + "\n"); // Serializes the class and closes the TextWriter. mySerializer.Serialize(writer, myGroup); writer.Close(); } public void SerializeOverride(string filename) { // Creates an instance of the XmlSerializer class // that overrides the serialization. XmlSerializer overRideSerializer = CreateOverrideSerializer(); // Writing the file requires a TextWriter. TextWriter writer = new StreamWriter(filename); // Creates an instance of the class that will be serialized. Group myGroup = new Group(); // Sets the object properties. myGroup.GroupName = ".NET"; Byte [] hexByte = new Byte[2]{Convert.ToByte(100), Convert.ToByte(50)}; myGroup.GroupNumber = hexByte; DateTime myDate = new DateTime(2002,5,2); myGroup.Today = myDate; myGroup.PostitiveInt= "10000"; myGroup.IgnoreThis=true; myGroup.Grouptype= GroupType.small; Car thisCar =(Car) myGroup.myCar("1234566"); // Serializes the class and closes the TextWriter. overRideSerializer.Serialize(writer, myGroup); writer.Close(); } public void DeserializeOriginal(string filename) { // Creates an instance of the XmlSerializer class. XmlTypeMapping myMapping = (new SoapReflectionImporter().ImportTypeMapping( typeof(Group))); XmlSerializer mySerializer = new XmlSerializer(myMapping); TextReader reader = new StreamReader(filename); // Deserializes and casts the object. Group myGroup; myGroup = (Group) mySerializer.Deserialize(reader); Console.WriteLine(myGroup.GroupName); Console.WriteLine(myGroup.GroupNumber[0]); Console.WriteLine(myGroup.GroupNumber[1]); Console.WriteLine(myGroup.Today); Console.WriteLine(myGroup.PostitiveInt); Console.WriteLine(myGroup.IgnoreThis); Console.WriteLine(); } public void DeserializeOverride(string filename) { // Creates an instance of the XmlSerializer class. XmlSerializer overRideSerializer = CreateOverrideSerializer(); // Reading the file requires a TextReader. TextReader reader = new StreamReader(filename); // Deserializes and casts the object. Group myGroup; myGroup = (Group) overRideSerializer.Deserialize(reader); Console.WriteLine(myGroup.GroupName); Console.WriteLine(myGroup.GroupNumber[0]); Console.WriteLine(myGroup.GroupNumber[1]); Console.WriteLine(myGroup.Today); Console.WriteLine(myGroup.PostitiveInt); Console.WriteLine(myGroup.IgnoreThis); } private XmlSerializer CreateOverrideSerializer() { SoapAttributeOverrides mySoapAttributeOverrides = new SoapAttributeOverrides(); SoapAttributes soapAtts = new SoapAttributes(); SoapElementAttribute mySoapElement = new SoapElementAttribute(); mySoapElement.ElementName = "xxxx"; soapAtts.SoapElement = mySoapElement; mySoapAttributeOverrides.Add(typeof(Group), "PostitiveInt", soapAtts); // Overrides the IgnoreThis property. SoapIgnoreAttribute myIgnore = new SoapIgnoreAttribute(); soapAtts = new SoapAttributes(); soapAtts.SoapIgnore = false; mySoapAttributeOverrides.Add(typeof(Group), "IgnoreThis", soapAtts); // Overrides the GroupType enumeration. soapAtts = new SoapAttributes(); SoapEnumAttribute xSoapEnum = new SoapEnumAttribute(); xSoapEnum.Name = "Over1000"; soapAtts.SoapEnum = xSoapEnum; // Adds the SoapAttributes to the // mySoapAttributeOverridesrides.

Visual C# Consolidado

691

mySoapAttributeOverrides.Add(typeof(GroupType), "large", soapAtts); // Creates a second enumeration and adds it. soapAtts = new SoapAttributes(); xSoapEnum = new SoapEnumAttribute(); xSoapEnum.Name = "ZeroTo1000"; soapAtts.SoapEnum = xSoapEnum; mySoapAttributeOverrides.Add(typeof(GroupType), "small", soapAtts); // Overrides the Group type. soapAtts = new SoapAttributes(); SoapTypeAttribute soapType = new SoapTypeAttribute(); soapType.TypeName = "Team"; soapAtts.SoapType = soapType; mySoapAttributeOverrides.Add(typeof(Group),soapAtts); // Creates an XmlTypeMapping that is used to create an instance // of the XmlSerializer class. Then returns the XmlSerializer. XmlTypeMapping myMapping = (new SoapReflectionImporter( mySoapAttributeOverrides)).ImportTypeMapping(typeof(Group)); XmlSerializer ser = new XmlSerializer(myMapping); return ser; } }

Como Analisar Dgitos Unicode


O Padro Unicode define valores de cdigo de dgitos em vrios scripts. Por exemplo, valores cdigo no intervalo 09E6 U + a + U 09EF especificam Bengali dgitos de 0 a 9, e valores cdigo no intervalo U + FF10 a + U FF19 Especificar dgitos de 0 a 9 largura total. No entanto, somente os dgitos Unicode que o .NET Framework analisa como decimais so dgitos ASCII de 0 a 9, especificado pelo U + 0030 atravs u+0039 os valores de cdigo. O .NET Framework analisa todos os outros dgitos Unicode como caracteres. Portanto, uma tentativa de analisar uma seqncia de Bengali dgitos no intervalo 09E6 U + a + U 09EF usando o Decimal.Parse mtodo throws uma exceo. O exemplo de cdigo a seguir usa o Decimal.Parse mtodo para analisar seqncias de valores de cdigo Unicode que especificam dgitos em scripts diferentes. As tentativas para analisar dgitos ASCII e dgitos ASCII especificado como valores de cdigo Unicode xito. As tentativas para analisar os valores cdigo Unicode de largura total dgitos, dgitos indo-arbico, e dgitos Bengali falhar e Acione uma exceo. Exemplo C#
using System; public class TestClass { public static void Main() { // Parses a string of ASCII digits 1-5. String strDigits = "12345"; // Parsing succeeds. Parse(strDigits); // Parses a string of ASCII Digits 1-5 specified // as Unicode code values. String strUdigits = "\u0031\u0032\u0033\u0034\u0035"; // Parsing succeeds. Parse(strUdigits); // Parses a string of Fullwidth digits 1-5 specified as // Unicode code values. String strFdigits = "\uFF11\uFF12\uFF13\uFF14\uFF15"; // Parsing fails. Parse(strFdigits); // Parses a string of Arabic-Indic digits 1-5 specified as // Unicode code values. String strAdigits = "\u0661\u0662\u0663\u0664\u0665"; // Parsing fails. Parse(strAdigits); // Parses a string of Bengali digits 1-5 specified as // Unicode code values. String strBdigits = "\u09E7\u09E8\u09E9\u09EA\u09EB"; // Parsing fails. Parse(strBdigits); } public static void Parse(String str) { try { Decimal dc = Decimal.Parse(str); Console.WriteLine("Parsing string {0} succeeded: {1}\n",str, dc); } catch (Exception e) { Console.WriteLine("Parsing string {0} failed", str); Console.WriteLine(e.ToString()); Console.WriteLine("\n"); } } }

Como Criar Culturas Personalizadas


The predefined cultures provided with the .NET Framework and the Windows operating system provide information such as the language and calendar used in a country/region, and the text conventions used to format, parse, and compare strings, dates, and numbers. No entanto, voc pode criar uma cultura personalizados se o cultures predefinidas no fornecer as informaes seu aplicativo requer.

Visual C# Consolidado

692

Para definir e criar uma cultura personalizado


1. Use um CultureAndRegionInfoBuilder objeto para definir e nomear a cultura personalizado. A cultura personalizada pode ser um totalmente novo cultura, ou pode ser uma cultura que substitui uma cultura .NET Framework ou localidade do Windows existente. Para novos cultures, voc pode preencher as CultureAndRegionInfoBuilder propriedades do objeto com um objeto existente CultureInfo e o LoadDataFromCultureInfo mtodo, e um objeto existente RegionInfo e o LoadDataFromRegionInfo mtodo. Para cultures substituio, as CultureAndRegionInfoBuilder propriedades do objeto automaticamente so preenchidos nas propriedades da cultura est sendo substituda. 2. 3.
o o

Modificar as propriedades do objeto CultureAndRegionInfoBuilder para satisfazer os requisitos de seu aplicativo. Chame o Register mtodo para registrar a cultura personalizado. O processo de registro executa essas tarefas: Cria um arquivo.nlp que contm as informaes definido no objeto CultureAndRegionInfoBuilder. Armazena o arquivo.nlp no diretrio sistema %WINDIR%\Globalization em seu computador, que significa as informaes cultura persistir mesmo se ele estiver desativado em seu computador. Voc deve ter privilgios administrativos no computador onde a cultura personalizado est registrado porque o arquivo.nlp est armazenado em um diretrio do sistema. Prepara o .NET Framework para pesquisar o diretrio sistema %WINDIR%\Globalization em vez de um cache interno na prxima vez no h uma solicitao para criar o novo cultura personalizado. A cultura personalizado agora tem o mesmo status de qualquer predefinido cultura .NET Framework ou Windows localidade no seu computador. A cultura personalizado est disponvel at voc remover o arquivo.nlp correspondente do seu computador com o Unregister mtodo.

4.

Especificar o nome do seu cultura personalizado em um CultureInfo construtor de classe para criar uma instncia do que cultura personalizada em seu aplicativo.

Exemplo O exemplo de cdigo a seguir usa a CultureAndRegionInfoBuilder classe para definir e registrar uma cultura personalizado chamado " x trao US--, amostra " e ento cria um CultureInfo objeto para a cultura " x trao US--" amostras. O exemplo de cdigo tambm mostra algumas propriedades correspondentes do e CultureInfo Objetos. o CultureAndRegionInfoBuilder C#
// This example demonstrates the System.Globalization.Culture- // AndRegionInfoBuilder Register method. // Compile this code example with a reference to sysglobl.dll. using System; using System.Globalization; class Sample { public static void Main() { CultureAndRegionInfoBuilder cib = null; try { // Create a CultureAndRegionInfoBuilder object named "x-en-US-sample". Console.WriteLine("Create and explore the CultureAndRegionInfoBuilder...\n"); cib = new CultureAndRegionInfoBuilder( "x-en-US-sample", CultureAndRegionModifiers.None); // Populate the new CultureAndRegionInfoBuilder object with culture information. CultureInfo ci = new CultureInfo("en-US"); cib.LoadDataFromCultureInfo(ci); // Populate the new CultureAndRegionInfoBuilder object with region information. RegionInfo ri = new RegionInfo("US"); cib.LoadDataFromRegionInfo(ri); // Display some of the properties of the CultureAndRegionInfoBuilder object. Console.WriteLine("CultureName:. . . . . . . . . . {0}", cib.CultureName); Console.WriteLine("CultureEnglishName: . . . . . . {0}", cib.CultureEnglishName);

Visual C# Consolidado

693

Console.WriteLine("CultureNativeName:. . . . . . . {0}", cib.CultureNativeName); Console.WriteLine("GeoId:. . . . . . . . . . . . . {0}", cib.GeoId); Console.WriteLine("IsMetric: . . . . . . . . . . . {0}", cib.IsMetric); Console.WriteLine("ISOCurrencySymbol:. . . . . . . {0}", cib.ISOCurrencySymbol); Console.WriteLine("RegionEnglishName:. . . . . . . {0}", cib.RegionEnglishName); Console.WriteLine("RegionName: . . . . . . . . . . {0}", cib.RegionName); Console.WriteLine("RegionNativeName: . . . . . . . {0}", cib.RegionNativeName); Console.WriteLine("ThreeLetterISOLanguageName: . . {0}", cib.ThreeLetterISOLanguageName); Console.WriteLine("ThreeLetterISORegionName: . . . {0}", cib.ThreeLetterISORegionName); Console.WriteLine("ThreeLetterWindowsLanguageName: {0}", cib.ThreeLetterWindowsLanguageName); Console.WriteLine("ThreeLetterWindowsRegionName: . {0}", cib.ThreeLetterWindowsRegionName); Console.WriteLine("TwoLetterISOLanguageName: . . . {0}", cib.TwoLetterISOLanguageName); Console.WriteLine("TwoLetterISORegionName: . . . . {0}", cib.TwoLetterISORegionName); Console.WriteLine(); // Register the custom culture. Console.WriteLine("Register the custom culture..."); cib.Register(); // Display some of the properties of the custom culture. Console.WriteLine("Create and explore the custom culture...\n"); ci = new CultureInfo("x-en-US-sample"); Console.WriteLine("Name: . . . . . . . . . . . . . {0}", ci.Name); Console.WriteLine("EnglishName:. . . . . . . . . . {0}", ci.EnglishName); Console.WriteLine("NativeName: . . . . . . . . . . {0}", ci.NativeName); Console.WriteLine("TwoLetterISOLanguageName: . . . {0}", ci.TwoLetterISOLanguageName); Console.WriteLine("ThreeLetterISOLanguageName: . . {0}", ci.ThreeLetterISOLanguageName); Console.WriteLine("ThreeLetterWindowsLanguageName: {0}", ci.ThreeLetterWindowsLanguageName); Console.WriteLine("\nNote:\n" + "Use the example in the Unregister method topic to remove the custom culture."); } catch (Exception e) { Console.WriteLine(e); } } } /* This code example produces the following results: Create and explore the CultureAndRegionInfoBuilder... CultureName:. . . . . . . . . . x-en-US-sample CultureEnglishName: . . . . . . English (United States) CultureNativeName:. . . . . . . English (United States) GeoId:. . . . . . . . . . . . . 244 IsMetric: . . . . . . . . . . . False ISOCurrencySymbol:. . . . . . . USD RegionEnglishName:. . . . . . . United States RegionName: . . . . . . . . . . x-en-US-sample RegionNativeName: . . . . . . . United States ThreeLetterISOLanguageName: . . eng ThreeLetterISORegionName: . . . USA ThreeLetterWindowsLanguageName: ENU ThreeLetterWindowsRegionName: . USA TwoLetterISOLanguageName: . . . en TwoLetterISORegionName: . . . . US Register the custom culture... Create and explore the custom culture... Name: . . . . . . . . . . . . . x-en-US-sample EnglishName:. . . . . . . . . . English (United States) NativeName: . . . . . . . . . . English (United States) TwoLetterISOLanguageName: . . . en ThreeLetterISOLanguageName: . . eng ThreeLetterWindowsLanguageName: ENU Note: Use the example in the Unregister method topic to remove the custom culture. */

Como Definir e Executar Mtodos Dinmicos


Os procedimentos a seguir mostram como definir e executar um mtodo dinmico simples e um mtodo dinmico vinculado a uma instncia de uma classe. Para obter mais informaes sobre mtodos dinmicos, consulte a DynamicMethod classe e Reflexo Emit dinmico cenrios mtodo. Para definir e executar um mtodo dinmico 1. Declare um tipo delegate para executar o mtodo. Considere usar um representante genrico para minimizar o nmero de tipos de representante necessrias para declarar. O cdigo a seguir declara dois tipos de representante que podem ser usados para o SquareIt mtodo, e um deles genrico. C#

Visual C# Consolidado

694

private delegate long SquareItInvoker(int input); private delegate TReturn OneParameter<TReturn, TParameter0> (TParameter0 p0);

2.

Criar uma matriz que especifica os tipos de parmetro para o mtodo dinmico. Neste exemplo, o nico parmetro est um int. (Integer), para que tenha apenas um elemento da matriz no Visual Basic C#
Type[] methodArgs = {typeof(int)};

3.

Criar um DynamicMethod. No exemplo do mtodo chamado SquareIt. Observao Ele no necessrio para dar nomes mtodos Dinmico, e eles no podem ser chamados pelo nome. Vrios mtodos dinmicos podem ter o mesmo nome. No entanto, o nome aparece em pilhas de chamada e pode ser til para depurao.

4.

O tipo do valor de retorno especificado como long. O mtodo est associado ao mdulo que contm a Example classe, que contm o cdigo de exemplo. Qualquer mdulo carregado pode ser especificado. O mtodo dinmico age como um mdulo - nvel static mtodo no Visual Basic). (Shared

C#
DynamicMethod squareIt = new DynamicMethod( "SquareIt", typeof(long), methodArgs, typeof(Example).Module);

5.

Emitir o corpo de mtodo. Neste exemplo, um ILGenerator objeto usado para emitir a linguagem intermediria Microsoft (MSIL). Como alternativa, um DynamicILInfo objeto pode ser usado em conjunto com geradores de cdigo no gerenciado para emitir o corpo de mtodo um DynamicMethod. O MSIL, neste exemplo carrega o argumento, que para um long, duplicatas. na pilha, converte-e multiplica os dois nmeros an int, o long, Isso deixa o resultado quadrado na pilha, e o mtodo tem a ver tudo retorno. C#
ILGenerator il = squareIt.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Conv_I8); il.Emit(OpCodes.Dup); il.Emit(OpCodes.Mul); il.Emit(OpCodes.Ret);

6.

Criar uma instncia do representante (declarado na etapa 1) que representa o mtodo dinmico chamando o CreateDelegate mtodo. Criar o representante conclui o mtodo, e qualquer tentativa adicional para alterar o mtodo por exemplo, adicionando mais MSIL so ignorados. O cdigo a seguir cria o representante e chama-lo, usando um representante genrico. C#
OneParameter<long, int> invokeSquareIt = (OneParameter<long, int>) squareIt.CreateDelegate(typeof(OneParameter<long, int>)); Console.WriteLine("123456789 squared = {0}", invokeSquareIt(123456789));

Para definir e executar um mtodo dinmico que esteja vinculado ao objeto 1. Declare um tipo delegate para executar o mtodo. Considere usar um representante genrico para minimizar o nmero de tipos de representante necessrias para declarar. O cdigo a seguir declara um tipo genrico de representante que pode ser usado para

Visual C# Consolidado

695

executar qualquer mtodo com um parmetro e um valor de retorno, ou um mtodo com dois parmetros e um valor de retorno se o representante estiver vinculado a um objeto. C#
private delegate TReturn OneParameter<TReturn, TParameter0> (TParameter0 p0);

2.

Criar uma matriz que especifica os tipos de parmetro para o mtodo dinmico. Se o representante que representa o mtodo deve ser vinculado a um objeto, o primeiro parmetro deve corresponder ao tipo o representante est vinculado. Neste exemplo, no so dois parmetros, do tipo Example e tipo int (Integer no Visual Basic.) C#
Type[] methodArgs2 = { typeof(Example), typeof(int) };

3.

Criar um DynamicMethod. No, neste exemplo o mtodo tem nome. O tipo do valor de retorno especificado como int (Integer no Visual Basic.) O mtodo tem acesso aos membros da classe Example privada e protegidos. C#
DynamicMethod multiplyHidden = new DynamicMethod( "", typeof(int), methodArgs2, typeof(Example));

4.

Emitir o corpo de mtodo. Neste exemplo, um ILGenerator objeto usado para emitir a linguagem intermediria Microsoft (MSIL). Como alternativa, um DynamicILInfo objeto pode ser usado em conjunto com geradores de cdigo no gerenciado para emitir o corpo de mtodo um DynamicMethod. O MSIL, neste exemplo carrega o primeiro argumento, que uma instncia da classe Example, e ele usa para carregar o valor de um campo particular da instncia do tipo int. O segundo argumento carregado e os dois nmeros so multiplicados. Se o resultado for maior do que int o valor ser truncado e os bits mais significativos sero descartados. O mtodo retorna, com o valor de retorno na pilha. C#
ILGenerator ilMH = multiplyHidden.GetILGenerator(); ilMH.Emit(OpCodes.Ldarg_0); FieldInfo testInfo = typeof(Example).GetField("test", BindingFlags.NonPublic | BindingFlags.Instance); ilMH.Emit(OpCodes.Ldfld, testInfo); ilMH.Emit(OpCodes.Ldarg_1); ilMH.Emit(OpCodes.Mul); ilMH.Emit(OpCodes.Ret);

5.

Criar uma instncia do representante (declarado na etapa 1) que representa o mtodo dinmico ao chamar a CreateDelegate sobrecarga mtodo. Criar o representante conclui o mtodo, e qualquer tentativa adicional para alterar o mtodo por exemplo, adicionando mais MSIL so ignorados. Observao Voc pode chamar o CreateDelegate mtodo vrias vezes para criar representantes vinculados a outras instncias do tipo de destino.

6.

O cdigo a seguir vincula o mtodo a uma nova instncia da classe Example cujo campo particular de teste definido para 42. Isto , sempre que o representante for chamado a instncia do Example passado para o primeiro parmetro do mtodo. O representante OneParameter usado porque o primeiro parmetro do mtodo sempre receber a instncia do Example. Quando o representante invocado, somente o parmetro segundo necessrio.

7.

C#

Visual C# Consolidado

696

OneParameter<int, int> invoke = (OneParameter<int, int>) multiplyHidden.CreateDelegate( typeof(OneParameter<int, int>), new Example(42) ); Console.WriteLine("3 * test = {0}", invoke(3));

Exemplo O exemplo de cdigo a seguir demonstra um mtodo dinmico simples e um mtodo dinmico vinculado a uma instncia de uma classe. O mtodo dinmico simples leva um argumento, um inteiro de 32 bits, e retorna o quadrado 64 bits do que inteiro. Um representante genrico usado para chamar o mtodo. O segundo mtodo dinmico tem dois parmetros, do tipo Example e tipo int (Integer no Visual Basic.) Quando o mtodo dinmico for criado, ela est vinculada a uma instncia do Example, usando um representante genrico que tem um argumento do tipo int. O representante no tem um argumento do tipo Example porque o primeiro parmetro do mtodo sempre receber a instncia do Example limite. Quando o representante invocado, somente o int argumento fornecido. Este mtodo dinmico acessa um campo particular da classe Example e retorna o produto do campo particular e o int argumento. O exemplo de cdigo define representantes podem ser usadas para executar os mtodos. C#
using System; using System.Reflection; using System.Reflection.Emit; public class Example { // The following constructor and private field are used to // demonstrate a method bound to an object. private int test; public Example(int test) { this.test = test; } // Declare delegates that can be used to execute the completed // SquareIt dynamic method. The OneParameter delegate can be // used to execute any method with one parameter and a return // value, or a method with two parameters and a return value // if the delegate is bound to an object. // private delegate long SquareItInvoker(int input); private delegate TReturn OneParameter<TReturn, TParameter0> (TParameter0 p0); public static void Main() { // Example 1: A simple dynamic method. // // Create an array that specifies the parameter types for the // dynamic method. In this example the only parameter is an // int, so the array has only one element. // Type[] methodArgs = {typeof(int)}; // Create a DynamicMethod. In this example the method is // named SquareIt. It is not necessary to give dynamic // methods names. They cannot be invoked by name, and two // dynamic methods can have the same name. However, the // name appears in calls stacks and can be useful for // debugging. // // In this example the return type of the dynamic method // is long. The method is associated with the module that // contains the Example class. Any loaded module could be // specified. The dynamic method is like a module-level // static method. // DynamicMethod squareIt = new DynamicMethod( "SquareIt", typeof(long), methodArgs, typeof(Example).Module); // Emit the method body. In this example ILGenerator is used // to emit the MSIL. DynamicMethod has an associated type // DynamicILInfo that can be used in conjunction with // unmanaged code generators. // // The MSIL loads the argument, which is an int, onto the // stack, converts the int to a long, duplicates the top // item on the stack, and multiplies the top two items on the // stack. This leaves the squared number on the stack, and // all the method has to do is return. // ILGenerator il = squareIt.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Conv_I8); il.Emit(OpCodes.Dup); il.Emit(OpCodes.Mul); il.Emit(OpCodes.Ret); // Create a delegate that represents the dynamic method. // Creating the delegate completes the method, and any further // attempts to change the method (for example, by adding more // MSIL) are ignored. The following code uses a generic // delegate that can produce delegate types matching any // single-parameter method that has a return type. // OneParameter<long, int> invokeSquareIt = (OneParameter<long, int>) squareIt.CreateDelegate(typeof(OneParameter<long, int>)); Console.WriteLine("123456789 squared = {0}",

Visual C# Consolidado

697

invokeSquareIt(123456789)); // Example 2: A dynamic method bound to an instance. // // Create an array that specifies the parameter types for a // dynamic method. If the delegate representing the method // is to be bound to an object, the first parameter must // match the type the delegate is bound to. In the following // code the bound instance is of the Example class. // Type[] methodArgs2 = { typeof(Example), typeof(int) }; // Create a DynamicMethod. In this example the method has no // name. The return type of the method is int. The method // has access to the protected and private data of the // Example class. // DynamicMethod multiplyHidden = new DynamicMethod( "", typeof(int), methodArgs2, typeof(Example)); // Emit the method body. In this example ILGenerator is used // to emit the MSIL. DynamicMethod has an associated type // DynamicILInfo that can be used in conjunction with // unmanaged code generators. // // The MSIL loads the first argument, which is an instance of // the Example class, and uses it to load the value of a // private instance field of type int. The second argument is // loaded, and the two numbers are multiplied. If the result // is larger than int, the value is truncated and the most // significant bits are discarded. The method returns, with // the return value on the stack. // ILGenerator ilMH = multiplyHidden.GetILGenerator(); ilMH.Emit(OpCodes.Ldarg_0); FieldInfo testInfo = typeof(Example).GetField("test", BindingFlags.NonPublic | BindingFlags.Instance); ilMH.Emit(OpCodes.Ldfld, testInfo); ilMH.Emit(OpCodes.Ldarg_1); ilMH.Emit(OpCodes.Mul); ilMH.Emit(OpCodes.Ret); // Create a delegate that represents the dynamic method. // Creating the delegate completes the method, and any further // attempts to change the method for example, by adding more // MSIL are ignored. // // The following code binds the method to a new instance // of the Example class whose private test field is set to 42. // That is, each time the delegate is invoked the instance of // Example is passed to the first parameter of the method. // // The delegate OneParameter is used, because the first // parameter of the method receives the instance of Example. // When the delegate is invoked, only the second parameter is // required. // OneParameter<int, int> invoke = (OneParameter<int, int>) multiplyHidden.CreateDelegate( typeof(OneParameter<int, int>), new Example(42) ); Console.WriteLine("3 * test = {0}", invoke(3)); } } /* This code example produces the following output: 123456789 squared = 15241578750190521 3 * test = 126 */

Compilando o cdigo

O cdigo contm as instrues C# using (Imports. no Visual Basic) necessrio para compilao H referncias do conjunto adicionais so necessrias. Compilar o cdigo na linha de comando usando csc.exe, vbc.exe, ou CL.exe. Para compilar o cdigo no Visual Studio, coloque-o em um modelo de projeto de aplicativo de console.

Como Examinar e Instanciar Tipos Genricos com Reflexo


Informaes sobre tipos genricos so obtidas no mesmo modo como informaes sobre outros tipos: examinando um Type objeto que representa o tipo genrico. A diferena princpio que um tipo genrico tem uma lista de Type objetos que representam seus parmetros tipo genrico. O primeiro procedimento nesta seo examina tipos genricos. Voc pode criar um Type objeto que representa um tipo construdo pelos argumentos Tipo de ligao com os parmetros Tipo de uma definio de tipo genrico. O segundo procedimento demonstra isso. Para examinar um tipo genrico e seus parmetros tipo 1. Obter uma instncia do Type que representa o tipo genrico. No cdigo a seguir, o tipo obtido usando o operador C# typeof (GetType no Visual Basic, typeid no Visual C++.)

Visual C# Consolidado

698

Consulte o Type tpico de classe para outras maneiras de se obter um Type objeto. Observe que no restante deste procedimento, o tipo est contido em um parmetro mtodo chamado t. C#
Type d1 = typeof(Dictionary<,>);

2.

Use a IsGenericType propriedade para determinar se o tipo genrico, e use a IsGenericTypeDefinition propriedade para determinar se o tipo uma definio de tipo genrico. C#
Console.WriteLine(" Is this a generic type? {0}", t.IsGenericType); Console.WriteLine(" Is this a generic type definition? {0}", t.IsGenericTypeDefinition);

3.

Obter uma matriz que contm os argumentos Tipo genrico, usando o GetGenericArguments mtodo. C#
Type[] typeParameters = t.GetGenericArguments();

4.

Para cada argumento Tipo, determinar se ela um parmetro tipo (por exemplo, em uma definio de tipo genrico) ou um tipo que foi especificado para um parmetro de tipo (por exemplo, em um tipo construdo), usando a IsGenericParameter propriedade. C#
Console.WriteLine(" List {0} type arguments:", typeParameters.Length); foreach( Type tParam in typeParameters ) { if (tParam.IsGenericParameter) { DisplayGenericParameter(tParam); } else { Console.WriteLine(" Type argument: {0}", tParam); } }

5.

No sistema do tipo, um parmetro tipo genrico representado por uma instncia do Type, exatamente como so tipos comuns. O cdigo a seguir exibe a posio de um Type objeto que representa um parmetro tipo genrico Nome e parmetro. A posio de parmetro trivial informaes aqui; ele de mais interesse quando voc est examinando um parmetro tipo que foi usado como um argumento Tipo de outro tipo genrico. C#
private static void DisplayGenericParameter(Type tp) { Console.WriteLine(" Type parameter: {0} position {1}", tp.Name, tp.GenericParameterPosition);

6.

Determinar a restrio tipo base e as restries de interface de um parmetro tipo genrico, usando o GetGenericParameterConstraints mtodo para obter todas as restries em uma nica matriz. Restries no so garantidas para estar em uma ordem especfica. C#
Type classConstraint = null; foreach(Type iConstraint in tp.GetGenericParameterConstraints()) { if (iConstraint.IsInterface) { Console.WriteLine(" Interface constraint: {0}", iConstraint); } } if (classConstraint != null) { Console.WriteLine(" Base type constraint: {0}", tp.BaseType); } else Console.WriteLine(" Base type constraint: None");

7.

Use a GenericParameterAttributes propriedade para descobrir as restries especiais em um parmetro, tipo, como solicitar que seja um tipo de referncia. A propriedade tambm inclui valores que representam varincia, que voc pode mascarar logoff como mostrado no cdigo o seguir. C#

Visual C# Consolidado

699

GenericParameterAttributes sConstraints = tp.GenericParameterAttributes & GenericParameterAttributes.SpecialConstraintMask;

8.

Os atributos de restrio especiais so sinalizadores, e o mesmo sinalizador (System.Reflection.GenericParameterAttributes.None. restries tambm representa no covarincia ou contravariance) no especiais que representa Assim, para testar para um dos seguintes condies voc deve usar a mscara apropriada. Nesse caso, usar System.Reflection.GenericParameterAttributes.SpecialConstraintMask para isolar os sinalizadores de restrio especial. C#
if (sConstraints == GenericParameterAttributes.None) { Console.WriteLine(" No special constraints."); } else { if (GenericParameterAttributes.None != (sConstraints & GenericParameterAttributes.DefaultConstructorConstraint)) { Console.WriteLine(" Must have a parameterless constructor."); } if (GenericParameterAttributes.None != (sConstraints & GenericParameterAttributes.ReferenceTypeConstraint)) { Console.WriteLine(" Must be a reference type."); } if (GenericParameterAttributes.None != (sConstraints & GenericParameterAttributes.NotNullableValueTypeConstraint)) { Console.WriteLine(" Must be a non-nullable value type."); } }

Construir uma instncia de um tipo genrico Um tipo genrico como um modelo. Voc no pode criar instncias dela a menos que voc especifique reais tipos para seus parmetros tipo genrico. Para fazer isso em tempo de execuo, usar reflexo, requer o MakeGenericType mtodo.

Para construir uma instncia de um tipo genrico


1. Obter um Type objeto que representa o tipo genrico. O cdigo a seguir obtm o tipo Dictionary genrico de duas maneiras diferentes: por meio do System.Type.GetType(System.String) mtodo sobrecarregar com uma seqncia que descreve o tipo, e por chamar o GetGenericTypeDefinition mtodo com o tipo Dictionary<String, Example> construdo no Visual Basic). (Dictionary(Of String, Example) O MakeGenericType mtodo requer uma definio de tipo genrico. C#
// Use the typeof operator to create the generic type // definition directly. To specify the generic type definition, // omit the type arguments but retain the comma that separates // them. Type d1 = typeof(Dictionary<,>); // You can also obtain the generic type definition from a // constructed class. In this case, the constructed class // is a dictionary of Example objects, with String keys. Dictionary<string, Example> d2 = new Dictionary<string, Example>(); // Get a Type object that represents the constructed type, // and from that get the generic type definition. The // variables d1 and d4 contain the same type. Type d3 = d2.GetType(); Type d4 = d3.GetGenericTypeDefinition();

2.

Construir uma matriz de argumentos Tipo para substituir para os parmetros tipo. A matriz deve conter o nmero correto de Type Objetos, na mesma ordem em que aparecem na lista de parmetros tipo. Neste caso, a chave (primeiro parmetro tipo) seja do tipo String, e os valores no dicionrio so instncias de uma classe denominada Example. C#
Type[] typeArgs = {typeof(string), typeof(Example)};

3.

Chame o MakeGenericType mtodo ao vincular os argumentos Tipo com os parmetros Tipo e construir o tipo.

Visual C# Consolidado

700

C#
Type constructed = d1.MakeGenericType(typeArgs);

4.

Use a CreateInstance sobrecarga mtodo para criar um objeto do tipo construdo. O cdigo a seguir armazena duas instncias da classe Example no objeto resultante Dictionary<String, Example>. C#
object o = Activator.CreateInstance(constructed);

Exemplo O exemplo de cdigo a seguir define um DisplayGenericType mtodo para examinar a definies tipo genrico e construdos tipos usados no cdigo e exibir suas informaes. Mostra como usar o DisplayGenericType mtodo a IsGenericType, IsGenericParameter., e GenericParameterPosition propriedades e o GetGenericArguments mtodo O exemplo tambm define um DisplayGenericParameter mtodo para examinar um parmetro tipo genrico e exibir suas restries. O exemplo de cdigo define um conjunto de tipos de teste, incluindo um tipo genrico que ilustra restries de parmetro, tipo e mostra como para exibir informaes sobre esses tipos. O exemplo constri um tipo a partir da Dictionary classe, criando uma matriz de argumentos Tipo e chamar o MakeGenericType mtodo. Compara o Type objeto construdo uso MakeGenericType com um Type objeto obtido usando typeof o programa (GetType. no Visual Basic), demonstrar que eles sejam os mesmos Da mesma forma, o programa usa o GetGenericTypeDefinition mtodo para obter a definio do tipo construdo, tipo genrico e compara-o para o Type objeto que representa a Dictionary classe. C#
using System; using System.Reflection; using System.Collections.Generic; using System.Security.Permissions; // Define an example interface. public interface ITestArgument {} // Define an example base class. public class TestBase {} // Define a generic class with one parameter. The parameter // has three constraints: It must inherit TestBase, it must // implement ITestArgument, and it must have a parameterless // constructor. public class Test<T> where T : TestBase, ITestArgument, new() {} // Define a class that meets the constraints on the type // parameter of class Test. public class TestArgument : TestBase, ITestArgument { public TestArgument() {} } public class Example { // The following method displays information about a generic // type. private static void DisplayGenericType(Type t) { Console.WriteLine("\r\n {0}", t); Console.WriteLine(" Is this a generic type? {0}", t.IsGenericType); Console.WriteLine(" Is this a generic type definition? {0}", t.IsGenericTypeDefinition); // Get the generic type parameters or type arguments. Type[] typeParameters = t.GetGenericArguments(); Console.WriteLine(" List {0} type arguments:", typeParameters.Length); foreach( Type tParam in typeParameters ) { if (tParam.IsGenericParameter) { DisplayGenericParameter(tParam); } else { Console.WriteLine(" Type argument: {0}", tParam); } } } // The following method displays information about a generic // type parameter. Generic type parameters are represented by // instances of System.Type, just like ordinary types. private static void DisplayGenericParameter(Type tp) { Console.WriteLine(" Type parameter: {0} position {1}", tp.Name, tp.GenericParameterPosition); Type classConstraint = null; foreach(Type iConstraint in tp.GetGenericParameterConstraints()) { if (iConstraint.IsInterface) { Console.WriteLine(" Interface constraint: {0}", iConstraint); } } if (classConstraint != null) { Console.WriteLine(" Base type constraint: {0}", tp.BaseType); } else Console.WriteLine(" Base type constraint: None"); GenericParameterAttributes

Visual C# Consolidado

701

sConstraints = tp.GenericParameterAttributes & GenericParameterAttributes.SpecialConstraintMask; if (sConstraints == GenericParameterAttributes.None) { Console.WriteLine(" No special constraints."); } else { if (GenericParameterAttributes.None != (sConstraints & GenericParameterAttributes.DefaultConstructorConstraint)) { Console.WriteLine(" Must have a parameterless constructor."); } if (GenericParameterAttributes.None != (sConstraints & GenericParameterAttributes.ReferenceTypeConstraint)) { Console.WriteLine(" Must be a reference type."); } if (GenericParameterAttributes.None != (sConstraints & GenericParameterAttributes.NotNullableValueTypeConstraint)) { Console.WriteLine(" Must be a nonnullable value type."); } } } [PermissionSetAttribute(SecurityAction.Demand, Name="FullTrust")] public static void Main() { // Two ways to get a Type object that represents the generic // type definition of the Dictionary class. // // Use the typeof operator to create the generic type // definition directly. To specify the generic type definition, // omit the type arguments but retain the comma that separates // them. Type d1 = typeof(Dictionary<,>); // You can also obtain the generic type definition from a // constructed class. In this case, the constructed class // is a dictionary of Example objects, with String keys. Dictionary<string, Example> d2 = new Dictionary<string, Example>(); // Get a Type object that represents the constructed type, // and from that get the generic type definition. The // variables d1 and d4 contain the same type. Type d3 = d2.GetType(); Type d4 = d3.GetGenericTypeDefinition(); // Display information for the generic type definition, and // for the constructed type Dictionary<String, Example>. DisplayGenericType(d1); DisplayGenericType(d2.GetType()); // Construct an array of type arguments to substitute for // the type parameters of the generic Dictionary class. // The array must contain the correct number of types, in // the same order that they appear in the type parameter // list of Dictionary. The key (first type parameter) // is of type string, and the type to be contained in the // dictionary is Example. Type[] typeArgs = {typeof(string), typeof(Example)}; // Construct the type Dictionary<String, Example>. Type constructed = d1.MakeGenericType(typeArgs); DisplayGenericType(constructed); object o = Activator.CreateInstance(constructed); Console.WriteLine("\r\nCompare types obtained by different methods:"); Console.WriteLine(" Are the constructed types equal? {0}", (d2.GetType()==constructed)); Console.WriteLine(" Are the generic definitions equal? {0}", (d1==constructed.GetGenericTypeDefinition())); // Demonstrate the DisplayGenericType and // DisplayGenericParameter methods with the Test class // defined above. This shows base, interface, and special // constraints. DisplayGenericType(typeof(Test<>)); } }

Compilando o cdigo

O cdigo contm as instrues C# using (Imports. no Visual Basic) necessrio para compilao H referncias do conjunto adicionais so necessrias. Compilar o cdigo na linha de comando usando csc.exe, vbc.exe, ou CL.exe. Para compilar o cdigo no Visual Studio, coloque-o em um modelo de projeto de aplicativo de console.

Como Definir um Mtodo genrico com Emisso de Reflexo


O primeiro procedimento mostra como criar um mtodo genrico simples com dois parmetros tipo, e como aplicar restries de classe, restries interface, e restries especiais com os parmetros tipo. O segundo procedimento mostra como para emitir o corpo mtodo, e como usar os parmetros do mtodo genrico do tipo para criar instncias de tipos genricos e para chamar seus mtodos.

Visual C# Consolidado

702

O procedimento terceiro mostra como chamar o mtodo genrico. Importante Um mtodo no genrico apenas porque ela pertence a um tipo genrico e usa os parmetros Tipo do mesmo tipo. Um mtodo somente se tiver sua prpria lista de Parmetro tipo genrico. Um mtodo genrico pode aparecer em um tipo nongeneric, como no exemplo. Para obter um exemplo de um mtodo nongeneric em um tipo genrico, consulte Como Definir um Tipo Genrico com Emisso de Reflexo. Para definir um mtodo genrico 1. Antes de comear, ela til para examinar como o mtodo genrico aparece quando gravados usando uma linguagem de alto nvel. O cdigo a seguir includo no cdigo de exemplo para este tpico, juntamente com cdigo para chamar o mtodo genrico. O mtodo tem dois parmetros Tipo, TInput e TOutput, o segundo dos quais deve ser um tipo de referncia (new deve ter um construtor sem parmetros (class).),, e deve implementar ICollection(Of TInput) em C#) (ICollection<TInput> Esta restrio interface assegura que o System.Collections.Generic.ICollection.Add( mtodo pode ser usado para adicionar elementos coleo TOutput que cria o mtodo. O mtodo tem um parmetro formal, input,. que uma matriz de TInput O mtodo cria um conjunto de tipo TOutput e copia os elementos de input coleo. C#
public static TOutput Factory<TInput, TOutput>(TInput[] tarray) where TOutput : class, ICollection<TInput>, new() { TOutput ret = new TOutput(); ICollection<TInput> ic = ret; foreach (TInput t in tarray) { ic.Add(t); } return ret; }

2.

Definir um conjunto dinmico e pertence a um mdulo dinmico para conter o tipo o mtodo genrico. Nesse caso, o conjunto tem somente um mdulo, nomeado DemoMethodBuilder1, e o nome do mdulo o mesmo como o nome do conjunto mais uma extenso. Neste exemplo, o conjunto salvo no disco e tambm executado, para System.Reflection.Emit.AssemblyBuilderAccess.RunAndSave for especificado. Voc pode usar para examinar DemoMethodBuilder1.dll e para compar-lo para o idioma intermedirio Microsoft (MSIL) para o mtodo mostrado na etapa 1. o Disassembler MSIL (Ildasm.exe) C#
AssemblyName asmName = new AssemblyName("DemoMethodBuilder1"); AppDomain domain = AppDomain.CurrentDomain; AssemblyBuilder demoAssembly = domain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave); // Define the module that contains the code. For an // assembly with one module, the module name is the // assembly name plus a file extension. ModuleBuilder demoModule = demoAssembly.DefineDynamicModule(asmName.Name, asmName.Name+".dll");

3.

Define o tipo o mtodo genrico pertence. O tipo no tem a ser genrico. Um mtodo genrico pode pertencer a qualquer um tipo genrico ou nongeneric. Neste exemplo, o tipo uma classe, no genricas, e nomeado DemoType. C#
TypeBuilder demoType = demoModule.DefineType("DemoType", TypeAttributes.Public);

4.

Definir o mtodo genrico. Se os tipos de parmetros formais Um do mtodo genrico forem especificados por tipo genrico parmetros do mtodo genrico, use a DefineMethod sobrecarga mtodo para definir o mtodo. Os parmetros tipo genrico do mtodo ainda no esto definidos, para que voc no pode especificar os tipos de parmetros formais do

Visual C# Consolidado

703

mtodo na chamada para DefineMethod. Neste exemplo, o mtodo chamado Factory. O mtodo pblico e static no Visual Basic (Shared). C#
MethodBuilder factory = demoType.DefineMethod("Factory", MethodAttributes.Public | MethodAttributes.Static);

5.

Definir os parmetros de DemoMethod tipo genrico ao passar uma matriz de seqncias de caracteres que contm os nomes dos parmetros para o System.Reflection.Emit.MethodBuilder.DefineGenericParameters(System.String[]) mtodo. Isso torna o mtodo um mtodo genrico. O cdigo a seguir faz Factory um mtodo com parmetros TInput tipo genrico e TOutput. Para facilitar a leitura, o cdigo variveis com esses nomes so criados para conter os GenericTypeParameterBuilder objetos que representam os parmetros dois tipo. C#
string[] typeParameterNames = {"TInput", "TOutput"}; GenericTypeParameterBuilder[] typeParameters = factory.DefineGenericParameters(typeParameterNames); GenericTypeParameterBuilder TInput = typeParameters[0]; GenericTypeParameterBuilder TOutput = typeParameters[1];

6.

Opcionalmente, adicionar restries especiais aos parmetros tipo. Restries especiais so adicionadas usando o SetGenericParameterAttributes mtodo. Neste exemplo, TOutput restrito para ser um tipo de referncia e para que um construtor sem parmetros. C#
TOutput.SetGenericParameterAttributes( GenericParameterAttributes.ReferenceTypeConstraint | GenericParameterAttributes.DefaultConstructorConstraint);

7.

Opcionalmente, Adicionar Classe e interface restries aos parmetros tipo. Neste exemplo, parmetro TOutput type est restrita a tipos que implementam o ICollection(Of TInput) em C#.) interface (ICollection<TInput> Isso assegura que o Add mtodo pode ser usado para adicionar elementos. C#
Type icoll = typeof(ICollection<>); Type icollOfTInput = icoll.MakeGenericType(TInput); Type[] constraints = {icollOfTInput}; TOutput.SetInterfaceConstraints(constraints);

8.

Definir parmetros do mtodo, usando o SetParameters mtodo formais. Neste exemplo, o


Factory mtodo tem um parmetro, uma matriz de TInput. Esse tipo criado por chamada o MakeArrayType mtodo em que o GenericTypeParameterBuilder representa TInput. O

argumento do SetParameters uma matriz de Type objetos. C#


Type[] parms = {TInput.MakeArrayType()}; factory.SetParameters(parms);

9.

Definir o tipo de retorno para o mtodo, usando o SetReturnType mtodo. Neste exemplo, uma instncia do TOutput ser retornada. C#
factory.SetReturnType(TOutput);

10. Emitir o mtodo corpo, usando ILGenerator. Para obter detalhes, consulte o procedimento To Emit the Method Body de acompanhamento. Importante

Visual C# Consolidado

704

Quando voc emitir chamadas para mtodos de tipos genricos e os argumentos os tipo desses tipos so parmetros tipo do mtodo genrico, voc deve usar o static GetConstructor, GetMethod., e GetField overloads mtodo da classe TypeBuilder para obter formas dos mtodos construdo O procedimento de acompanhamento de emissor o corpo de mtodo demonstra isso. 11. Conclua o tipo que contm o mtodo e salvar o conjunto. O procedimento To Invoke the Generic Method acompanha mostra duas maneiras de chamar o mtodo concludo. C#
// Complete the type. Type dt = demoType.CreateType(); // Save the assembly, so it can be examined with Ildasm.exe. demoAssembly.Save(asmName.Name+".dll");

Para emitir o corpo de mtodo 1. Obter um gerador de cdigo e declarar variveis locais e rtulos. O DeclareLocal mtodo usado para declarar variveis locais. O Factory mtodo tem quatro variveis locais: retVal. Ele convertido em ICollection(Of TInput)), input para manter a matriz de entrada de TInput objetos, e index para percorrer a matriz para armazenar o novo TOutput que retornado pelo mtodo, ic para manter o TOutput quando em C# (ICollection<TInput> O mtodo tambm tem dois rtulos, uma para inserir o loop (enterLoop. (loopAgain), definio usando o DefineLabel mtodo) e outra para a parte superior do loop A primeira coisa o mtodo no para carregar seu argumento usando Ldarg_0 OpCode e para armazenar-na varivel input local usando Stloc_S OpCode. C#
ILGenerator ilgen = factory.GetILGenerator(); LocalBuilder retVal = ilgen.DeclareLocal(TOutput); LocalBuilder ic = ilgen.DeclareLocal(icollOfTInput); LocalBuilder input = ilgen.DeclareLocal(TInput.MakeArrayType()); LocalBuilder index = ilgen.DeclareLocal(typeof(int)); Label enterLoop = ilgen.DefineLabel(); Label loopAgain = ilgen.DefineLabel(); ilgen.Emit(OpCodes.Ldarg_0); ilgen.Emit(OpCodes.Stloc_S, input);

2.

Emitir cdigo para criar uma instncia do TOutput, usando a sobrecarga mtodo genrico do mtodo System.Activator.CreateInstance. Usar essa sobrecarga requer o tipo especificado para que um construtor sem parmetros, que a razo para adicionar essa restrio para TOutput. Criar o mtodo genrico construdo, passagem TOutput para MakeGenericMethod. Aps emissor cdigo para chamar o mtodo, emitir cdigo para armazen-lo na varivel retVal usando Stloc_S o local C#
MethodInfo createInst = typeof(Activator).GetMethod("CreateInstance", Type.EmptyTypes); MethodInfo createInstOfTOutput = createInst.MakeGenericMethod(TOutput); ilgen.Emit(OpCodes.Call, createInstOfTOutput); ilgen.Emit(OpCodes.Stloc_S, retVal);

3.

Emitir cdigo para convertido para ICollection(Of TInput) o novo TOutput objeto e armazenlo na varivel ic local. C#
ilgen.Emit(OpCodes.Ldloc_S, retVal); ilgen.Emit(OpCodes.Box, icollOfTInput); ilgen.Emit(OpCodes.Castclass, icollOfTInput); ilgen.Emit(OpCodes.Stloc_S, ic);

4.

Obter um MethodInfo representando o System.Collections.Generic.ICollection.Add( mtodo. O mtodo est agindo em um ICollection(Of TInput). (ICollection<TInput>), portanto, ele necessrio para passar o Add mtodo especfico para esse tipo construdo em C# Voc no pode usar o GetMethod mtodo para obter isso MethodInfo diretamente do icollOfTInput, porque GetMethod no tem suporte em um tipo que tenha sido construdo

Visual C# Consolidado

705

com um GenericTypeParameterBuilder. Em vez disso, chame MethodInfo no icoll, que contm a definio tipo genrico para a ICollection interface genrico. Do MethodInfo usamos o GetMethod static mtodo para produzir para o tipo construdo. O cdigo a seguir demonstra isso. C#
MethodInfo mAddPrep = icoll.GetMethod("Add"); MethodInfo mAdd = TypeBuilder.GetMethod(icollOfTInput, mAddPrep);

5.

Emitir cdigo para inicializar a index varivel, ao carregar um inteiro de 32 bits 0 e armazen-lo na varivel. Emitir cdigo para filial para o rtulo enterLoop. Este rtulo ainda no tiver sido marcado, porque ele est dentro do loop. Cdigo para o loop emitted na prxima etapa. C#
// Initialize the count and enter the loop. ilgen.Emit(OpCodes.Ldc_I4_0); ilgen.Emit(OpCodes.Stloc_S, index); ilgen.Emit(OpCodes.Br_S, enterLoop);

6.

Emitir cdigo para o loop. A primeira etapa para marcar a parte superior do loop, por chamada MarkLabel com o loopAgain rtulo. Agora instrues filial que usam o rtulo ser Branch a esse ponto no cdigo. A prxima etapa para empurrar o TOutput objeto, convertido em ICollection(Of TInput), na pilha. Ele no necessrio imediatamente, mas precisa fazer na posio para chamar o Add mtodo. Em seguida a matriz de entrada empurrada na pilha, em seguida, a index varivel que contm o ndice atual para a matriz. O Ldelem cdigo operao aparece o ndice e a matriz desativar a pilha e coloca o elemento matriz indexada na pilha. Agora a pilha est pronta para a chamada para o System.Collections.Generic.ICollection.Add( mtodo, que exibido coleo e o novo elemento desativar a pilha e adiciona o elemento para a coleo. O restante do cdigo no loop Incrementa o ndice e testa para ver se o loop For concludo:. O ndice e um inteiro de 32 bits so 1 pressionado na pilha e adicionado, deixando a soma na Pilha; a soma armazenada na index MarkLabel chamado para definir este ponto como o ponto de entrada para o loop. O ndice carregado novamente. A matriz de entrada pressionado na pilha, e Ldlen emitted para obter seu tamanho. O ndice e o comprimento so agora na pilha, e Clt emitted para compar-las. Se o ndice for menor que o comprimento, Brtrue_S ramificaes volta para o incio do loop. C#
ilgen.MarkLabel(loopAgain); ilgen.Emit(OpCodes.Ldloc_S, ic); ilgen.Emit(OpCodes.Ldloc_S, input); ilgen.Emit(OpCodes.Ldloc_S, index); ilgen.Emit(OpCodes.Ldelem, TInput); ilgen.Emit(OpCodes.Callvirt, mAdd); ilgen.Emit(OpCodes.Ldloc_S, index); ilgen.Emit(OpCodes.Ldc_I4_1); ilgen.Emit(OpCodes.Add); ilgen.Emit(OpCodes.Stloc_S, index); ilgen.MarkLabel(enterLoop); ilgen.Emit(OpCodes.Ldloc_S, index); ilgen.Emit(OpCodes.Ldloc_S, input); ilgen.Emit(OpCodes.Ldlen); ilgen.Emit(OpCodes.Conv_I4); ilgen.Emit(OpCodes.Clt); ilgen.Emit(OpCodes.Brtrue_S, loopAgain);

7.

Emitir cdigo para empurrar o TOutput objeto na Pilha e retornar do mtodo. As variveis retVal locais e ic ambos contiverem referncias ao novo TOutput; ic usada apenas para acessar o System.Collections.Generic.ICollection.Add( mtodo. C#
ilgen.Emit(OpCodes.Ldloc_S, retVal); ilgen.Emit(OpCodes.Ret);

Para chamar o mtodo genrico 1. Factory uma definio Mtodo genrico. A fim de cham-lo, voc deve atribuir tipos aos seus parmetros tipo genrico. Use o MakeGenericMethod mtodo para fazer isso. O

Visual C# Consolidado

706

cdigo a seguir cria um mtodo genrico construdo, especificando String para TInput e List(Of String). (List<string>) para TOutput, em C# e exibe uma representao de seqncia do mtodo C#
MethodInfo m = dt.GetMethod("Factory"); MethodInfo bound = m.MakeGenericMethod(typeof(string), typeof(List<string>)); // Display a string representing the bound method. Console.WriteLine(bound);

2.

Para chamar a vinculados as mtodo, use o Invoke mtodo. O cdigo a seguir cria uma matriz de Object, contendo uma matriz de seqncias de caracteres, como seu nico elemento e passa-como lista de argumentos do mtodo genrico. O primeiro parmetro do Invoke uma referncia nula porque o mtodo static. O valor de retorno convertido em List(Of String), e o primeiro elemento exibido. C#
object o = bound.Invoke(null, new object[]{arr}); List<string> list2 = (List<string>) o; Console.WriteLine("The first element is: {0}", list2[0]);

3.

Para chamar o mtodo usando um representante, voc deve ter um representante que corresponda a assinatura do mtodo genrico construdo Uma maneira fcil para fazer isso para criar um representante genrico. O cdigo a seguir cria uma instncia do representante D genrico definida no cdigo de exemplo, usando a System.Delegate.CreateDelegate(System.Type,System.Reflection.MethodInfo) sobrecarga mtodo, e chama o representante. Representantes executar melhor que vinculados as chamadas. C#
Type dType = typeof(D<string, List <string>>); D<string, List <string>> test; test = (D<string, List <string>>) Delegate.CreateDelegate(dType, bound); List<string> list3 = test(arr); Console.WriteLine("The first element is: {0}", list3[0]);

4.

O mtodo emitted tambm pode ser chamado de um programa que se refere ao conjunto salvo.

Exemplo O exemplo de cdigo a seguir cria um tipo nongeneric, DemoType,. com um mtodo genrico, Factory Este mtodo tem dois parmetros tipo genrico, TInput Para especificar um tipo de entrada e TOutput Para especificar um tipo de sada. O TOutput parmetro TYPE est restrita para implementar ICollection<TInput> (ICollection(Of TInput). no Visual Basic), para ser um tipo de referncia, e para que um construtor sem parmetros O mtodo tem um parmetro formal, que uma matriz de TInput. O mtodo retorna uma instncia TOutput que contm todos os elementos da matriz de entrada. Pode TOutput ser qualquer tipo a coleo genrica que implementa a ICollection interface genrico. Quando o cdigo executado, o conjunto dinmico salvo como DemoGenericMethod1.dll, e pode ser examinado usando o Disassembler MSIL (Ildasm.exe). Observao Uma boa maneira para aprender a emitir cdigo para gravar um programa que executa a tarefa voc est tentando se emitir, e use o Disassembler para examinar o MSIL produzido pelo compilador Visual Basic, C#, ou Visual C++.

Visual C# Consolidado

707

O exemplo de cdigo inclui cdigo de fonte que equivalente ao mtodo emitted. O mtodo emitted chamado vinculados as e tambm usando um representante genrico declarada no exemplo de cdigo. C#
using System; using System.Collections.Generic; using System.Reflection; using System.Reflection.Emit; // Declare a generic delegate that can be used to execute the // finished method. // public delegate TOut D<TIn, TOut>(TIn[] input); class GenericMethodBuilder { // This method shows how to declare, in Visual Basic, the generic // method this program emits. The method has two type parameters, // TInput and TOutput, the second of which must be a reference type // (class), must have a parameterless constructor (new()), and must // implement ICollection<TInput>. This interface constraint // ensures that ICollection<TInput>.Add can be used to add // elements to the TOutput object the method creates. The method // has one formal parameter, input, which is an array of TInput. // The elements of this array are copied to the new TOutput. // public static TOutput Factory<TInput, TOutput>(TInput[] tarray) where TOutput : class, ICollection<TInput>, new() { TOutput ret = new TOutput(); ICollection<TInput> ic = ret; foreach (TInput t in tarray) { ic.Add(t); } return ret; } public static void Main() { // The following shows the usage syntax of the C# // version of the generic method emitted by this program. // Note that the generic parameters must be specified // explicitly, because the compiler does not have enough // context to infer the type of TOutput. In this case, TOutput // is a generic List containing strings. // string[] arr = {"a", "b", "c", "d", "e"}; List<string> list1 = GenericMethodBuilder.Factory<string, List <string>>(arr); Console.WriteLine("The first element is: {0}", list1[0]); // Creating a dynamic assembly requires an AssemblyName // object, and the current application domain. // AssemblyName asmName = new AssemblyName("DemoMethodBuilder1"); AppDomain domain = AppDomain.CurrentDomain; AssemblyBuilder demoAssembly = domain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave); // Define the module that contains the code. For an // assembly with one module, the module name is the // assembly name plus a file extension. ModuleBuilder demoModule = demoAssembly.DefineDynamicModule(asmName.Name, asmName.Name+".dll"); // Define a type to contain the method. TypeBuilder demoType = demoModule.DefineType("DemoType", TypeAttributes.Public); // Define a public static method with standard calling // conventions. Do not specify the parameter types or the // return type, because type parameters will be used for // those types, and the type parameters have not been // defined yet. // MethodBuilder factory = demoType.DefineMethod("Factory", MethodAttributes.Public | MethodAttributes.Static); // Defining generic type parameters for the method makes it a // generic method. To make the code easier to read, each // type parameter is copied to a variable of the same name. // string[] typeParameterNames = {"TInput", "TOutput"}; GenericTypeParameterBuilder[] typeParameters = factory.DefineGenericParameters(typeParameterNames); GenericTypeParameterBuilder TInput = typeParameters[0]; GenericTypeParameterBuilder TOutput = typeParameters[1]; // Add special constraints. // The type parameter TOutput is constrained to be a reference // type, and to have a parameterless constructor. This ensures // that the Factory method can create the collection type. // TOutput.SetGenericParameterAttributes( GenericParameterAttributes.ReferenceTypeConstraint | GenericParameterAttributes.DefaultConstructorConstraint); // Add interface and base type constraints. // The type parameter TOutput is constrained to types that // implement the ICollection<T> interface, to ensure that // they have an Add method that can be used to add elements. // // To create the constraint, first use MakeGenericType to bind // the type parameter TInput to the ICollection<T> interface, // returning the type ICollection<TInput>, then pass // the newly created type to the SetInterfaceConstraints // method. The constraints must be passed as an array, even if // there is only one interface. // Type icoll =

Visual C# Consolidado

708

typeof(ICollection<>); Type icollOfTInput = icoll.MakeGenericType(TInput); Type[] constraints = {icollOfTInput}; TOutput.SetInterfaceConstraints(constraints); // Set parameter types for the method. The method takes // one parameter, an array of type TInput. Type[] parms = {TInput.MakeArrayType()}; factory.SetParameters(parms); // Set the return type for the method. The return type is // the generic type parameter TOutput. factory.SetReturnType(TOutput); // Generate a code body for the method. // ---------------------------------- // Get a code generator and declare local variables and // labels. Save the input array to a local variable. // ILGenerator ilgen = factory.GetILGenerator(); LocalBuilder retVal = ilgen.DeclareLocal(TOutput); LocalBuilder ic = ilgen.DeclareLocal(icollOfTInput); LocalBuilder input = ilgen.DeclareLocal(TInput.MakeArrayType()); LocalBuilder index = ilgen.DeclareLocal(typeof(int)); Label enterLoop = ilgen.DefineLabel(); Label loopAgain = ilgen.DefineLabel(); ilgen.Emit(OpCodes.Ldarg_0); ilgen.Emit(OpCodes.Stloc_S, input); // Create an instance of TOutput, using the generic method // overload of the Activator.CreateInstance method. // Using this overload requires the specified type to have // a parameterless constructor, which is the reason for adding // that constraint to TOutput. Create the constructed generic // method by passing TOutput to MakeGenericMethod. After // emitting code to call the method, emit code to store the // new TOutput in a local variable. // MethodInfo createInst = typeof(Activator).GetMethod("CreateInstance", Type.EmptyTypes); MethodInfo createInstOfTOutput = createInst.MakeGenericMethod(TOutput); ilgen.Emit(OpCodes.Call, createInstOfTOutput); ilgen.Emit(OpCodes.Stloc_S, retVal); // Load the reference to the TOutput object, cast it to // ICollection<TInput>, and save it. // ilgen.Emit(OpCodes.Ldloc_S, retVal); ilgen.Emit(OpCodes.Box, icollOfTInput); ilgen.Emit(OpCodes.Castclass, icollOfTInput); ilgen.Emit(OpCodes.Stloc_S, ic); // Loop through the array, adding each element to the new // instance of TOutput. Note that in order to get a MethodInfo // for ICollection<TInput>.Add, it is necessary to first // get the Add method for the generic type defintion, // ICollection<T>.Add. This is because it is not possible // to call GetMethod on icollOfTInput. The static overload of // TypeBuilder.GetMethod produces the correct MethodInfo for // the constructed type. // MethodInfo mAddPrep = icoll.GetMethod("Add"); MethodInfo mAdd = TypeBuilder.GetMethod(icollOfTInput, mAddPrep); // Initialize the count and enter the loop. ilgen.Emit(OpCodes.Ldc_I4_0); ilgen.Emit(OpCodes.Stloc_S, index); ilgen.Emit(OpCodes.Br_S, enterLoop); // Mark the beginning of the loop. Push the ICollection // reference on the stack, so it will be in position for the // call to Add. Then push the array and the index on the // stack, get the array element, and call Add (represented // by the MethodInfo mAdd) to add it to the collection. // // The other ten instructions just increment the index // and test for the end of the loop. Note the MarkLabel // method, which sets the point in the code where the // loop is entered. (See the earlier Br_S to enterLoop.) // ilgen.MarkLabel(loopAgain); ilgen.Emit(OpCodes.Ldloc_S, ic); ilgen.Emit(OpCodes.Ldloc_S, input); ilgen.Emit(OpCodes.Ldloc_S, index); ilgen.Emit(OpCodes.Ldelem, TInput); ilgen.Emit(OpCodes.Callvirt, mAdd); ilgen.Emit(OpCodes.Ldloc_S, index); ilgen.Emit(OpCodes.Ldc_I4_1); ilgen.Emit(OpCodes.Add); ilgen.Emit(OpCodes.Stloc_S, index); ilgen.MarkLabel(enterLoop); ilgen.Emit(OpCodes.Ldloc_S, index); ilgen.Emit(OpCodes.Ldloc_S, input); ilgen.Emit(OpCodes.Ldlen); ilgen.Emit(OpCodes.Conv_I4); ilgen.Emit(OpCodes.Clt); ilgen.Emit(OpCodes.Brtrue_S, loopAgain); ilgen.Emit(OpCodes.Ldloc_S, retVal); ilgen.Emit(OpCodes.Ret); // Complete the type. Type dt = demoType.CreateType(); // Save the assembly, so it can be examined with Ildasm.exe. demoAssembly.Save(asmName.Name+".dll"); // To create a constructed generic method that can be // executed, first call the GetMethod method on the completed // type to get the generic method definition. Call MakeGenericType // on the generic method definition to obtain the constructed // method, passing in the type arguments. In this case, the // constructed method has string for TInput and List<string> // for TOutput. // MethodInfo m = dt.GetMethod("Factory"); MethodInfo bound = m.MakeGenericMethod(typeof(string), typeof(List<string>)); // Display a string representing the bound method. Console.WriteLine(bound); // Once the generic method is constructed, // you can invoke it and pass

Visual C# Consolidado

709

in an array of objects // representing the arguments. In this case, there is only // one element in that array, the argument 'arr'. // object o = bound.Invoke(null, new object[]{arr}); List<string> list2 = (List<string>) o; Console.WriteLine("The first element is: {0}", list2[0]); // You can get better performance from multiple calls if // you bind the constructed method to a delegate. The // following code uses the generic delegate D defined // earlier. // Type dType = typeof(D<string, List <string>>); D<string, List <string>> test; test = (D<string, List <string>>) Delegate.CreateDelegate(dType, bound); List<string> list3 = test(arr); Console.WriteLine("The first element is: {0}", list3[0]); } } /* This code example produces the following output: The first element is: a System.Collections.Generic.List`1[System.String] Factory[String,List`1](System.String[]) The first element is: a The first element is: a */

Compilando o cdigo

O cdigo contm as instrues C# using (Imports. no Visual Basic) necessrio para compilao H referncias do conjunto adicionais so necessrias. Compilar o cdigo na linha de comando usando csc.exe, vbc.exe, ou CL.exe. Para compilar o cdigo no Visual Studio, coloque-o em um modelo de projeto de aplicativo de console.

Como Usar Assinatura Completa para Dar a um Assembly Dinmico um Nome Forte
Um conjunto dinmico pode ser fornecido um nome de alta segurana usando assinatura parcial ou completo assinatura. Do AssemblyName para assinatura parcial, a chave pblica deve ser especificada no passado para o DefineDynamicAssembly mtodo. O Common Language Runtime aloca o espao dentro do arquivo executvel (PE) porttil para um BLOB de assinatura nome de alta segurana, mas na verdade no no assinar o conjunto. O conjunto resultante pode totalmente entrar em uma etapa Post-Processing usando ferramentas fornecidas no SDK do .NET Framework. Para completo assinatura, um par de chaves pblica / particular deve ser fornecido. Essas entidades so normalmente armazenadas em um arquivo ou disco ou em um recipiente de chave Propriedade por uma API criptografia Cryptographic Provider (CSP) Service. Chaves de baixa segurana so geralmente gerado pelo CSPs baseados em software e exportado para um arquivo para que eles podem ser verificados em sistemas de gerenciamento de cdigo de fonte durante o desenvolvimento do projeto. Chaves de alta segurana geralmente so gerados por hardware que geralmente ajuda a evitar exportao das teclas para razes de segurana. Tais pares de chaves s podem ser acessados indiretamente por um recipiente de chave. O par de chaves nome de alta segurana especificado usando a System.Reflection.StrongNameKeyPair classe. O exemplo a seguir demonstra uso completo assinatura para dar um conjunto dinmico um nome de alta segurana. Exemplo C#
FileStream fs = new FileStream("SomeKeyPair.snk", FileMode.Open); StrongNameKeyPair kp = new StrongNameKeyPair(fs); fs.Close(); AssemblyName an = new AssemblyName(); an.KeyPair = kp; AppDomain appDomain = Thread.GetDomain(); AssemblyBuilder ab = appDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.RunAndSave);

Como Carregar Assemblies no Contexto Somente de Reflexo

Visual C# Consolidado

710

O contexto de carga somente Reflection-permite-lhe examinar Conjuntos compilados a outras plataformas ou de outras verses do .NET Framework. Cdigo carregado neste contexto somente pode ser examinado; ele no pode ser executado. Isso significa que objetos no podem ser criados, porque os construtores no podem ser executadas. Porque o cdigo no pode ser executado, Dependncias no so carregadas automaticamente. Caso voc precise examin-los, voc deve carreg-los voc mesmo. Para carregar um conjunto no contexto de carga somente Reflection1. Use a ReflectionOnlyLoad sobrecarga mtodo para carregar o conjunto fornecido seu nome de exibio, ou o ReflectionOnlyLoadFrom mtodo para carregar o conjunto fornecido seu caminho. Se o conjunto for uma imagem binria, use a ReflectionOnlyLoad sobrecarga mtodo. Observao No use o contexto somente Reflection-para carregar uma verso de mscorlib.dll de uma verso do .NET Framework diferente da verso no contexto de execuo. 2. 3. 4. Se o conjunto possui dependncias, o ReflectionOnlyLoad mtodo no carregar-los. Caso voc precise examin-los, voc deve carreg-los voc mesmo,. Determinar se um conjunto carregado do contexto somente Reflection-usando propriedade do conjunto ReflectionOnly. Se atributos foram aplicados para o conjunto ou a tipos no conjunto, examine esses atributos, usando a CustomAttributeData classe para assegurar que nenhuma tentativa realizada para executar cdigo em um contexto somente Reflection-. Use a sobrecarga do System.Reflection.CustomAttributeData.GetCustomAttributes(System.Reflection.Assembly) mtodo apropriada para obter CustomAttributeData objetos que representam os atributos aplicados a um conjunto, membro, Mdulo, ou parmetro. Observao Atributos aplicados para o conjunto ou seu contedo para podem ser definidos no conjunto, ou que pode ser definida em outro conjunto carregado do contexto somente Reflection-. No possvel saber antecipadamente onde os atributos so definidos. Exemplo O exemplo de cdigo a seguir mostra como examinar os atributos aplicados a um conjunto carregado do contexto somente Reflection-. O exemplo de cdigo define um atributo com dois Construtores e uma propriedade personalizado. O atributo aplicado ao conjunto, para um tipo declarado no conjunto, para um mtodo do tipo, e para um parmetro do mtodo. Quando executado, o conjunto carrega prprio para o contexto somente Reflection-e exibe informaes sobre os atributos personalizados que foram aplicadas para ele e para os tipos e membros que ele contm. Observao Para simplificar exemplo de cdigo, o conjunto carrega e examina prprio. Normalmente, voc no deve esperar localizar o mesmo conjunto carregado no contexto de execuo e o contexto somente Reflection-.

Visual C# Consolidado

711

C#
using System; using System.Reflection; using System.Collections.Generic; // The example attribute is applied to the assembly. [assembly:Example(ExampleKind.ThirdKind, Note="This is a note on the assembly.")] // An enumeration used by the ExampleAttribute class. public enum ExampleKind { FirstKind, SecondKind, ThirdKind, FourthKind }; // An example attribute. The attribute can be applied to all // targets, from assemblies to parameters. // [AttributeUsage(AttributeTargets.All)] public class ExampleAttribute : Attribute { // Data for properties. private ExampleKind kindValue; private string noteValue; // Constructors. The parameterless constructor (.ctor) calls // the constructor that specifies ExampleKind, and supplies the // default value. // public ExampleAttribute(ExampleKind initKind) { kindValue = initKind; } public ExampleAttribute() : this(ExampleKind.FirstKind) {} // Properties. The Note property must be read/write, so that it // can be used as a named parameter. // public ExampleKind Kind { get { return kindValue; }} public string Note { get { return noteValue; } set { noteValue = value; } } } // The example attribute is applied to the test class. // [Example(ExampleKind.SecondKind, Note="This is a note on the class.")] public class Test { // The example attribute is applied to a method, using the // parameterless constructor and supplying a named argument. // The attribute is also applied to the method parameter. // [Example(Note="This is a note on a method.")] public void TestMethod([Example] object arg) { } // Main() gets objects representing the assembly, the test // type, the test method, and the method parameter. Custom // attribute data is displayed for each of these. // public static void Main() { Assembly asm = Assembly.ReflectionOnlyLoad("Source"); Type t = asm.GetType("Test"); MethodInfo m = t.GetMethod("TestMethod"); ParameterInfo[] p = m.GetParameters(); Console.WriteLine("\r\nAttributes for assembly: {0}", asm); ShowAttributeData(CustomAttributeData.GetCustomAttributes(asm)); Console.WriteLine("\r\nAttributes for type: {0}", t); ShowAttributeData(CustomAttributeData.GetCustomAttributes(t)); Console.WriteLine("\r\nAttributes for member: {0}", m); ShowAttributeData(CustomAttributeData.GetCustomAttributes(m)); Console.WriteLine("\r\nAttributes for parameter: {0}", p); ShowAttributeData(CustomAttributeData.GetCustomAttributes(p[0])); } private static void ShowAttributeData( IList<CustomAttributeData> attributes) { foreach( CustomAttributeData cad in attributes ) { Console.WriteLine(" {0}", cad); Console.WriteLine(" Constructor: {0}", cad.Constructor); Console.WriteLine(" Constructor arguments:"); foreach( CustomAttributeTypedArgument cata in cad.ConstructorArguments ) { Console.WriteLine(" Type: {0} Value: {1}", cata.ArgumentType, cata.Value); } Console.WriteLine(" Named arguments:"); foreach( CustomAttributeNamedArgument cana in cad.NamedArguments ) { CustomAttributeTypedArgument cata = cana.TypedValue; Console.WriteLine(" MemberInfo: {0}", cana.MemberInfo); Console.WriteLine(" Type: {0} Value: {1}", cata.ArgumentType, cata.Value); } } } } /* This code example produces output similar to the following: Attributes for assembly: source, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null [ExampleAttribute((ExampleKind)2, Note = "This is a note on the assembly.")] Constructor: Void .ctor(ExampleKind) Constructor arguments: Type: ExampleKind Value: 2 Named arguments: MemberInfo: System.String Note Type: System.String Value: This is a note on the assembly. [System.Runtime.CompilerServices.CompilationRelaxationsAttribute((Int32)8)] Constructor: Void .ctor(Int32) Constructor arguments: Type: System.Int32 Value: 8 Named arguments: Attributes for type: Test [ExampleAttribute((ExampleKind)1, Note = "This is a note on the class.")] Constructor: Void .ctor(ExampleKind) Constructor arguments: Type: ExampleKind Value: 1 Named arguments: MemberInfo: System.String Note Type: System.String Value: This is a note on the class. Attributes for member: Void TestMethod(System.Object) [ExampleAttribute(Note = "This is a note on a method.")] Constructor: Void .ctor() Constructor arguments: Named arguments: MemberInfo: System.String

Visual C# Consolidado

712

Note Type: System.String Value: This is a note on a method. Attributes for parameter: System.Object arg [ExampleAttribute()] Constructor: Void .ctor() Constructor arguments: Named arguments: */

Como Definir um Tipo Genrico com Emisso de Reflexo


Este tpico mostra como criar um tipo genrico simples com parmetros dois tipo, como aplicar restries de classe, restries de interface, e restries especiais aos parmetros tipo, e como criar membros que usam os parmetros os tipo de classe como tipos de parmetro e tipos de retorno. Importante Um mtodo no genrico apenas porque ela pertence a um tipo genrico e usa os parmetros Tipo do mesmo tipo. Um mtodo somente se tiver sua prpria lista de Parmetro tipo genrico. A maioria dos mtodos em tipos genricos so no genricos, como no exemplo. Para obter um exemplo de emissor um mtodo genrico, consulte Como Definir um Mtodo genrico com Emisso de Reflexo. Para definir um tipo genrico 1. Definir um conjunto dinmico chamado GenericEmitExample1. Neste exemplo, o conjunto executado e salvo no disco, para System.Reflection.Emit.AssemblyBuilderAccess.RunAndSave for especificado. C#
AppDomain myDomain = AppDomain.CurrentDomain; AssemblyName myAsmName = new AssemblyName("GenericEmitExample1"); AssemblyBuilder myAssembly = myDomain.DefineDynamicAssembly(myAsmName, AssemblyBuilderAccess.RunAndSave);

2.

Definir um mdulo dinmico. Formado um conjunto de mdulos executveis. Para um conjunto de mdulo nico, o nome do mdulo o mesmo como o nome do conjunto, e o nome do arquivo o nome do mdulo mais uma extenso. C#
ModuleBuilder myModule = myAssembly.DefineDynamicModule(myAsmName.Name, myAsmName.Name + ".dll");

3.

Definir uma classe. Neste exemplo, a classe chamada Sample. C#


TypeBuilder myType = myModule.DefineType("Sample", TypeAttributes.Public);

4.

Definir os parmetros de Sample tipo genrico ao passar uma matriz de seqncias de caracteres que contm os nomes dos parmetros para o System.Reflection.Emit.TypeBuilder.DefineGenericParameters(System.String[]) mtodo. Isso torna a classe um tipo genrico. O valor de retorno uma matriz de GenericTypeParameterBuilder objetos que representam os parmetros Tipo, que podem ser usados em seu cdigo emitted. No cdigo a seguir, Sample se torna um tipo genrico com parmetros TFirst Tipo e TSecond. Para facilitar a leitura, o cdigo cada GenericTypeParameterBuilder colocada em uma varivel com o mesmo nome como o parmetro de tipo. C#

Visual C# Consolidado

713

string[] typeParamNames = {"TFirst", "TSecond"}; GenericTypeParameterBuilder[] typeParams = myType.DefineGenericParameters(typeParamNames); GenericTypeParameterBuilder TFirst = typeParams[0]; GenericTypeParameterBuilder TSecond = typeParams[1];

5.

Adicionar restries especiais aos parmetros tipo. Neste exemplo, parmetro TFirst tipo restrito para tipos que tenham construtor sem parmetros, e para tipos de referncia. C#
TFirst.SetGenericParameterAttributes( GenericParameterAttributes.DefaultConstructorConstraint | GenericParameterAttributes.ReferenceTypeConstraint);

6.

Opcionalmente, Adicionar Classe e interface restries aos parmetros tipo. Neste exemplo, parmetro TFirst tipo restrito aos tipos que derivar da classe base representado pelo objeto Type contido na varivel baseType, e que implementam as interfaces cujos tipos esto contidas nas variveis interfaceA e interfaceB. Consulte o exemplo de cdigo para a declarao e atribuio dessas variveis. C#
TSecond.SetBaseTypeConstraint(baseType); Type[] interfaceTypes = {interfaceA, interfaceB}; TSecond.SetInterfaceConstraints(interfaceTypes);

7.

Definir um campo. Neste exemplo, o tipo do campo especificado pelo parmetro TFirst tipo. Derivar GenericTypeParameterBuilder de Type, portanto, voc pode utilizar parmetros tipo genrico em qualquer lugar um tipo pode ser usado. C#
FieldBuilder exField = myType.DefineField("ExampleField", TFirst, FieldAttributes.Private);

8.

Definir um mtodo que usa os parmetros Tipo do tipo genrico. Observe que esses mtodos so no genricos a menos que tenham suas prprias listas de Parmetro tipo. O cdigo a seguir define um static mtodo (Shared. (List(Of TFirst)) que contm todos os elementos da matriz que usa uma matriz de TFirst e retorna) no Visual Basic No Visual Basic um List<TFirst> Para definir esse mtodo, necessrio para criar o tipo List<TFirst>, chamando MakeGenericType na definio tipo genrico, List<T>. (The T is omitted when you use the typeof operator (GetType in Visual Basic) to get the generic type definition.) O tipo de parmetro criado, usando o MakeArrayType mtodo. C#
Type listOf = typeof(List<>); Type listOfTFirst = listOf.MakeGenericType(TFirst); Type[] mParamTypes = {TFirst.MakeArrayType()}; MethodBuilder exMethod = myType.DefineMethod("ExampleMethod", MethodAttributes.Public | MethodAttributes.Static, listOfTFirst, mParamTypes);

9.

Emitir o corpo de mtodo. O corpo de mtodo consiste de operao trs trs 8087 que carregam a matriz entrada na pilha, chamar o List<TFirst> Construtor que leva IEnumerable<TFirst> (que faz todo o trabalho de colocar os elementos entrados para a lista), e retornar (deixando o novo List objeto na Pilha). A parte difcil do emissor esse cdigo estiver obtendo o construtor. No h suporte para o GetConstructor mtodo no portanto, possvel para obter o Construtor de List<TFirst> diretamente. a GenericTypeParameterBuilder, Primeiro, necessrio para obter o construtor da definio List<T> do tipo genrico e que a converte para chamar um mtodo para o construtor correspondente de List<TFirst>. Leva o construtor usado para este exemplo de cdigo um IEnumerable<T>. Observe, contudo, no a definio da interface genrica do IEnumerable tipo genrico que este ; em vez disso, o parmetro T do List<T> tipo deve ser substitudo para o parmetro T de tipo de IEnumerable<T>. (This seems confusing only because both types have type parameters

Visual C# Consolidado

714

named T. That Is Por que este exemplo de cdigo usa os nomes TFirst e TSecond). Para obter o tipo de argumento de construtor, inicie com a definio IEnumerable<T> tipo genrico e chamada MakeGenericType com o primeiro parmetro do List<T> tipo genrico. A lista de argumentos de construtor deve ser passada como uma matriz, com apenas um argumento, nesse caso. Observao A definio tipo genrico expresso como IEnumerable<> Quando voc usa o typeof operador em C#, ou IEnumerable(Of ) Quando voc usa o GetType operador no Visual Basic. Agora possvel para obter o Construtor de List<T> chamando GetConstructor na definio tipo genrico. Para converter esse construtor para o construtor de List<TFirst>, secreta List<TFirst> correspondente e o Construtor de List<T> para o mtodo esttico System.Reflection.Emit.TypeBuilder.GetConstructor(System.Type,System.Reflection.Constr uctorInfo). C#
ILGenerator ilgen = exMethod.GetILGenerator(); Type ienumOf = typeof(IEnumerable<>); Type TfromListOf = listOf.GetGenericArguments()[0]; Type ienumOfT = ienumOf.MakeGenericType(TfromListOf); Type[] ctorArgs = {ienumOfT}; ConstructorInfo ctorPrep = listOf.GetConstructor(ctorArgs); ConstructorInfo ctor = TypeBuilder.GetConstructor(listOfTFirst, ctorPrep); ilgen.Emit(OpCodes.Ldarg_0); ilgen.Emit(OpCodes.Newobj, ctor); ilgen.Emit(OpCodes.Ret);

10. Criar o tipo e salvar o arquivo. C#


Type finished = myType.CreateType(); myAssembly.Save(myAsmName.Name+".dll");

11. Chamar o mtodo. ExampleMethod No genricas, mas o tipo ele pertence a genrico; portanto, a fim de obter uma MethodInfo que pode ser chamado ele necessrias para criar um tipo construdo da definio do tipo para Sample. O tipo construdo usa a Example classe, que satisfaa as restries em TFirst porque ele um tipo de referncia e tem um construtor sem parmetros padro, e a ExampleDerived classe que satisfaa as restries no TSecond. (O cdigo para ExampleDerived pode ser encontrado na seo a cdigo exemplo.) Esses dois tipos so passados para MakeGenericType para criar o tipo construdo. O MethodInfo ento obtida atravs do GetMethod mtodo. C#
Type[] typeArgs = {typeof(Example), typeof(ExampleDerived)}; Type constructed = finished.MakeGenericType(typeArgs); MethodInfo mi = constructed.GetMethod("ExampleMethod");

12. O cdigo a seguir cria uma matriz de Example Objetos, coloca essa matriz em uma matriz do tipo Object que representa os argumentos do mtodo para ser chamado, e transmite-los para o Invoke mtodo. O primeiro argumento do mtodo Invoke uma referncia nula porque o mtodo static. C#
Example[] input = {new Example(), new Example()}; object[] arguments = {input}; List<Example> listX = (List<Example>) mi.Invoke(null, arguments); Console.WriteLine( "\nThere are {0} elements in the List<Example>.", listX.Count);

Exemplo

Visual C# Consolidado

715

O exemplo de cdigo a seguir define uma classe nomeado Sample, junto com uma classe base e duas interfaces. O programa define dois parmetros tipo genrico para Sample, transformando-lo em um tipo genrico. Parmetros tipo so a nica coisa que faz um tipo genrica. O programa mostra isso, exibindo uma mensagem de teste antes e depois a definio de tipo os parmetros. O parmetro TSecond tipo usado para demonstrar restries classe e interface, usando a classe base e interfaces, e o parmetro TFirst de tipo usado para demonstrar restries especiais. O exemplo de cdigo define um campo e um mtodo usando parmetros tipo a classe para o tipo de campo e para o parmetro e retornar tipo do mtodo. Depois que a Sample classe foi criada, o mtodo chamado. O programa inclui um mtodo que lista informaes sobre um tipo genrico, e um mtodo que lista as restries especiais em um parmetro tipo. Esses mtodos so usados para exibir informaes sobre a classe concluda Sample. Do Disassembler MSIL (Ildasm.exe) o programa salvar o mdulo terminado em disco como GenericEmitExample1.dll, para que voc possa abri-lo com e examine o MSIL para a Sample classe. C#
using System; using System.Reflection; using System.Reflection.Emit; using System.Collections.Generic; // Define a trivial base class and two trivial interfaces // to use when demonstrating constraints. // public class ExampleBase {} public interface IExampleA {} public interface IExampleB {} // Define a trivial type that can substitute for type parameter // TSecond. // public class ExampleDerived : ExampleBase, IExampleA, IExampleB {} public class Example { public static void Main() { // Define a dynamic assembly to contain the sample type. The // assembly will not be run, but only saved to disk, so // AssemblyBuilderAccess.Save is specified. // AppDomain myDomain = AppDomain.CurrentDomain; AssemblyName myAsmName = new AssemblyName("GenericEmitExample1"); AssemblyBuilder myAssembly = myDomain.DefineDynamicAssembly(myAsmName, AssemblyBuilderAccess.RunAndSave); // An assembly is made up of executable modules. For a single- // module assembly, the module name and file name are the same // as the assembly name. // ModuleBuilder myModule = myAssembly.DefineDynamicModule(myAsmName.Name, myAsmName.Name + ".dll"); // Get type objects for the base class trivial interfaces to // be used as constraints. // Type baseType = typeof(ExampleBase); Type interfaceA = typeof(IExampleA); Type interfaceB = typeof(IExampleB); // Define the sample type. // TypeBuilder myType = myModule.DefineType("Sample", TypeAttributes.Public); Console.WriteLine("Type 'Sample' is generic: {0}", myType.IsGenericType); // Define type parameters for the type. Until you do this, // the type is not generic, as the preceding and following // WriteLine statements show. The type parameter names are // specified as an array of strings. To make the code // easier to read, each GenericTypeParameterBuilder is placed // in a variable with the same name as the type parameter. // string[] typeParamNames = {"TFirst", "TSecond"}; GenericTypeParameterBuilder[] typeParams = myType.DefineGenericParameters(typeParamNames); GenericTypeParameterBuilder TFirst = typeParams[0]; GenericTypeParameterBuilder TSecond = typeParams[1]; Console.WriteLine("Type 'Sample' is generic: {0}", myType.IsGenericType); // Apply constraints to the type parameters. // // A type that is substituted for the first parameter, TFirst, // must be a reference type and must have a parameterless // constructor. TFirst.SetGenericParameterAttributes( GenericParameterAttributes.DefaultConstructorConstraint | GenericParameterAttributes.ReferenceTypeConstraint); // A type that is substituted for the second type // parameter must implement IExampleA and IExampleB, and // inherit from the trivial test class

Visual C# Consolidado

716

ExampleBase. The // interface constraints are specified as an array // containing the interface types. TSecond.SetBaseTypeConstraint(baseType); Type[] interfaceTypes = {interfaceA, interfaceB}; TSecond.SetInterfaceConstraints(interfaceTypes); // The following code adds a private field named ExampleField, // of type TFirst. FieldBuilder exField = myType.DefineField("ExampleField", TFirst, FieldAttributes.Private); // Define a static method that takes an array of TFirst and // returns a List<TFirst> containing all the elements of // the array. To define this method it is necessary to create // the type List<TFirst> by calling MakeGenericType on the // generic type definition, List<T>. (The T is omitted with // the typeof operator when you get the generic type // definition.) The parameter type is created by using the // MakeArrayType method. // Type listOf = typeof(List<>); Type listOfTFirst = listOf.MakeGenericType(TFirst); Type[] mParamTypes = {TFirst.MakeArrayType()}; MethodBuilder exMethod = myType.DefineMethod("ExampleMethod", MethodAttributes.Public | MethodAttributes.Static, listOfTFirst, mParamTypes); // Emit the method body. // The method body consists of just three opcodes, to load // the input array onto the execution stack, to call the // List<TFirst> constructor that takes IEnumerable<TFirst>, // which does all the work of putting the input elements into // the list, and to return, leaving the list on the stack. The // hard work is getting the constructor. // // The GetConstructor method is not supported on a // GenericTypeParameterBuilder, so it is not possible to get // the constructor of List<TFirst> directly. There are two // steps, first getting the constructor of List<T> and then // calling a method that converts it to the corresponding // constructor of List<TFirst>. // // The constructor needed here is the one that takes an // IEnumerable<T>. Note, however, that this is not the // generic type definition of IEnumerable<T>; instead, the // T from List<T> must be substituted for the T of // IEnumerable<T>. (This seems confusing only because both // types have type parameters named T. That is why this example // uses the somewhat silly names TFirst and TSecond.) To get // the type of the constructor argument, take the generic // type definition IEnumerable<T> (expressed as // IEnumerable<> when you use the typeof operator) and // call MakeGenericType with the first generic type parameter // of List<T>. The constructor argument list must be passed // as an array, with just one argument in this case. // // Now it is possible to get the constructor of List<T>, // using GetConstructor on the generic type definition. To get // the constructor of List<TFirst>, pass List<TFirst> and // the constructor from List<T> to the static // TypeBuilder.GetConstructor method. // ILGenerator ilgen = exMethod.GetILGenerator(); Type ienumOf = typeof(IEnumerable<>); Type TfromListOf = listOf.GetGenericArguments()[0]; Type ienumOfT = ienumOf.MakeGenericType(TfromListOf); Type[] ctorArgs = {ienumOfT}; ConstructorInfo ctorPrep = listOf.GetConstructor(ctorArgs); ConstructorInfo ctor = TypeBuilder.GetConstructor(listOfTFirst, ctorPrep); ilgen.Emit(OpCodes.Ldarg_0); ilgen.Emit(OpCodes.Newobj, ctor); ilgen.Emit(OpCodes.Ret); // Create the type and save the assembly. Type finished = myType.CreateType(); myAssembly.Save(myAsmName.Name+".dll"); // Invoke the method. // ExampleMethod is not generic, but the type it belongs to is // generic, so in order to get a MethodInfo that can be invoked // it is necessary to create a constructed type. The Example // class satisfies the constraints on TFirst, because it is a // reference type and has a default constructor. In order to // have a class that satisfies the constraints on TSecond, // this code example defines the ExampleDerived type. These // two types are passed to MakeGenericMethod to create the // constructed type. // Type[] typeArgs = {typeof(Example), typeof(ExampleDerived)}; Type constructed = finished.MakeGenericType(typeArgs); MethodInfo mi = constructed.GetMethod("ExampleMethod"); // Create an array of Example objects, as input to the generic // method. This array must be passed as the only element of an // array of arguments. The first argument of Invoke is // null, because ExampleMethod is static. Display the count // on the resulting List<Example>. // Example[] input = {new Example(), new Example()}; object[] arguments = {input}; List<Example> listX = (List<Example>) mi.Invoke(null, arguments); Console.WriteLine( "\nThere are {0} elements in the List<Example>.", listX.Count); DisplayGenericParameters(finished); } private static void

Visual C# Consolidado

717

DisplayGenericParameters(Type t) { if (!t.IsGenericType) { Console.WriteLine("Type '{0}' is not generic."); return; } if (!t.IsGenericTypeDefinition) { t = t.GetGenericTypeDefinition(); } Type[] typeParameters = t.GetGenericArguments(); Console.WriteLine("\nListing {0} type parameters for type '{1}'.", typeParameters.Length, t); foreach( Type tParam in typeParameters ) { Console.WriteLine("\r\nType parameter {0}:", tParam.ToString()); foreach( Type c in tParam.GetGenericParameterConstraints() ) { if (c.IsInterface) { Console.WriteLine(" Interface constraint: {0}", c); } else { Console.WriteLine(" Base type constraint: {0}", c); } } ListConstraintAttributes(tParam); } } // List the constraint flags. The GenericParameterAttributes // enumeration contains two sets of attributes, variance and // constraints. For this example, only constraints are used. // private static void ListConstraintAttributes(Type t) { // Mask off the constraint flags. GenericParameterAttributes constraints = t.GenericParameterAttributes & GenericParameterAttributes.SpecialConstraintMask; if ((constraints & GenericParameterAttributes.ReferenceTypeConstraint) != GenericParameterAttributes.None) { Console.WriteLine(" ReferenceTypeConstraint"); } if ((constraints & GenericParameterAttributes.NotNullableValueTypeConstraint) != GenericParameterAttributes.None) { Console.WriteLine(" NotNullableValueTypeConstraint"); } if ((constraints & GenericParameterAttributes.DefaultConstructorConstraint) !=GenericParameterAttributes.None) { Console.WriteLine(" DefaultConstructorConstraint"); } } } /* This code example produces the following output: Type 'Sample' is generic: False Type 'Sample' is generic: True There are 2 elements in the List<Example>. Listing 2 type parameters for type 'Sample[TFirst,TSecond]'. Type parameter TFirst: ReferenceTypeConstraint DefaultConstructorConstraint Type parameter TSecond: Interface constraint: IExampleA Interface constraint: IExampleB Base type constraint: ExampleBase */

Compilando o cdigo

O cdigo contm as instrues C# using (Imports. no Visual Basic) necessrio para compilao H referncias do conjunto adicionais so necessrias. Compilar o cdigo na linha de comando usando csc.exe, vbc.exe, ou CL.exe. Para compilar o cdigo no Visual Studio, coloque-o em um modelo de projeto de aplicativo de console.

Visual C# Consolidado

718

Explicaes Passo-a-passo do .NET Framework SDK

Passo-a-passo: Adicionando Marcas Inteligentes a um Componente do Windows Forms


Marcas inteligentes so semelhantes menu-Usurio elementos Interface (UI) que fornecer comumente usadas opes em tempo de design. A maioria dos componentes padro e controles fornecidos com o .NET Framework contm marca inteligente e melhorias de verbo Designer. Os procedimentos nessa explicao passo a passo mostram como para adicionar suporte de marca inteligente componentes e controles personalizados Voc. Voc pode adicionar marcas inteligentes para componentes formulrios janela s opes Designtime de fornecimento comumente usado. Itens em um painel Marca Inteligente-logicamente so agrupados por categoria, e ocorrncias individuais DesignerActionMethodItem opcionalmente podem ser duplicadas como entradas de verbo Designer. Muitos dos componentes padro e controles fornecidos com o .NET Framework conter marca inteligente e melhorias de verbo Designer. Componente e autores controle personalizado tambm podem adicionar suporte de marca inteligente, normalmente usando o modelo de envio. Adicionar marcas inteligentes com o modelo de envio requer as seguintes adies ao projeto componente:

Implementao de uma classe, derivado DesignerActionList, que define a mtodos e propriedades que so alvos de itens de menu de marcas inteligentes. Esta classe tambm pode fornecer um mtodo substitudo GetSortedActionItems que retorna uma matriz de DesignerActionItem instncias. A classe designer associado ao componente deve implementar a ActionLists propriedade. Recuperar esta propriedade fornece a DesignerActionListCollection que contm todas as DesignerActionList instncias associadas a um nico menu de marcas inteligentes. Geralmente h apenas uma lista em tal uma coleo.

O procedimento a seguir demonstra como adicionar marcas inteligentes usando cdigo de um controle exemplo simples, ColorLabel,. que derivado do controle Windows Forms Label padro Este controle tem um designer associado chamado ColorLabelDesigner. Para copiar o cdigo deste tpico como uma lista simples, consulte COMO: Anexar marcas inteligentes para um componente de formulrios do Windows. Pr-requisitos A fim de concluir este explicao passo a passo, ser necessrio:

Permisses suficientes para poder para criar e executar projetos do aplicativo Windows Forms no computador onde o .NET Framework instalado. Para implementar uma classe derivada de DesignerActionList 1. No mesmo espao para nome que o componente, adicione a declarao para a classe derivada de DesignerActionList. C#

Visual C# Consolidado

719

public class ColorLabelActionList : System.ComponentModel.Design.DesignerActionList

2.

Adicionar um construtor a esta classe que leva uma instncia do controle associado. Fornecer um campo particular para manter uma referncia a essa instncia. Tambm fornecer um campo particular para cache uma referncia DesignerActionService. Isso ser usado para atualizar a lista. C#
private ColorLabel colLabel;

C#
private DesignerActionUIService designerActionUISvc = null;

C#
public ColorLabelActionList( IComponent component ) : base(component) { this.colLabel = component as ColorLabel; // Cache a reference to DesignerActionUIService, so the // DesigneractionList can be refreshed. this.designerActionUISvc = GetService(typeof(DesignerActionUIService)) as DesignerActionUIService; }

3.

Adicionar mtodos e propriedades que voc deseja associar aos itens de marcas inteligentes. Mtodos sero executados quando sua entrada de marca inteligente correspondente selecionada. Propriedades devem ter sees Getter para que seu valor atual seja exibido; eles opcionalmente podem ter sees setter que use o GetProperties mtodo se seus valores tiverem que ser editvel da entrada de marca inteligente correspondente. Observao Como o caso em todo o ambiente Design-time, uma propriedade capaz de sendo editados somente se um dos tipos base fornecida pelo .NET Framework, o tipo pode ser convertido em um tipo base por um fornecido TypeConverter, ou quando um personalizado UITypeEditor fornecido.

C#
public Color ForeColor { get { return colLabel.ForeColor; } set { GetPropertyByName("ForeColor").SetValue(colLabel, value); } }

C#
// Boolean properties are automatically displayed with binary // UI (such as a checkbox). public bool LockColors { get { return colLabel.ColorLocked; } set { GetPropertyByName("ColorLocked").SetValue(colLabel, value); // Refresh the list. this.designerActionUISvc.Refresh(this.Component); } }

C#
public void InvertColors() { Color currentBackColor = colLabel.BackColor; BackColor = Color.FromArgb( 255 - currentBackColor.R, 255 - currentBackColor.G, 255 - currentBackColor.B); Color currentForeColor = colLabel.ForeColor; ForeColor = Color.FromArgb( 255 - currentForeColor.R, 255 - currentForeColor.G, 255 - currentForeColor.B); }

4.

Opcionalmente, implementar uma verso do GetSortedActionItems mtodo para retornar uma matriz de DesignerActionItem instncias, onde cada item est associado a uma propriedade ou mtodo criado na etapa anterior a substitudo. Faa isso para alterar a

Visual C# Consolidado

720

ordem dos itens, categoriz-los, ou opcionalmente mostr-las. A lista tambm pode incluir estticos itens, como ttulos grupo lgico. C#
public override DesignerActionItemCollection GetSortedActionItems() { DesignerActionItemCollection items = new DesignerActionItemCollection(); //Define static section header entries. items.Add(new DesignerActionHeaderItem("Appearance")); items.Add(new DesignerActionHeaderItem("Information")); //Boolean property for locking color selections. items.Add(new DesignerActionPropertyItem("LockColors", "Lock Colors", "Appearance", "Locks the color properties.")); if (!LockColors) { items.Add(new DesignerActionPropertyItem("BackColor", "Back Color", "Appearance", "Selects the background color.")); items.Add(new DesignerActionPropertyItem("ForeColor", "Fore Color", "Appearance", "Selects the foreground color.")); //This next method item is also added to the context menu // (as a designer verb). items.Add(new DesignerActionMethodItem(this, "InvertColors", "Invert Colors", "Appearance", "Inverts the fore and background colors.", true)); } items.Add(new DesignerActionPropertyItem("Text", "Text String", "Appearance", "Sets the display text.")); //Create entries for static Information section. StringBuilder location = new StringBuilder("Location: "); location.Append(colLabel.Location); StringBuilder size = new StringBuilder("Size: "); size.Append(colLabel.Size); items.Add(new DesignerActionTextItem(location.ToString(), "Information")); items.Add(new DesignerActionTextItem(size.ToString(), "Information")); return items; }

Para atualizar a classe Designer associada para implementar a propriedade ActionLists 1. Localize a classe Designer para o controle. Se um no existir, crie uma classe designer e associ-la para a classe de controle. Para obter mais informaes sobre designers, consulte Base classes do criador. Como uma tcnica de otimizao, adicionar um campo particular do tipo DesignerActionListCollection. C#
private DesignerActionListCollection actionLists;

2.

3.

Adicionar a propriedade substituda ActionLists para retornar uma nova instncia da classe ColorLabelActionList que voc criou anteriormente. C#
public override DesignerActionListCollection ActionLists { get { if (null == actionLists) { actionLists = new DesignerActionListCollection(); actionLists.Add( new ColorLabelActionList(this.Component)); } return actionLists; } }

Comentrios Vrias reas do cdigo merece uma explicao mais detalhada:

Quando uma propriedade ou mtodo na classe derivada de DesignerActionList Alteraes o estado do controle associado, essas alteraes no devem ser feitas por chamadas setter direta para propriedades do componente. Em vez disso, essas alteraes devem ser feitas atravs de adequadamente criado PropertyDescriptor um. Essa abordagem indireta garante que desfazer de marcas inteligentes e UI atualize funo aes corretamente. Dinamicamente voc pode atualizar o painel de marca inteligente, chamando System.ComponentModel.Design.DesignerActionUIService.Refresh(System.ComponentModel. IComponent). Este processo pode ser usado para alterar dinamicamente o contedo do painel

Visual C# Consolidado

721

de marca inteligente. No exemplo, as marcas inteligentes referentes ao alterar as cores so condicionalmente includas de acordo com o estado da propriedade LockColors. Esta propriedade Boolean tambm associada a uma marca inteligente, portanto, o desenvolvedor pode bloquear ou desbloquear a seleo de cores atual, pelo menos atravs do menu.

Opcionalmente, uma entrada de tipo DesignerActionMethodItem de marca inteligente pode ser includa no menu de atalho para o controle associado, definindo o includeAsDesignerVerb parmetro no construtor para true. O.NET Framework implicitamente cria um correspondente DesignerVerb e adiciona-ao menu de atalho para voc. Neste exemplo, o InvertColors item tratado dessa maneira. Itens de marcas inteligentes so agrupados em um painel pela sua Category Propriedade, que definida no construtor para cada item. Se essa propriedade for no explicitamente definida, ele atribudo categoria padro. Cada item ordenada no painel de marca inteligente por categoria, depois pela ordem da ocorrncia na matriz DesignerActionItem retornado pela classe derivada da DesignerActionList classe. Este exemplo contm duas categorias: Appearance e Information. Observao No DesignerActionHeaderItem fornecido para a segunda categoria.

Uma entrada que exibe informaes texto esttico pode ser implementada usando um DesignerActionTextItem ou um DesignerActionPropertyItem cujos associada propriedade contm apenas um setter. Este exemplo usa a primeira abordagem. Prximas etapas

Depois que voc ter iniciado integrar o componente para o ambiente em tempo de design, considere expandir o suporte de designer.

Adicionar atributos a seu membros para facilitar a comunicao com o ambiente em tempo de design. Para obter mais informaes, consulte Atributos do Windows Forms controles. Gravar sua prprias designer personalizado. Para obter mais informaes, consulte COMO: Criar um controle de formulrios do Windows que tira vantagem de recursos em tempo de criao.

Passo-a-passo: Alterando a Mensagem SOAP Usando Extenses SOAP


Extenses SOAP pode ser inserido para a mensagem SOAP .NET Framework processamento canal para modificar ou verificar uma mensagem de solicitao ou resposta SOAP enquanto ele est sendo serializado ou desserializado, na Web em servio ou cliente. Este tpico passo a passo mostra como criar e executar uma extenso SOAP. Para uma figura de como extenses SOAP funcionam,, bem como a ordem na qual SOAP mtodos extenso so chamados no canal de processamento de mensagem, consulte Modificao de mensagens SOAP usando extenses SOAP. Durante essa explicao passo a passo, voc aprender como:

Derivar de SoapExtension uma classe. Salvar referncias para os Stream objetos que representam futuras mensagens SOAP antes e depois a extenso SOAP tenha feito seu processamento. Inicializar dados especficos extenso SOAP. Processar mensagens SOAP durante o aplicvel SoapMessageStage ou estgios.

Visual C# Consolidado

722

Configurar a extenso SOAP a ser executada com mtodos de servio da Web especficos. Pr-requisitos Derivar de SoapExtension uma classe. A classe que deriva de SoapExtension a classe que executa a funcionalidade da extenso SOAP. Isto , se a extenso SOAP uma criptografia extenso SOAP, ento a classe que deriva da classe SoapExtension executar a criptografia e descriptografia correspondente. Salvar referncias a objetos fluxo Representing mensagens SOAP futuros Para modificar uma mensagem SOAP, voc precisar obter uma referncia ao fluxo que pode ser usada para obter o contedo de futuras mensagens SOAP. Sua nica oportunidade para obter essa referncia para substituir o ChainStream mtodo.

Para salvar referncias a objetos fluxo representando SOAP futuras mensagens


1. Substituir o ChainStream mtodo. O ChainStream mtodo tem a assinatura a seguir: C#
public virtual Stream ChainStream(Stream stream)

2.

Na ChainStream implementao, atribuir a Stream instncia passado como um parmetro. Uma referncia ao passada para a ChainStream vez, antes de qualquer SoapMessageStage. um Stream Isto Stream se refere ao XML da mensagem SOAP depois extenses SOAP de prioridade mais baixa (consulte Configurar a extenso SOAP para executar com mtodos de servio da Web para detalhes sobre prioridades extenso SOAP) ter executado e suas alteraes feitas a mensagem SOAP. Uma extenso SOAP deve atribuir essa referncia para um varivel de membro para posterior acesso durante quando uma extenso SOAP inspeciona ou modifica a mensagem SOAP. o SoapMessageStage O Stream deve modificar uma extenso SOAP. passada para ChainStream, no entanto, no o Stream

3.

Na ChainStream implementao, instanciar um novo Stream, salvar uma referncia a ele em um varivel de membro particular, e retornar a referncia. O exemplo a seguir demonstra uma implementao do mtodo ChainStream comuns.

Para obter um exemplo de uma implementao do mtodo ChainStream, comuns Consulte Como implementar o mtodo ChainStream para salvar referncias a objetos do fluxo:. Inicializar dados especficos extenso SOAP A classe que deriva de SoapExtension tem dois mtodos para inicializar dados, GetInitializer e Initialize. Agora que a infra-estrutura ASP.NET chama o GetInitializer mtodo, e os parmetros so passados para o mtodo, dependem do modo como a extenso SOAP configurado. (See SOAP Message Modification Using SOAP Extensions and Configure the SOAP Extension to Run with Web Service Methods.

Para inicializar dados quando a extenso SOAP configurada usando um atributo Visual C# Consolidado 723

1.

Implementar o GetInitializer mtodo usando a assinatura a seguir: C#


public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)

O LogicalMethodInfo fornece detalhes prottipo sobre o mtodo de servio da Web, como o nmero de parmetros e seus tipos de dados. 2. Se necessrio, chame o Initialize mtodo, passando o objeto retornado pela GetInitializer. Para muitas SoapExtension implementaes, o Initialize mtodo pode ser deixado vazio.

Ao inicializar dados quando a extenso SOAP configurado em um arquivo de configurao


1. Implementar o GetInitializer mtodo com a assinatura a seguir: C#
public override object GetInitializer(Type WebServiceType)

O Type parmetro o tipo da classe da classe que implementa o servio da Web. 2. Se necessrio, chame o Initialize mtodo, passando o objeto retornado pela GetInitializer. Para muitas SoapExtension implementaes, o Initialize mtodo pode ser deixado vazio.

Para obter um exemplo de como inicializar dados quando uma extenso SOAP configurado em cache Consulte, Em cache Initialize dados quando uma extenso SOAP configurado como:. Processar o mensagens SOAP A classe derivada de SoapExtension, no pedao principais de implementao o ProcessMessage mtodo. Este mtodo chamado vrias vezes pelo ASP.NET em cada um dos estgios definido na SoapMessageStage enumerao.

Para processar mensagens SOAP

Implementar o mtodo Abstract ProcessMessage. A implementao do mtodo ProcessMessage a seguir rastreia uma chamada para um servio da Web. Durante o rastreamento, os parmetros ter sido serializado para XML, o XML gravado em um arquivo. Se indica o SoapMessageStage C#
public override void ProcessMessage(SoapMessage message) { switch (message.Stage) { case SoapMessageStage.BeforeSerialize: break; case SoapMessageStage.AfterSerialize: // Write the SOAP message out to a file. WriteOutput( message ); break; case SoapMessageStage.BeforeDeserialize: // Write the SOAP message out to a file. WriteInput( message ); break; case SoapMessageStage.AfterDeserialize: break; default: throw new Exception("invalid stage"); } }

Configurar a extenso SOAP para executar com mtodos Servio da Web Uma extenso SOAP pode ser configurado para ser executado usando um atributo personalizado ou por modificar um arquivo de configurao. Um atributo personalizado aplicada a um mtodo de servio da Web. Quando um arquivo de configurao usada, a extenso SOAP executada com os servios da Web no escopo do arquivo de configurao. Para obter detalhes sobre como arquivos de configurao funcionam, consulte Configurando aplicativos.

Visual C# Consolidado

724

Para configurar uma extenso SOAP usando um atributo personalizado


1. 2. Derivar de SoapExtensionAttribute uma classe. Implementar duas propriedades de SoapExtensionAttribute: ExtensionType e Priority. Uma extenso SOAP deve retornar o tipo da extenso SOAP na propriedade ExtensionType. A Priority propriedade representa a prioridade relativa da extenso SOAP, conforme explicado na aplicando o grupo prioridade na mensagem SOAP usando extenses SOAP modificao. Aplicar o atributo personalizado a cada mtodo de servio da Web desejado seja executado com a extenso SOAP.

3.

Para configurar uma extenso SOAP em um arquivo de configurao


1. 2. Se ele estiver no estiver presente, adicione um soapExtensionTypes elemento XML para a webServices seo do arquivo apropriado App.config ou Web.config. Dentro do soapExtensionTypes elemento XML, adicionar um add elemento XML para cada extenso SOAP que deve ser executado com cada servio da Web no escopo do arquivo de configurao. O add elemento XML tem as seguintes propriedades.
o o o

Tipo: Especifica o tipo da extenso SOAP e montagem ele reside em. Prioridade: especifica a prioridade relativa da extenso SOAP dentro de seu grupo. Grupo: Especifica o grupo uma extenso SOAP um membro da.

Passo-a-passo: Construindo um XML Web Service Bsico Usando ASP.NET


Desenvolver um servio XML da Web usando o ASP.NET inicia com as seguintes etapas: 1. 2. 3. 4. Criar um arquivo com um extenso de nome de arquivo.asmx e declarar um servio da Web dentro dela usando uma diretiva @WebService Criar uma classe que implementa o servio da Web. A classe opcionalmente pode derivar a partir da WebService classe. Opcionalmente, aplicar o WebServiceAttribute atributo a classe implementar o servio da Web. Definir os mtodos do servio da Web que compem a funcionalidade do servio da Web. Declarar um servio da Web Quando voc cria um servio XML da Web no ASP.NET, voc posicione a diretiva necessrio @ WebService na parte superior de um arquivo de texto com um extenso de nome de arquivo.asmx. A presena do arquivo.asmx e a @ WebService diretiva correlacionar o endereo URL do servio da Web XML com sua implementao. Em seguida, voc implementar a classe servio XML da Web que define os mtodos e tipos de dados visvel por clientes servio XML da Web. Finalmente, voc adicionar seu lgica servio XML Web a esses mtodos para processar solicitaes de servio XML Web e enviar respostas back. A classe servio XML da Web voc definir podem ser includos diretamente no arquivo.asmx, ou em um arquivo separado. Se voc usar um arquivo separado, ele deve ser compilado em um conjunto. Opcionalmente, voc pode aplicar um WebService atributo para a classe implementar o servio XML da Web. A classe que implementa o servio XML da Web pode derivar a partir da WebService classe.

Para declarar um servio da Web cuja implementao reside no mesmo arquivo

Visual C# Consolidado

725

Adicionar uma @ WebService diretiva a parte superior de um arquivo com um extenso de nome de arquivo.asmx, especificando a classe que implementa o servio da Web e a linguagem de programao que usada na implementao. O Class atributo pode ser definido para uma classe que reside no mesmo conjunto de mdulos (assembly) como a @ WebService diretiva ou para uma classe em um conjunto separado. Se a classe residir em um conjunto separado, ele deve ser colocado no diretrio \Bin no aplicativo da Web onde o servio da Web reside. O Language atributo pode ser definida, a C#, VB e JS, quais se referem a C#, Visual Basic. NET, e JScript. NET, respectivamente. O exemplo de cdigo a seguir define o Language atributo da diretiva, e @ WebService Define o Class atributo para Util, que reside no mesmo arquivo. C#
<%@ WebService Language="C#" Class="Util" %>

Para declarar um servio da Web cuja implementao reside em um conjunto

Adicionar uma @ WebService diretiva a parte superior de um arquivo com uma extenso.asmx, especificando a classe que implementa o servio da Web, conjunto que contm a implementao, e a linguagem de programao que usada na implementao. Se voc usar um arquivo separado, ele deve ser compilado em um conjunto. A diretiva a seguir @ WebService a nica linha em um arquivo com a extenso.asmx, especificando que a MyName.MyWebService classe reside no conjunto MyAssembly dentro da pasta \Bin do aplicativo da Web que est hospedando o servio da Web. C#
<%@ WebService Language="C#" Class="MyName.MyWebService,MyAssembly" %>

Observao Se voc no especificar um conjunto da @ WebService diretiva, ento ASP.NET pesquisar pela lista de conjuntos de mdulos (assemblies) no diretrio \Bin do aplicativo da Web que est hospedando a hora do servio na primeira Web o servio da Web acessada. Portanto, voc melhora o desempenho para o primeiro acesso, fornecendo o nome conjunto. Derivar da classe WebService Classes que implementam uma Web Servio que foi criado usando o ASP.NET podem opcionalmente derivar a partir da WebService classe para obter acesso a objetos ASP.NET comuns, tais como Aplicativo, Sesso a, Usurio. e Contexto

Para derivar a partir da classe WebService e acessar ASP.NET comuns objetos


C#
<%@ WebService Language="C#" Class="Util" %> using System; using System.Web.Services; public class Util: WebService

Aplicar o atributo WebService Aplicar o atributo opcional WebService a uma classe que implementa um servio da Web para definir o padro namespace para XML para o servio da Web, que originalmente http://tempuri.org, juntamente com uma seqncia para descrever o servio da Web.

Visual C# Consolidado

726

altamente recomendvel que este espao para nome padro, que http://tempuri.org, ser alterado antes do XML Web Service seja feita publicamente consumo. This is important because the XML Web service must be distinguished from other XML Web services that might inadvertently use the namespace as the default (<http://tempuri.org/>).

Para definir o namespace para XML do qual um servio da Web um membro

Aplicar um WebService atributo classe que implementar o servio da Web, a configurao da Namespace propriedade.

O exemplo de cdigo a seguir define o namespace para XML para http://www.contoso.com/. C#


<%@ WebService Language="C#" Class="Util" Debug=true%> using System.Web.Services; using System; [WebService(Namespace="http://www.contoso.com/")] public class Util: WebService

Definindo mtodos Servio da Web Mtodos de uma classe que implementa uma Web no servio fazer tem automaticamente a capacidade de ser comunicadas com atravs da Web, mas com servios da Web criados com ASP.NET, muito simples para adicionar esse recurso. Para adicionar esse recurso, aplique um WebMethod Atributo ao mtodos pblicos. Mtodos de um servio da Web que pode ser comunicadas com atravs da Web so chamados mtodos Servio da Web.

Para declarar um mtodo de servio da Web


1. 2. Adicionar mtodos pblicos para a classe que implementar o servio da Web. Aplicar o WebMethod atributo aos mtodos pblica que voc deseja ser mapeados para operaes de servio da Web.

O exemplo de cdigo a seguir tem dois mtodos pblicos, um dos quais um mtodo de servio da Web. O Multiply mtodo um mtodo de servio da Web, porque ele tem um WebMethod Atributo aplicado a ele. C#
<%@ WebService Language="C#" Class="Util" %> using System.Web.Services; using System; [WebService(Namespace="http://www.contoso.com/")] public class Util: WebService { [ WebMethod] public long Multiply(int a, int b) { return a * b; } }

Passo-a-passo: Personalizao para Dispositivos Especficos


Uma das vantagens de usar o criador Mobile ASP.NET a capacidade para criar aplicativos que se beneficiam dos recursos e consideraes especiais para exibir contedo em seus dispositivos de destino. Filtros dispositivo, tcnicas templating, e propriedade recursos de substituio no designer permitem que voc pode personalizar seu aplicativo para processar controles de maneira diferente para tipos de dispositivo especfico. O seguinte conjunto de procedimentos leva voc durante o processo de criao de modelos e sobrescrever propriedades para um controle. Nessa explicao passo a passo, voc ser adicionar um List controle a um formulrio, definir um filtro do dispositivo para uso com esse controle, aplicar o filtro para o controle, editar os modelos para o controle, e aplique sobrescrever propriedades para o filtro do dispositivo.

Visual C# Consolidado

727

Voc pode executar as aes a seguir para qualquer controle que oferea suporte modelos. Este exemplo usa o List controle. Para selecionar um filtro do dispositivo 1. 2. 3. Arraste o List controle de ou Panel controle em uma pgina mvel formulrios da Web ASP.NET. para a Toolbox uma Form Selecione o controle, e no menu de atalho, escolha Templating Options. A Templating Options caixa de dilogo ser exibida. Na lista Applied Device Filter drop-down, escolha o filtro do dispositivo que voc deseja configurar. Se voc desejar editar a associar modelos com este filtro, clique no Close boto e siga as etapas no Criando e editando modelos. Se o filtro que voc deseja usar no estiver na lista, clique no Edit boto para adicionar filtros para a lista de filtros do dispositivo aplicado. Isso abrir a Aplicado filtros do dispositivo caixa de dilogo. Se voc precisa para criar um novo filtro, clique no Edit boto. Na caixa Editor de filtro do dispositivo de dilogo, faa o seguinte: 1. 2. 3. 4. Clique no New Device Filter boto. Digite o nome para o novo filtro; por exemplo, SmallDevice. Defina a Tipo opo. Definir do filtro Atributos. Se voc estiver usando um filtro de comparao de igualdade, voc precisar especificar o atributo para comparar e o valor de comparao. Se o filtro for um filtro de representante avaliador, especifique seu tipo e mtodo. Do Up Arrow uso e Down Arrow Botes para definir a ordem na qual os filtros do dispositivo so salvos no arquivo de configurao (web.config) do aplicativo. Clique OK para salvar os filtros do dispositivo no arquivo de configurao do aplicativo e fechar a Device Filter Editor caixa de dilogo.

4.

5. 6. 5.

Use a Available Device Filters Lista suspensa para selecionar o filtro do dispositivo ou filtros que voc deseja usar. A Available Device Filters lista mostra todos os filtros do dispositivo definidos no nvel do aplicativo.

Visual C# Consolidado

728

6. 7.

Clique no Add to List boto. O filtro dispositivo selecionado agora parte da lista Applied Device Filters e pode ser usado para criar modelos. No campo Argument, opcionalmente, digite em um valor para o argumento a ser usado para o filtro de aplicado dispositivo selecionado. Para obter mais informaes, consulte Aplicar Filtros do dispositivo. Do Up Arrow uso e Down Arrow Botes para ordenar os filtros aplicados do dispositivo. Em tempo de execuo, os filtros so testados um por um da parte superior parte inferior. O primeiro filtro que resulta em uma avaliao xito do dispositivo determina quais modelos sero usados. Observao O filtro aplicado do dispositivo denominado (Default) sempre resulta em uma avaliao com xito. Se estiver presente, este filtro bloqueia todas as outras avaliaes abaixo na lista. Portanto, ela dever, logicamente aparecer como o ltimo filtro do dispositivo na lista Applied Device Filters drop-down. O (Default) filtro depois captura cada dispositivo que no corresponde a nenhum dos filtros acima na lista. Para obter mais informaes, consulte Introduo ao dispositivo filtros.

8.

9.

Clique OK para fechar a Applied Device Filters caixa de dilogo.

Agora a Templating Options caixa de dilogo est aberta, e voc pode selecionar o filtro do dispositivo que voc deseja usar para editar os modelos.

Para definir opes templating


1. 2. Use a Applied Device Filters lista para selecionar o filtro do dispositivo que voc deseja usar para editar os modelos. Selecione um esquema de marcao. Nesse caso, para criar modelos para dispositivos de destino esse navegador use um HTML, selecione Mobile HTML3.2 Template (esse o padro). Observao As informaes especificadas no campo Markup Schema usado somente pelo designer e no tem efeito em tempo de execuo. O esquema fornecer corretos IntelliSense Microsoft e sintaxe check in Modo HTML. 3. Clique Close para fechar a Templating Options caixa de dilogo.

Agora o controle selecionado est pronto para modelo modo edio. Cada controle pode definir vrios modelos. Por exemplo, o List controle define os seguintes modelos:

Modelo de cabealho Modelo rodap Item template Modelo AlternatingItem Modelo separador

Para editar o modelo

Visual C# Consolidado

729

1.

Para este exemplo, selecione Edit Template no menu de atalho e depois escolha Header and Footer Templates. Do Header Template o List controle na sua formulrios da Web mveis pgina exibe e Footer Template caixas. Opcionalmente, digite texto literal para o cabealho na caixa Header Template, e para o rodap na caixa Footer Template . Como alternativa, voc pode arrastar controles de ou Footer Template caixas., como um Label controle, para o Toolbox, o Header Template Selecione Item TemplatesEdit Template no menu de atalho. O List controle na sua pgina de formulrios da Web mvel exibe o modelo item e o modelo AlternatingItem. Se voc editar o modelo AlternatingItem, por exemplo, pode definir plano de fundo de itens alternadas para ser uma cor diferente: 1. Voc pode arrastar um controle de e configure as propriedades de controle que. tal um Label controle, para o modelo item, o Toolbox, Por exemplo, voc pode definir a ForeColor propriedade com a cor que voc deseja para o item texto ou o primeiro. e cada indefinido item depois disso, se voc tambm definir um modelo AlternatingItem Voc pode arrastar um controle de e configure as propriedades de controle que. tal um Label controle, para o modelo AlternatingItem, o Toolbox, Por exemplo, voc pode definir a ForeColor propriedade com a cor que voc deseja para o texto do segundo item e cada item mesmo depois disso.

2.

3.

2.

4.

A partir do menu de atalho, selecione Edit Template, e escolha Separator Template. O List controle na sua pgina de formulrios da Web mvel exibe o modelo separador para edio. Adicione contedo ou um controle para o modelo separador seguindo um destes procedimentos: Type in a string of characters that you want to use for an item separator; for example, hyphens (----------). Arraste um Image controle para o modelo e especifique um arquivo grfico da Web a ser usado como o separador item. Vincular a um arquivo grfico do separador que voc deseja usar, utilizando a ImageUrl propriedade do controle Image. Quando voc tiver terminado, selecione End Template Editing no menu de atalho.

o o

5.

Para aplicar propriedade substitui para um filtro dispositivo especfico


1. Na caixa Property Overrides de dilogo, o Applied Device Filter posicionamento emPara Baixo lista, clique no filtro do dispositivo que voc deseja aplicar; por exemplo, isHTML32. Agora a Property Overrides caixa de dilogo mostra as propriedades que voc pode substituir. Configurar quaisquer propriedades que voc deseja alterar para que o Applied Device Filter esteja exibido na parte superior da caixa de dilogo.

2.

Passo-a-passo: Personalizando a Gerao de Descries de Servios e Classes Proxy


A gerao de descrio do servio e classes proxy de um servio da Web criados com ASP.NET pode ser estendido por meio da criao e instalao de um extenso do formato da descrio do servio (SDFE). Especificamente, um SDFE pode adicionar elementos XML para o descrio do servio o documento Descrio Servios Web WSDL (linguagem para um servio da Web e adicionar atributos personalizados para um mtodo comunicao com um servio da Web. SDFEs so especialmente teis quando uma extenso SOAP deve executar com um servio da Web e seus clientes; por padro, sem informaes sobre extenses SOAP so colocadas no descrio do servio ou proxy classes gerado para ele. Um exemplo de uma extenso SOAP que devem executados no cliente e servidor uma criptografia extenso SOAP. Se uma criptografia extenso SOAP executada no servidor para criptografar a resposta SOAP, o cliente deve ter a extenso SOAP executando para descriptografar a mensagem. Um SDFE pode adicionar

Visual C# Consolidado

730

elementos ao descrio do servio para informar aos clientes que uma extenso SOAP deve executar, e o SDFE pode estender o proxy classe processo gerao para adicionar um atributo personalizado para a classe proxy, que faz com a classe para executar a extenso SOAP. Durante essa explicao passo a passo, voc aprender como: 1. 2. 3. 4. 5. Definir o XML para adicionar ao descrio do servio. Criar uma classe SDFE por derivar a partir da ServiceDescriptionFormatExtension classe. Escrever cdigo para estender o processo de gerao descrio do servio. Gravar cdigo para estender o proxy classe processo gerao. Configurar o SDFE para executar em tanto o cliente e servidor. Definir o XML e criar a classe SDFE Os exemplos de cdigo nessa explicao passo a passo envolver uma classe ServiceDescriptionFormateExtension YMLOperationBinding para uma classe SoapExtension YMLExtension. O cdigo completo aparece no tpico How to personalizar as descries do servio gerao e classes proxy (cdigo de exemplo).:

Para definir o XML para adicionar ao descrio do servio


1. Decidir sobre o XML para adicionar ao descrio do servio. O exemplo de cdigo a seguir a parte de um descrio do servio para que o exemplo SDFE adiciona elementos XML. Especificamente, o exemplo SDFE declara um prefixo yml namespace para XML do elemento raiz definitions de um documento WSDL, e aplica que apaream na ligao operation elementos espao para nome para o yml:action elemento (e elementos filho).
<definitions ... xmlns:yml="http://www.contoso.com/yml" > ... <binding name="HelloWorldSoap" type="s0:HelloWorldSoap"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> <operation name="SayHello"> <soap:operation soapAction="http://tempuri.org/SayHello" style="document" /> <yml:action> <yml:Reverse>true</yml:Reverse> </yml:action> </operation> ... </binding> ... </definitions>

2.

Criar uma classe que deriva de ServiceDescriptionFormatExtension. Ao usar Visual Studio. NET, adicione uma referncia ao conjunto System.Web.Services . Tambm adicionar ou Imports instruo para espao para nome System.Web.Services.Description para o arquivo. um using O exemplo de cdigo a seguir cria a YMLOperationBinding classe, que deriva de ServiceDescriptionFormatExtension. C#
public class YMLOperationBinding : ServiceDescriptionFormatExtension

3.

Aplicar classe. um XmlFormatExtensionAttribute Este atributo especifica a etapa do processo de gerao descrio do servio, conhecido como um ponto de extenso, no qual o SDFE executa. A tabela a seguir lista os pontos de extenso definido e os elementos XML WSDL gerado durante cada ponto. Para o ponto de extenso especificado, o elemento WSDL correspondente ficar o pai do elemento sendo adicionado. Ponto de extenso Descrio

Visual C# Consolidado

731

ServiceDescription Corresponde ao elemento raiz definitions de um documento WSDL. Types Binding Corresponde ao elemento types delimitados pelo elemento raiz definitions. Corresponde ao elemento binding delimitados pelo elemento raiz definitions. Corresponde ao elemento operation delimitados pelo binding elemento. Corresponde ao elemento input delimitados pelo operation elemento. Corresponde ao elemento output delimitados pelo operation elemento. Corresponde ao elemento fault delimitados pelo operation elemento. Corresponde ao elemento port delimitados pelo service elemento. Corresponde ao elemento operation delimitados pelo portType elemento.

OperationBinding InputBinding OutputBinding FaultBinding Port Operation

Ao aplicar para a classe, voc tambm especificar o nome do elemento XML e o namespace para XML para conter os elementos XML para adicionar ao descrio do servio. um XmlFormatExtensionAttribute O exemplo de cdigo a seguir especifica que o YMLOperationBinding SDFE adiciona um elemento XML chamado <action xmlns="http://www.contoso.com/yml"> para o descrio do servio durante o OperationBinding ponto de extenso. Para esse exemplo, o http://www.contoso.com/yml namespace para XML especificado mais tarde quando o YMLOperationBinding.YMLNamespace campo adicionado classe. C#
[XmlFormatExtension("action", YMLOperationBinding.YMLNamespace, typeof(OperationBinding))] public class YMLOperationBinding : ServiceDescriptionFormatExtension

4.

Opcionalmente, aplicar classe para associar o prefixo namespace para XML ao namespace para XML usado pelo SDFE. um XmlFormatExtensionPrefixAttribute O exemplo de cdigo a seguir especifica que o yml prefixo namespace para XML associado ao espao para nome http://www.contoso.com/yml no elemento definitions do descrio do servio. Alm disso, o prefixo usada em elementos adicionados pelo SDFE em vez do espao para nome. Portanto, o elemento XML adicionadas para o descrio do servio na etapa 3 agora usa o prefixo do espao para nome e assim o elemento adicionado <yml:action> em vez de <action xmlns="http://www.contoso.com/yml">. C#
[XmlFormatExtension("action", YMLOperationBinding.YMLNamespace, typeof(OperationBinding))] [XmlFormatExtensionPrefix("yml", YMLOperationBinding.YMLNamespace)] public class YMLOperationBinding : ServiceDescriptionFormatExtension

5.

Adicionar propriedades pblicas e / ou campos classe que representa o XML a ser adicionado ao documento WSDL. Exemplo de cdigo a seguir adiciona uma Reverse propriedade pblica que serializado em um <yml:Reverse>value</yml:Reverse> elemento no WSDL.

Visual C# Consolidado

732

C#
private Boolean reverse; [XmlElement("Reverse")] public Boolean Reverse { get { return reverse; } set { reverse = value; } }

Estendendo a gerao da descrio servio e Proxy Client Para estender o processo de gerao WSDL, derivar uma classe a partir da SoapExtensionReflector classe. Para estender a gerao de proxy cliente processo, derivar uma classe a partir da SoapExtensionImporter classe.

Para estender o processo de gerao descrio do servio


1. Criar uma classe que deriva de SoapExtensionReflector. O exemplo de cdigo a seguir cria a TraceReflector classe, que deriva de SoapExtensionReflector. C#
public class YMLReflector : SoapExtensionReflector

2.

Substituir o ReflectMethod mtodo, que denominado durante a gerao descrio do servio para cada mtodo de servio da Web. O seguinte cdigo exemplo substitui o ReflectMethod. C#
public override void ReflectMethod()

3.

Obter o valor da propriedade ReflectionContext da classe SoapExtensionReflector para obter uma instncia do ProtocolReflector. A instncia do ProtocolReflector fornece detalhes sobre o processo de gerao WSDL para o mtodo de servio da Web atual. . O exemplo de cdigo a seguir obtm o valor da propriedade ReflectionContext C#
ProtocolReflector reflector = ReflectionContext;

4.

Adicione cdigo para preencher o SDFE. O exemplo de cdigo a seguir adiciona o XML definidos pelo SDFE para o descrio do servio se for aplicado a um mtodo de servio da Web. o YMLAttribute C#
YMLAttribute attr = (YMLAttribute) reflector.Method.GetCustomAttribute(typeof(YMLAttribute)); // If the YMLAttribute has been applied to this Web service // method, adds the XML defined in the YMLOperationBinding class. if (attr != null) { YMLOperationBinding yml = new YMLOperationBinding(); yml.Reverse = !(attr.Disabled);

5.

Adicionar o SDFE coleo Extensions da propriedade que representa o ponto de extenso a SDFE estender. O exemplo de cdigo a seguir adiciona o YmlOperationBinding SDFE at o OperationBinding ponto de extenso. C#
reflector.OperationBinding.Extensions.Add(yml);

Para estender o proxy gerao classe processar Visual C# Consolidado 733

1.

Criar uma classe que deriva de SoapExtensionImporter. C#


public class YMLImporter : SoapExtensionImporter

2.

Substituir o ImportMethod mtodo. O ImportMethod chamado durante a gerao de classe para cada operao definido em um descrio do servio proxy. Cada mtodo de servio da Web de servios da Web criados com ASP.NET, mapeia para uma operao para cada protocolo com suporte no descrio do servio. C#
public override void ImportMethod(CodeAttributeDeclarationCollection metadata)

3.

Obter o valor da propriedade ImportContext do SoapExtensionImporter para obter uma instncia do SoapProtocolImporter. A instncia do SoapProtocolImporter fornece detalhes sobre o processo de gerao de cdigo para o mtodo atual se comunicar com um mtodo de servio da Web. O exemplo de cdigo a seguir obtm o valor da propriedade ImportContext. C#
SoapProtocolImporter importer = ImportContext;

4.

Adicione cdigo para aplicar ou modificar atributos para um mtodo na classe proxy que est se comunicando com um servio da Web. O ImportMethod passagens no um argumento de tipo CodeAttributeDeclarationCollection, que representa a coleo de atributos que so aplicados para o mtodo que se comunica com a Web Servio mtodo. O exemplo de cdigo a seguir adiciona coleo, que faz com a YML extenso SOAP a executar com o mtodo quando o descrio do servio contm o XML apropriado. um YMLAttribute C#
// Checks whether the XML specified in the YMLOperationBinding is // in the service description. YMLOperationBinding yml = (YMLOperationBinding) importer.OperationBinding.Extensions.Find( typeof(YMLOperationBinding)); if (yml != null) { // Only applies the YMLAttribute to the method when the XML should // be reversed. if (yml.Reverse) { CodeAttributeDeclaration attr = new CodeAttributeDeclaration(typeof(YMLAttribute).FullName); attr.Arguments.Add(new CodeAttributeArgument(new CodePrimitiveExpression(true))); metadata.Add(attr); } }

Configurando o SDFE Para configurar o SDFE requer editar arquivos de configurao no servio da Web e cliente.

Para configurar o SDFE para executar com um servio da Web


1. Instalar o conjunto que contm o SDFE em uma pasta acessvel. A menos que o SDFE seja necessria para vrios aplicativos da Web, instale o SDFE na pasta \Bin do aplicativo da Web que hospeda o servio da Web. 2. Adicione um < serviceDescriptionFormatExtensionTypes > elemento com um add elemento e especifique o nome e conjunto que contm o SDFE para o arquivo web.config para o aplicativo da Web. O exemplo de cdigo a seguir configura o Sample.YMLOperationBinding SDFE seja executado com os servios da Web afetados pela no arquivo web.config. O elemento completa add deve estar em uma linha.

Visual C# Consolidado

734

<system.web> <webServices> <serviceDescriptionFormatExtensionTypes> <add type="Sample.YMLOperationBinding,Yml, Version=1.0.0.0,Culture=neutral, PublicKeyToken=6e55c64c6b897b30"/> </serviceDescriptionFormatExtensionTypes> </webServices> </system.web>

3.

Adicione um <soapExtensionReflectorTypes> Element elemento com um add elemento e especifique o nome e montagem da classe que estende o processo de gerao descrio do servio para o arquivo web.config para o aplicativo da Web. O exemplo de cdigo a seguir configura para executar com os servios da Web afetados pela no arquivo web.config. o Sample.YMLReflector O elemento completa add deve estar em uma linha.
<system.web> <webServices> <serviceDescriptionFormatExtensionTypes> <add type="Sample.YMLOperationBinding,Yml, Version=1.0.0.0,Culture=neutral, PublicKeyToken=6e55c64c6b897b30"/> </serviceDescriptionFormatExtensionTypes> <soapExtensionReflectorTypes> <add type="Sample.YMLReflector,Yml, Version=1.0.0.0,Culture=neutral, PublicKeyToken=6e55c64c6b897b30"/> </soapExtensionReflectorTypes> </webServices> </system.web>

Para configurar o SDFE para executar com um cliente de servios da Web


1. Instalar o conjunto que contm o SDFE no cache de conjunto de mdulos global. Para ser instalado, conjunto de mdulos (assembly) deve ser de nome seguro. Para obter detalhes sobre como criar um conjunto de nome seguro, consulte Criando e usando conjuntos Named STRONG-. Para obter detalhes sobre como instalar conjuntos, consulte Instalar um assembly no no cache do conjunto de mdulos (assembly) global. 2. Adicione um <serviceDescriptionFormatExtensionTypes> Element elemento com um add elemento e especifique o nome e conjunto que contm o SDFE para o arquivo Machine.config. O exemplo de cdigo a seguir configura o Sample.YMLOperationBinding SDFE para executar sempre que classes proxy so geradas para servios da Web no computador.
<system.web> <webServices> <serviceDescriptionFormatExtensionTypes> <add type="Sample.YMLOperationBinding,Yml, Version=1.0.0.0,Culture=neutral, PublicKeyToken=6e55c64c6b897b30"/> </serviceDescriptionFormatExtensionTypes> </webServices> </system.web>

3.

Adicionar um <soapExtensionImporterTypes> Element elemento com um add elemento e especifique o nome e montagem da classe que estende o proxy classe processo gerao para o arquivo Machine.config. O exemplo de cdigo a seguir configura para executar sempre que classes proxy so geradas para servios da Web no computador. o Sample.YMLImporter
<system.web> <webServices> <serviceDescriptionFormatExtensionTypes> <add type="Sample.YMLOperationBinding,Yml, Version=1.0.0.0,Culture=neutral, PublicKeyToken=6e55c64c6b897b30"/> </serviceDescriptionFormatExtensionTypes> <soapExtensionImporterTypes> <add type="Sample.YMLImporter,Yml, Version=1.0.0.0,Culture=neutral, PublicKeyToken=6e55c64c6b897b30"/> </soapExtensionImporterTypes> </webServices> </system.web>

Observao

Visual C# Consolidado

735

O mtodo gerado na classe proxy usado por um aplicativo cliente se comunicar com o servio da Web, caso se um SDFE adiciona um atributo que reside em um conjunto do qual o aplicativo cliente no notificado, um erro do compilador gerado. Para resolver o erro do compilador, adicionar uma referncia ao conjunto que contm o atributo se usando Visual Studio. NET, ou adicione montagem para a linha de comando do compilador se usando compilao de linha de comando.

Passo-a-passo: Implantando um aplicativo ClickOnce manualmente


Essa explicao passo a passo descreve as etapas necessrias para criar uma implantao completa ClickOnce usando a verso de linha de comando ou grfica da ferramenta manifesto gerao e edio (Mage). Se voc no usar o Visual Studio regularmente, precisar para automatizar o processo de implantao, ou precisa para usar recursos de implantao avanadas, como confiveis Implantao de aplicativo, voc deve usar a ferramenta de linha de comando Mage.exe para criar seu ClickOnce manifestos. Explicao passo a passo o seguir leva voc por todos os as etapas necessrias para gerar uma implantao completa ClickOnce usando a verso de linha de comando (Mage.exe) ou a verso do Windows Forms (MageUI.exe) do manifesto gerao e ferramenta de edio. Pr-requisitos Essa explicao passo a passo foram gravado sob a suposio que voc tiver um aplicativo Windows Forms que voc est preparado para implantar; este aplicativo ser chamado para de WindowsFormsApp1. Voc tambm deve instalar o .NET Framework Software Development Kit (SDK). H uma srie de questes voc precisar decidir antes de criar uma implantao. Primeiro e foremost como voc vai distribuir a implantao:. Web a fim de um compartilhamento de arquivo, ou instalado logoff de um CD Para obter mais informaes, consulte Viso geral sobre a implantao do ClickOnce. Em seguida, voc precisar determinar se o aplicativo ser executado em um nvel elevado de confiana. Aplicativos conforme discutido no Viso geral da implantao de aplicativos confiveis, por padro ClickOnce ser executado em uma zona parcialmente confivel, com suas permisses exatos determinados pela se eles so hospedados em uma intranet ou da Internet. Se um aplicativo precisa acessar dados no computador cliente, converse com dispositivos locais, chamar funes da API do Windows, ou executar outras operaes potencialmente perigosas, ele precisar declarar um maior nvel de confiana. Se o aplicativo requer confiana Total por exemplo, acesso total ao sistema do usurio use Mage.exe para defini-la facilmente. Se voc quiser definir uma permisso personalizada definida para seu aplicativo, voc pode copiar a seo de permisso Internet ou intranet de outra manifesto, modific-lo para atender s suas necessidades, e adicion-lo ao manifesto de aplicativo usando um editor de texto ou MageUI.exe Os dois mtodos para declarar confiana em um ClickOnce manifesto superior so elevao permisso e confiveis Implantao de aplicativo. Em ambos os casos, sua implantao deve ser assinada com um certificado Autenticode gerados usando a ferramenta MakeCert.exe ou obtido uma certificao autoridade (CA) de. Se voc optar por usar confiveis Implantao de aplicativo, voc tambm deve executar uma instalao nica do certificado para todos os computadores cliente. Para obter mais informaes, consulte Viso geral da implantao de aplicativos confiveis. Para implantar um aplicativo com a ferramenta de linha de comando Mage.exe

Visual C# Consolidado

736

1. 2. 3.

Abra um .NET Framework Prompt de comando SDK, e altere para o diretrio em que voc ir armazenar os ClickOnce arquivos. Crie uma subpasta chamada bin e coloque todos os seus arquivos do aplicativo Incluindo arquivos executveis, conjuntos, recursos, e arquivos de dados aqui, Crie uma subpasta chamada aps a verso atual do sua implantao. Se esta for a primeira vez voc estiver implantando o aplicativo, voc provavelmente escolher 1.0.0.0. Observao A verso da sua implantao pode estar distintas da verso dos arquivos do aplicativo.

4. 5.

Mover o diretrio \bin para a pasta que voc criou etapa 2. Gerar manifesto de aplicativo com uma chamada para Mage.exe:
mage -New Application -ToFile 1.0.0.0\WindowsFormsApp1.exe.manifest -Name "Windows Forms App 1" -Version 1.0.0.0 -FromDirectory 1.0.0.0\bin

6.

Assinar manifesto de aplicativo com o certificado digital:


mage -Sign WindowsFormsApp1.exe.manifest -CertFile mycert.pfx

7.

Gerar o manifesto de implantao com uma chamada para Mage.exe. Por padro, Mage.exe ir, marcar a implantao ClickOnce como um aplicativo instalado, para que ele pode ser executado tanto online e offline. Para tornar o aplicativo disponvel somente quando o usurio est online, usar o -i Sinalizador com um valor de f. Se voc usar o padro, e usurios ir instalar um aplicativo de um site da Web ou compartilhamento de arquivo, certifique-se o valor dos pontos de sinalizador providerUrl para o local do manifesto de aplicativo no servidor Web ou compartilhamento -.
mage -New Deployment -ToFile WindowsFormsApp1.application -Name "Windows Forms App 1" Version 1.0.0.0 -AppManifest 1.0.0.0\WindowsFormsApp1.manifest -providerUrl http://www.adatum.com/WindowsFormsApp1/WindowsFormsApp1.application

8.

Assinar o manifesto de implantao com o certificado:


mage -Sign WindowsFormsApp1.application -CertFile mycert.pfx

9.

Copie todo dos arquivos na pasta atual incluindo a pasta de verso e a pasta \bin para o destino de implantao. Isso pode ser qualquer uma pasta em um site da Web ou FTP site, um compartilhamento de arquivo, ou um CD.

10. Fornecer os usurios com a URL, UNC ou mdia fsica necessria para instalar um aplicativo. Se voc est fornecendo um URL ou UNC, voc deve atribuir os usurios o caminho completo o manifesto de implantao. Por exemplo, caso WindowsFormsApp1 seja implantado para http://webserver01/ no diretrio WindowsFormsApp1, o caminho completo URL seria http://webserver01/WindowsFormsApp1/WindowsFormsApp1.Deploy. Implantando o aplicativo com a ferramenta Grfico MageUI.exe 1. 2. 3. Abra um .NET Framework Prompt de comando SDK, e navegue para a pasta em que voc ir armazenar os ClickOnce arquivos. Crie uma subpasta chamada bin e coloque todos os seus arquivos do aplicativo Incluindo arquivos executveis, conjuntos, recursos, e arquivos de dados aqui. Crie uma subpasta chamada aps a verso atual do sua implantao. Se esta for a primeira vez voc estiver implantando o aplicativo, voc provavelmente escolher 1.0.0.0.

Visual C# Consolidado

737

Observao A verso da sua implantao pode estar distintas da verso dos arquivos do aplicativo. 4. Mover o: \ bin diretrio para a pasta que voc criou na etapa 2, e inicie a ferramenta grfica
MageUI.exe

5. 6. 7. 8. 9.

Criar um novo manifesto de aplicativo, New selecionando File, Application Manifest. a partir do menu Na guia Padro Name, digite o nmero dessa Implantao nome e verso. Selecione a Files guia e clique no Browse... boto prximo caixa de texto Diretrio aplicativo. Selecione a pasta que contm os arquivos do aplicativo que voc criou na etapa 2, e clique OK na pasta Caixa de dilogo de seleo. Clique no Populate boto para adicionar todos os arquivos do aplicativo lista da arquivo. Se seu aplicativo contm mais de um arquivo executvel, marcar o arquivo executvel principal para essa implantao como o aplicativo de inicializao, selecionar Entry Point na lista File Type drop-down. MageUI.exe (se seu aplicativo s contm um arquivo executvel, ser marc-la para voc.)

10. Selecione a Permissions Required guia e selecione o nvel de confiana voc precisa seu aplicativo para declarar. O padro Full Trust, que ser adequado para a maioria dos aplicativos. 11. Selecione File, Save no menu, e salve o manifesto de aplicativo. Voc ser solicitado para assinar o manifesto de aplicativo quando voc salv-lo. 12. Se voc tiver um certificado armazenado como um arquivo no seu sistema de arquivos, use a Sign as certificate file opo, e selecione o certificado do sistema de arquivos usando o ... boto. OuSe o certificado mantido em um armazenamento de certificados acessvel de sua mquina, selecione e selecione o certificado na lista fornecida. o Sign with stored certificate option, 13. Selecionar File, New, Deployment Manifest no menu para criar sua implantao manifesto, e em seguida, na guia Name, fornea um nome e verso nmero, neste exemplo (1.0.0.0). 14. Selecione a Publisher guia e fornecer valores para Publisher e Product. ( Product is the name given your application on the Windows Start menu when you install your application locally.) 15. Alterne para a Update guia, e especifique a freqncia voc deseja este aplicativo para atualizar. Se o aplicativo usa a ClickOnce API de implantao para verificar se h atualizaes propriamente dito, desmarque a caixa de seleo rotulada This application should check for updates. 16. Alternar para a Application Reference guia. Voc pode preencher todos os valores nesta guia, clicando no Select Manifest boto e selecionando o aplicativo manifesto voc criou nas etapas anteriores. 17. Escolha Save e salvar o manifesto de implantao em disco. Voc ser solicitado para assinar o manifesto de aplicativo quando voc salv-lo.

Visual C# Consolidado

738

18. Se voc tiver um certificado armazenado como um arquivo no seu sistema de arquivos, use a Sign as certificate file opo, e selecione o certificado do sistema de arquivos usando o ... boto. OuSe o certificado mantido em um armazenamento de certificados acessvel de sua mquina, selecione e selecione o certificado na lista fornecida. o Sign with stored certificate option, 19. Copiar todos os arquivos na pasta atual, incluindo a pasta de verso e a pasta para o destino de implantao. \ bin Isso pode ser qualquer uma pasta em um site da Web ou FTP site, um compartilhamento de arquivo, ou um CD. 20. Fornecer os usurios com a URL, UNC ou mdia fsica necessria para instalar um aplicativo. Se voc est fornecendo um URL ou UNC, voc deve atribuir os usurios o caminho completo o manifesto de implantao. Por exemplo, caso WindowsFormsApp1 seja implantado para http://webserver01/ no diretrio WindowsFormsApp1, o caminho completo URL seria http://webserver01/WindowsFormsApp1/WindowsFormsApp1.Deploy. Prximas etapas Quando voc precisa implantar uma nova verso do aplicativo, precisar criar uma nova pasta chamada aps a nova verso por exemplo, 1.1.0.0and move the new application files into a \bin pasta em que novo diretrio. Voc deve gerar um novo manifesto de aplicativo e armazeneno novo diretrio, e ter o editor assinar o novo manifesto. Aps voc obter o manifesto assinado de volta, voc pode usar Mage.exe para atualizar o manifesto de implantao e aponte-lo no novo manifesto de aplicativo:
mage -Update WindowsFormsApp1.application -Version 1.1.0.0 -AppManifest 1.1.0.0\WindowsFormsApp1.exe.manifest

Usurios MageUI.exe podem efetuar a mesma operao, abrindo o seu manifesto de implantao, selecione a Application Reference guia e selecionar o Select Manifest boto novamente. Aps atualizar o aplicativo manifesto referncia, ser necessrio assinar novamente o manifesto de implantao, como alterar um manifesto de alguma forma invalida a assinatura digital.

Passo-a-passo: Fazendo o Download de Assemblies por Demanda com a API de Implantao do ClickOnce
Por padro, todos os as montagens includas um ClickOnce aplicativo so descarregados quando o aplicativo executado primeiro. Voc pode, entretanto, ter partes do seu aplicativo que so usados por um pequeno conjunto de seus usurios. Nesse caso, voc deseja baixar um conjunto somente quando voc cria um dos seus tipos. Explicao passo a passo o seguir demonstra como para marcar determinados conjuntos em seu aplicativo como " OPCIONAL ", e como baix-las usando classes no espao para nome System.Deployment.Application quando o Common Language Runtime (CLR) exige-los. Criar Projetos

Para criar um projeto usando um conjunto por demanda


1. 2. 1. Abra o .NET Framework Prompt de comando SDK. Ao usar o Bloco de Notas ou outro editor de texto, definir uma classe chamada
DynamicClass com uma nica propriedade chamada Message.

Salvar o texto como um arquivo denominado ClickOnceOnDemand.cs ou ClickOnceOnDemand.vb, dependendo do idioma voc usar.

Visual C# Consolidado

739

2. 3.

Compile o arquivo em um conjunto. csc /target:library ClickOnceOnDemand.csvbc


/target:library ClickOnceOnDemand.vb

Crie um novo arquivo usando o editor de texto e insira o cdigo a seguir, que cria um aplicativo Windows Forms que baixa o conjunto ClickOnceOnDemand quando ele necessrio. Salve o arquivo como um Form1.cs ou Form1.vb. csc /target:exe
/reference:ClickOnceOnDemand.dll Form1.csvbc /target:exe /reference:ClickOnceOnDemand.dll Form1.vb e compil-lo em um executvel

1.

Marcando conjuntos como opcional

Para marcar conjuntos como opcionais em seu aplicativo ClickOnce usando o manifesto gerao e ferramenta de edio-cliente grfico (MageUI.exe)
1. 2. 3. Crie seu ClickOnce manifestos conforme descrito em Passo-a-passo: Implantando um aplicativo ClickOnce manualmente. Nome seu aplicativo ClickOnceOnDemand. Antes de fechar MageUI.exe, selecione a guia contendo a implantao na manifesto de aplicativo, e selecione a Files guia dentro desse guia. Na guia Files Localizar OnDemandAssembly.dll na lista dos arquivos aplicativo e defina sua File Type Coluna a None. Para a Group coluna, digite ClickOnceOnDemand.dll. Teste o novo conjunto

Para testar seu conjunto por demanda


1. 2. Carregar sua ClickOnce implantao em um servidor Web. Iniciar seu aplicativo implantado com ClickOnce de um navegador da Web inserindo a URL para o manifesto de implantao. Se voc chamar seu ClickOnce aplicativo ClickOnceOnDemand, e voc carreg-la para o diretrio de raiz do adatum.com, seu URL teria esta aparncia:
http://www.adatum.com/ClickOnceOnDemand/ClickOnceOnDemand.application

3.

Quando o formulrio principal for exibida, pressione o Button. Voc deve ver uma seqncia em uma janela caixa de mensagem que l " Hello, World! "

Passo-a-passo: Implementando um Editor de Tipos de Interface do Usurio


Voc pode fornecer uma experincia em tempo de design personalizada para tipos complexos Propriedade implementando um editor tipo Interface (UI) do usurio. Essa explicao passo a passo explica como criar seu prprio Editor tipo UI para um tipo personalizado e exibir a interface de edio, usando um PropertyGrid. Tarefas explicadas nessa explicao passo a passo incluem:

Definir um tipo personalizado. Definir um controle de exibio para seu editor tipo UI. Definir uma classe que deriva de UITypeEditor. Do PropertyGrid substituindo o GetEditStyle mtodo para informar do tipo de estilo editor que ir usar o editor. Substituir o EditValue mtodo para tratar a interface do usurio, processamento de entrada de usurio, e atribuio valor.

Visual C# Consolidado

740

Para copiar o cdigo nessa explicao passo a passo como uma lista simples, consulte COMO: Criar um controle de formulrios do Windows que tira vantagem de recursos em tempo de criao. Pr-requisitos A fim de concluir este explicao passo a passo, ser necessrio:

Permisses suficientes para poder para criar e executar projetos do aplicativo Windows Forms no computador est instalado. onde o .NET Framework Definir um tipo personalizado

Seu editor tipo UI personalizada exibir um tipo personalizado. Esse tipo pode ser simples ou complexos. Para essa explicao passo a passo, voc ir definir um tipo simples com comportamento de edio em tempo de design personalizado. Esse tipo chamado MarqueeLightShape, e e Circle. com dois valores, Square um enum

Para definir um tipo de enumerao personalizado

No corpo da definio do seu controle Windows Forms, define o MarqueeLightShape tipo. C#


// This defines the possible values for the MarqueeBorder // control's LightShape property. public enum MarqueeLightShape { Square, Circle }

Definir um controle de exibio Seu editor tipo UI Personalizada exibe a interface edio usar um controle Windows Forms. Esse controle denominado LightShapeSelectionControl, e ele deriva de UserControl. Seu construtor usa o valor da propriedade atual e uma referncia IWindowsFormsEditorService. O controle de exibio usa o CloseDropDown mtodo no IWindowsFormsEditorService para fechar a janela Lista suspensa quando o usurio clica em uma seleo.

Para definir um controle de exibio

No corpo da definio do seu controle Windows Forms, definir o LightShapeSelectionControl controle. C#


// This control provides the custom UI for the LightShape property // of the MarqueeBorder. It is used by the LightShapeEditor. public class LightShapeSelectionControl : System.Windows.Forms.UserControl { private MarqueeLightShape lightShapeValue = MarqueeLightShape.Square; private IWindowsFormsEditorService editorService = null; private System.Windows.Forms.Panel squarePanel; private System.Windows.Forms.Panel circlePanel; // Required designer variable. private System.ComponentModel.Container components = null; // This constructor takes a MarqueeLightShape value from the // design-time environment, which will be used to display // the initial state. public LightShapeSelectionControl( MarqueeLightShape lightShape, IWindowsFormsEditorService editorService ) { // This call is required by the designer. InitializeComponent(); // Cache the light shape value provided by the // design-time environment. this.lightShapeValue = lightShape; // Cache the reference to the editor service. this.editorService = editorService; // Handle the Click event for the two panels. this.squarePanel.Click += new EventHandler(squarePanel_Click); this.circlePanel.Click += new EventHandler(circlePanel_Click); } protected override void Dispose( bool disposing ) { if( disposing ) { // Be sure to unhook event handlers // to prevent "lapsed listener" leaks. this.squarePanel.Click -= new

Visual C# Consolidado

741

EventHandler(squarePanel_Click); this.circlePanel.Click -= new EventHandler(circlePanel_Click); if(components != null) { components.Dispose(); } } base.Dispose( disposing ); } // LightShape is the property for which this control provides // a custom user interface in the Properties window. public MarqueeLightShape LightShape { get { return this.lightShapeValue; } set { if( this.lightShapeValue != value ) { this.lightShapeValue = value; } } } protected override void OnPaint(PaintEventArgs e) { base.OnPaint (e); using( Graphics gSquare = this.squarePanel.CreateGraphics(), gCircle = this.circlePanel.CreateGraphics() ) { // Draw a filled square in the client area of // the squarePanel control. gSquare.FillRectangle( Brushes.Red, 0, 0, this.squarePanel.Width, this.squarePanel.Height ); // If the Square option has been selected, draw a // border inside the squarePanel. if( this.lightShapeValue == MarqueeLightShape.Square ) { gSquare.DrawRectangle( Pens.Black, 0, 0, this.squarePanel.Width-1, this.squarePanel.Height-1); } // Draw a filled circle in the client area of // the circlePanel control. gCircle.Clear( this.circlePanel.BackColor ); gCircle.FillEllipse( Brushes.Blue, 0, 0, this.circlePanel.Width, this.circlePanel.Height ); // If the Circle option has been selected, draw a // border inside the circlePanel. if( this.lightShapeValue == MarqueeLightShape.Circle ) { gCircle.DrawRectangle( Pens.Black, 0, 0, this.circlePanel.Width-1, this.circlePanel.Height-1); } } } private void squarePanel_Click(object sender, EventArgs e) { this.lightShapeValue = MarqueeLightShape.Square; this.Invalidate( false ); this.editorService.CloseDropDown(); } private void circlePanel_Click(object sender, EventArgs e) { this.lightShapeValue = MarqueeLightShape.Circle; this.Invalidate( false ); this.editorService.CloseDropDown(); } #region Component Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.squarePanel = new System.Windows.Forms.Panel(); this.circlePanel = new System.Windows.Forms.Panel(); this.SuspendLayout(); // // squarePanel // this.squarePanel.Location = new System.Drawing.Point(8, 10); this.squarePanel.Name = "squarePanel"; this.squarePanel.Size = new System.Drawing.Size(60, 60); this.squarePanel.TabIndex = 2; // // circlePanel // this.circlePanel.Location = new System.Drawing.Point(80, 10); this.circlePanel.Name = "circlePanel"; this.circlePanel.Size = new System.Drawing.Size(60, 60); this.circlePanel.TabIndex = 3; // // LightShapeSelectionControl // this.Controls.Add(this.squarePanel); this.Controls.Add(this.circlePanel); this.Name = "LightShapeSelectionControl"; this.Size = new System.Drawing.Size(150, 80); this.ResumeLayout(false); } #endregion }

Definir um tipo UI classe Editor Para implementar comportamento Editor tipo UI, derivar da classe UITypeEditor base. Essa classe chamado LightShapeEditor.

Para definir um tipo UI classe Editor


1. Do System.Drawing.Design Ativar acesso ao .NET Framework Design-time suporte por referncia o conjunto System.Design e importar e System.Windows.Forms.Design espaos de nome. Para obter mais informaes, consulte Como: Acessar suporte em tempo de design no Windows Forms. No corpo da definio do seu controle Forms janela, definir a LightShapeEditor classe. C#
// This class demonstrates the use of a custom UITypeEditor. // It allows the MarqueeBorder control's LightShape property // to be changed at design time using a customized UI element // that

2.

Visual C# Consolidado

742

is invoked by the Properties window. The UI is provided // by the LightShapeSelectionControl class. internal class LightShapeEditor : UITypeEditor {

Substituir o mtodo GetEditStyle O GetEditStyle mtodo indica para o ambiente de desenvolvimento que tipo de usurio interface a implementa Editor tipo UI. Os valores possveis so definidos no tipo UITypeEditorEditStyle. A LightShapeEditor implementa uma DropDown interface digite Editor.

Para substituir o mtodo GetEditStyle

No corpo da LightShapeEditor definio, substituir o GetEditStyle mtodo para retornar DropDown. C#


public override UITypeEditorEditStyle GetEditStyle( System.ComponentModel.ITypeDescriptorContext context) { return UITypeEditorEditStyle.DropDown; }

Substituir o mtodo EditValue O EditValue mtodo estabelece a interao entre o ambiente de desenvolvimento e a interface do usurio para edio seu Tipo personalizado. O EditValue mtodo cria uma instncia da caixa de dilogo restrita com o qual o usurio edita o valor ou o controle de exibio. Quando o usurio estiver concludo edio, o EditValue mtodo retorna o valor para o ambiente de design. Do IWindowsFormsEditorService no caso de um controle de exibio como LightShapeSelectionControl o EditValue mtodo pode passar uma referncia a para o controle modo. O controle de exibio pode usar essa referncia para fechar prprio quando o usurio seleciona um valor. Isso necessrio para uma caixa de dilogo restrita, no porque um formulrio pode fechar prprio.

Para substituir o mtodo EditValue

No corpo da LightShapeEditor definio, substituir o EditValue mtodo. C#


public override object EditValue( ITypeDescriptorContext context, IServiceProvider provider, object value) { if (provider != null) { editorService = provider.GetService( typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService; } if (editorService != null) { LightShapeSelectionControl selectionControl = new LightShapeSelectionControl( (MarqueeLightShape)value, editorService); editorService.DropDownControl(selectionControl); value = selectionControl.LightShape; } return value; }

Substituir o mtodo PaintValue Voc pode fornecer uma representao grfica de valor sua propriedade por substituir o PaintValue mtodo.

Para substituir o mtodo PaintValue

No corpo da LightShapeEditor definio, substituir o PaintValue mtodo. Tambm substituir o GetPaintValueSupported mtodo para retornar true. C#

Visual C# Consolidado

743

// This method indicates to the design environment that // the type editor will paint additional content in the // LightShape entry in the PropertyGrid. public override bool GetPaintValueSupported( ITypeDescriptorContext context) { return true; } // This method paints a graphical representation of the // selected value of the LightShpae property. public override void PaintValue(PaintValueEventArgs e) { MarqueeLightShape shape = (MarqueeLightShape)e.Value; using (Pen p = Pens.Black) { if (shape == MarqueeLightShape.Square) { e.Graphics.DrawRectangle(p, e.Bounds); } else { e.Graphics.DrawEllipse(p, e.Bounds); } } }

Anexar seu editor tipo UI a uma propriedade Quando estiver pronto para uso em seu controle personalizado, o editor tipo UI anexar propriedade. a uma propriedade, a propriedade com base no tipo MarqueeLightShape, implementar e aplicar o LightShapeEditor a EditorAttribute

Para anexar o editor tipo UI a uma propriedade

No corpo da definio do seu controle, declare uma MarqueeLightShape propriedade chamada LightShape. Tambm declarar um campo da instncia chamado lightShapeValue do tipo MarqueeLightShape para fazer a propriedade. Do EditorAttribute Aplicar para a propriedade.

C#
private MarqueeLightShape lightShapeValue; [Category("Marquee")] [Browsable(true)] [EditorAttribute(typeof(LightShapeEditor), typeof(System.Drawing.Design.UITypeEditor))] public MarqueeLightShape LightShape { get { return this.lightShapeValue; } set { this.lightShapeValue = value; } }

Teste seu editor tipo UI Voc pode testar seu editor tipo UI, criando uma instncia do seu controle personalizado e anexlos a um PropertyGrid controle usando a SelectedObject propriedade. Se voc estiver usando Visual Studio, voc pode criar um novo projeto aplicativo do Windows, referncia conjunto o do controle, e adicionar uma instncia do seu controle para o formulrio. H suporte para esta tarefa em Visual Studio abrangente. Quando as propriedades de seu controle so exibidas no tempo de criao, voc pode selecionar a LightShape propriedade. Quando ele estiver selecionado, uma seta suspensa. aparece ( ) Quando voc clica na seta, o controle de exibio exibida sob a entrada Propriedade. Clique no crculo ou quadrado para selecionar o valor. Aps voc clicar em, o controle de exibio descarta propriamente dito, e o valor selecionado exibido no PropertyGrid. Observao Quando voc desenvolver seu personalizadas UITypeEditor, recomendvel que voc definir o nmero de criao para incrementar com cada compilao. Isso impede que verses mais antigas, armazenadas em cache de sendo criada no ambiente de desenvolvimento. seu UITypeEditor Prximas etapas Aps voc ter criado seu prprio Editor tipo UI, Explore outras maneiras para interagir com um PropertyGrid e o ambiente de criao:

Visual C# Consolidado

744

Gravar um editor tipo UI com base em uma caixa de dilogo restrita em vez de um controle de exibio. Escrever um conversor tipo for um tipo personalizado usando a TypeConverter classe. Para obter mais informaes, consulte COMO: Implementar um conversor de tipo. Gravar um designer de seu controle personalizado. Para obter mais informaes, consulte COMO: Criar um controle de formulrios do Windows que tira vantagem de recursos em tempo de criao.

Como Criar um Serviced Component


O procedimento a seguir descreve como criar um novo componente de servio. Para criar um componente de servio 1. Definir uma classe que deriva direta ou indiretamente a partir da ServicedComponent classe. Por exemplo, o cdigo a seguir garante que a Calculator classe hospedada por um aplicativo do COM +. C#
using System.EnterpriseServices; public class Calculator : ServicedComponent { public int Add (int x, int y) { return(x+y); } }

2.

Aplicar atributos para indicar como cada conjunto, classe, ou mtodo deve interagir com funcionalidade com +. Observao No.NET Framework verso 1.1, a configurao de segurana do COM + habilitada por padro se o ApplicationAccessControlAttribute atributo no est presente no conjunto. Isso uma alterao no comportamento de .NET Framework verso 1.0.

C#
[assembly: ApplicationName("Calculator")] [assembly: System.Reflection.AssemblyKeyFile("Calculator.snk")] [MustRunInClientContext] public class Calculator : ServicedComponent { // Member definitions. }

3.

Gerar uma chave forte e compilar o exemplo a seguir: C#


sn k Calculator.snk csc /t:library /r:System.EnterpriseServices.dll Calculator.cs

4. 5.

Implantar o aplicativo de componentes atendidos por registrar seu conjunto dinamicamente ou manualmente. Aps um componente de servio estiver registrado, os clientes podem criar instncias do componente como eles criar instncias de qualquer outro componente. Para obter um exemplo completo, consulte Exemplo de servio do componente. Observao Em plataformas Windows 2000, com + sempre carrega a verso mais recente do Common Language Runtime do para o componente voc est criando. Isso significa que em um

Visual C# Consolidado

745

computador com o .NET Framework verso 1.0 e .NET Framework verso 1.1 instalado,.NET Framework verso 1.1 carregado sempre. Como uma soluo, voc pode criar um arquivo Dllhost.exe.Configuration COM + que permite que voc para bloquear todos os aplicativos para uma verso especfica do .NET Framework. No Windows xp e plataformas Windows Server 2003, a configurao diretrio raiz de aplicativo pode ser usada para apontar com + para uma pasta apropriada para seu arquivo de configurao. Exemplo C#
using System.EnterpriseServices; [assembly: ApplicationName("Calculator")] [assembly: System.Reflection.AssemblyKeyFile("Calculator.snk")] [MustRunInClientContext] public class Calculator : ServicedComponent { public int Add (int x, int y) { return(x+y); } }

Como Aplicar o Atributo Description a um Assembly


O exemplo a seguir mostra como aplicar o DescriptionAttribute atributo para definir a descrio de um conjunto. Exemplo C#
using System.EnterpriseServices; [ assembly: Description("BankComponent assembly")] public class Account : ServicedComponent { static void Main() {} }

Compilando o cdigo Este exemplo requer:

Referncias a espaos para nome do sistema e System.EnterpriseServices.

Como Usar os Mtodos SetAbort e SetComplete


Este exemplo mostra como usar o esttico SetComplete e SetAbort mtodos da classe System.EnterpriseServices.ContextUtil. Para obter mais informaes sobre esses mtodos, consulte Votao em uma transao automticas. Exemplo C#
//Try to do something crucial to the transaction in progress. if( !DoSomeWork() ) { ContextUtil.SetAbort(); //Something goes wrong. } else { ContextUtil.SetComplete(); //All goes well. }

Compilando o cdigo Este exemplo requer:

Referncias a espaos para nome do sistema e System.EnterpriseServices.

Como Aplicar o Atributo ApplicationID a um Assembly


Este exemplo mostra como aplicar o atributo ApplicationID a um conjunto. Exemplo

Visual C# Consolidado

746

C#
using System.EnterpriseServices; [ assembly: ApplicationName("BankComponent")] [ assembly: ApplicationID("4fb2d46f-efc8-4643-bcd0-6e5bfa6a174c")] public class Account : ServicedComponent { static void Main() {} }

Compilando o cdigo Este exemplo requer:

Referncias a espaos para nome do sistema e System.EnterpriseServices

Como Criar um Objeto de Pool e Definir seus Limites de Tamanho e de Tempo


Para uma classe que deriva da classe System.EnterpriseServices.ServicedComponent, com + Objeto pool pode usar para evitar a sobrecarga de instanciar objetos de zero. Em vez disso objetos obter recebidos de um pool quando ativado. Para obter mais informaes, consulte Objeto pool. Para criar um objeto agrupado e definir seu tamanho e tempo limite limita 1. Definir uma classe que deriva da classe System.EnterpriseServices.ServicedComponent, e aplique o ObjectPoolingAttribute atributo classe. Por exemplo, o cdigo a seguir define uma classe denominada TestObjectPooling e define e CreationTimeout propriedades para a classe. o MinPoolSize, MaxPoolSize C#
[ObjectPooling(Enabled=true, MinPoolSize=2, MaxPoolSize=5, CreationTimeout=20000)] public class TestObjectPooling : ServicedComponent { }

2. 3.

Substituir o Activate, Deactivate., e CanBePooled mtodos de classe System.EnterpriseServices.ServicedComponent Teste o objeto em pool, em um aplicativo do cliente: 1. Criar uma instncia da classe do objeto agrupada e chamar os mtodos no objeto em pool. Por exemplo, o cdigo a seguir cria uma instncia da classe TestObjectPooling e chama um Perform mtodo. C#
public class App { public static int Main(string[] args) { TestObjectPooling order = new TestObjectPooling(); order.Perform();

2. C#

Chame o mtodo DisposeObject para retornar o objeto para o pool.


ServicedComponent.DisposeObject (order);

Exemplo C#
[ObjectPooling(Enabled=true, MinPoolSize=2, MaxPoolSize=5, CreationTimeout=20000)] public class TestObjectPooling : ServicedComponent { public void Perform () { // Method contents go here. } protected override void Activate() { // Called when removed from the pool. } protected override void Deactivate() { // Called before deactivating or placing back in pool. } protected override bool CanBePooled() { // Called after Deactivate. Indicate your vote here. return true; } }

Visual C# Consolidado

747

Como criar um Mtodo de Web Service que Usa Transaes Automticas


O procedimento a seguir descreve como criar um mtodo de servio da Web que usa transaes automticas. Se ocorrer uma exceo enquanto um mtodo de servio da Web est participando em uma transao, ASP.NET anula automaticamente a transao. Da mesma forma, se nenhuma exceo ocorrer, a transao confirmada automaticamente. Para criar um servio da Web que usa transaes automticas 1. Importar os espaos para nome System.WebServices e System.EnterpriseServices. Outros espaos para nomes, tais como System.Data e System.Data.SqlClient, podem ser importado conforme necessrio. C#
<%@ WebService Language="C#" Class="Orders" %> <%@ assembly name="System.EnterpriseServices" %> using System.Web.Services; using System.EnterpriseServices;

2.

Definir uma classe que deriva da classe WebService. Por exemplo, o cdigo a seguir define uma classe denominado Pedidos que deriva da classe WebService. C#
public class Orders : WebService { }

3.

Para cada mtodo Web que deve participar automaticamente de uma transao, aplicar o WebMethodAttribute atributo, e definir a opo da transao. Por exemplo, no cdigo a seguir o atributo WebMethod aplicado para o DeleteAuthor mtodo, e a TransactionOption propriedade definida como TransactionOption.RequiresNew. C#
[ WebMethod(TransactionOption=TransactionOption.RequiresNew)] public int DeleteAuthor(string lastName) { // Perform the required database task. }

Exemplo C#
<%@ WebService Language="C#" Class="Orders" %> <%@ assembly name="System.EnterpriseServices" %> using System; using System.Data; using System.Data.SqlClient; using System.Web.Services; using System.Web.Util; using System.EnterpriseServices; public class Orders : WebService { [ WebMethod(TransactionOption=TransactionOption.RequiresNew)] public int DeleteAuthor(string lastName) { String deleteCmd = "DELETE FROM authors2 where au_lname='" + lastName + "'" ; SqlConnection sqlConn = new SqlConnection("Integrated Security=SSPI;database=pubs;server=myserver"); SqlCommand myCommand = new SqlCommand(deleteCmd,sqlConn); // If a Web service method is participating in a transaction and an // exception occurs, ASP.NET automatically aborts the transaction. // Likewise, if no exception occurs, then the transaction is // automatically committed. myCommand.Connection.Open(); return myCommand.ExecuteNonQuery(); } }

Como Definir a Propriedade SoapRoot Property para um Aplicativo


Este exemplo mostra como definir a propriedade SoapVRoot " MyVRoot ". Exemplo C#
[ApplicationActivation(ActivationOption.Library, SoapVRoot="MyVRoot")]

Visual C# Consolidado

748

Compilando o cdigo Este exemplo requer:

Referncias para o sistema e System.EnterpriseServices Namespace espaos para nome

Como Definir o Tempo Limite da Transao


Este exemplo mostra como definir o limite de transao como 10 segundos. Exemplo C#
[Transaction(TransactionOption.Required, Isolation=TransactionIsolationLevel.Serializable, Timeout=10)]

Compilando o cdigo Este exemplo requer:

Referncias ao espao para nome System.EnterpriseServices.

Como Definir o Nome do Aplicativo Usando o Atributo ApplicationName


Este exemplo mostra como para fornecer o nome do aplicativo, usando o conjunto - atributo ApplicationName. Exemplo C#
using System.EnterpriseServices; [ assembly: ApplicationName("BankComponent")] public class Account : ServicedComponent { static void Main() {} }

Compilando o cdigo Este exemplo requer:

Referncias para o sistema e System.EnterpriseServices espaos para nome.

Como Usar o Recurso BYOT (Bring Your Own Transaction - Traga sua Prpria Transao) do COM+
Exemplo do cdigo O procedimento e exemplo a seguir mostram como uma classe derivada da classe ServicedComponent pode usar o recurso BYOT do COM + para acessar um coordenador transaes distribudas (DTC). Para obter mais informaes como utilizar o recurso BYOT de dentro do espao de nome System.EnterpriseServices, consulte BYOT (colocar seu prprio Transaction). Para criar um objeto que usa a transao de outro objeto. 1. Definir uma classe que deriva da classe ServicedComponent, e expe uma propriedade pblica que retorna o objeto transaes DTC com + atual. Por exemplo, no cdigo a seguir a classe Base, herda a classe ServicedComponent e tem uma propriedade pblica que retorna o objeto ContextUtil.Transaction para a transao COM + DTC atual no qual o objeto instanciado.

Visual C# Consolidado

749

C#
using System.EnterpriseServices; public class Base : ServicedComponent { public Object Transaction { get { return ContextUtil.Transaction; } } }

2.

Crie duas classes que derivar da classe definida na etapa 1 e defina o atributo de transaes para ambas as classes. Por exemplo, o cdigo a seguir declara duas classes CTransaction1 e CTransaction2 derivar de classe Base, e tm seu conjunto de atributos de transaes. C#
[Transaction] public class CTransaction1 : Base { // Insert your transaction logic here. } [Transaction] public class CTransaction2 : Base { // Insert your transaction logic here. }

3.

Criar um aplicativo do cliente que usa as classes criadas na etapa 2 para testar o recurso BYOT. 1. Criar uma instncia de uma das classes definidas na etapa 2. Por exemplo, o cdigo a seguir cria uma instncia da classe CTransaction1. C#
class BYOTDemonstration { static void Main() { CTransaction1 tx1 = new CTransaction1(); } }

2.

Recuperar a transao COM + DTC atual do objeto criado no 3.a etapa. Por exemplo, o cdigo a seguir recupera o objeto transaes a partir da propriedade Transaction pblica da classe CTransaction1. C#
Object tx = tx1.Transaction;

3.

Criar uma instncia da classe segundo definiu na etapa 2, usando o objeto Transaction recuperado em 3.b etapa. Por exemplo, o cdigo a seguir cria uma instncia da classe CTransaction2 usando o Transaction recuperada em 3.b etapa. C#
CTransaction2 tx2 = (CTransaction2)BYOT.CreateWithTransaction(tx, typeof(CTransaction2));

4. C#

Gerar uma chave forte e compilar o exemplo a seguir:


sn k BYOTDemo.snk

Exemplo C#
using System; using System.Reflection; using System.EnterpriseServices; [assembly: AssemblyKeyFileAttribute("byotdemo.snk")] public class Base : ServicedComponent { public Object Transaction { get { return ContextUtil.Transaction; } } } [Transaction] public class CTransaction1 : Base { // Insert your transaction logic here. } [Transaction] public class CTransaction2 : Base { // Insert your transaction logic here. } class BYOTDemonstration { static void Main() { /* Create a transactional object, and then get its transaction. */ CTransaction1 tx1 = new CTransaction1(); Console.WriteLine("Created transaction1."); Object tx = tx1.Transaction; Console.WriteLine("Got the transaction of transaction1."); CTransaction2 tx2 = (CTransaction2)BYOT.CreateWithTransaction(tx, typeof(CTransaction2)); Console.WriteLine("Created transaction2 using the transaction of transaction1."); } }

Como Criar um Componente Privado Visual C# Consolidado 750

Este exemplo mostra como usar o atributo PrivateComponentAttribute em uma classe. Exemplo C#
[PrivateComponent] public class CPrivate : ServicedComponent

Compilando o cdigo Este exemplo requer:

Referncias ao espao para nome System.ServiceProcess.

Consulte tambm Referncia

Como Definir o Tipo de Ativao de um Aplicativo


Este exemplo mostra como definir o tipo de ativao para " Servidor ". Exemplo C#
using System.EnterpriseServices; [ assembly: ApplicationActivation(ActivationOption.Server)] public class Account : ServicedComponent { static void Main() {} }

Compilando o cdigo Este exemplo requer:

Referncias para o sistema e System.EnterpriseServices espaos para nome.

Consulte tambm Referncia

Como Habilitar Sincronizao em Instncias de uma Classe


O exemplo a seguir mostra como habilitar a sincronizao em instncias da classe TestSync . Exemplo C#
[Synchronization] public class TestSync : ServicedComponent

Compilando o cdigo Este exemplo requer:

Referncias para o sistema e System.EnterpriseServices espaos para nome.

Como Usar Transaes Automticas em uma Classe do .NET Framework


O procedimento a seguir descreve como preparar uma classe para participar de uma transao automtica. Para preparar uma classe para participar de uma transao automtica

Visual C# Consolidado

751

1.

Do TransactionAttribute derivar sua classe de classe ServicedComponent, e aplicar sua classe. O exemplo a seguir mostra como aplicar o atributo TransactionAttribute a uma classe derivada da classe ServicedComponent. C#
[Transaction(TransactionOption.Required)] public class Account : ServicedComponent { //. . . }

2.

Aplicar o atributo AutoCompletar para cada mtodo para o qual o mtodo ContextUtil.SetComplete deve ser chamado automaticamente na ausncia de excees. O exemplo a seguir mostra como aplicar o atributo AutoCompletar. C#
[AutoComplete] public void Debit(int amount) { // Do some database work. Any exception thrown here aborts the // transaction; otherwise, transaction commits. }

3.

Assinar o assembly com um strong name. Do AssemblyKeyFileAttribute para assinar o conjunto usando atributos, crie um par de chaves usando Sn.exe, e adicione ou AssemblyKeyNameAttribute Conjunto atributo e especifique o nome do arquivo que contm o par de chaves para assinar o conjunto com um nome de alta segurana. C#
[assembly: AssemblyKeyFileAttribute("TestApp.snk")]

4. 5.

Registrar o conjunto que contm a classe com o catlogo COM +. Se as instncias de chamada de sua classe do cliente gerenciado pelo Common Language Runtime, o registro ser executado para voc. No entanto, se voc prev que um chamador no gerenciado pode criar e chamar instncias da sua classe, usar a ferramenta de instalao dos Servios .NET (Regsvcs.exe) para executar o Registro manualmente.

Exemplo C#
// ----------------------------------------------------------------- // TestApp.cs // Generate a Strong name: // sn -k TestApp.snk // Compile the code: // csc /target:exe /r:System.EnterpriseServices.dll TestApp.cs // Run TestApp: // start TestApp.exe // ----------------------------------------------------------------- using System; using System.Runtime.CompilerServices; using System.EnterpriseServices; using System.Reflection; //Registration details. //COM+ application name as it appears in the COM+ catalog. [assembly: ApplicationName("TestApp")] //Strong name for assembly. [assembly: AssemblyKeyFileAttribute("TestApp.snk")] [Transaction(TransactionOption.Required)] public class Account : ServicedComponent { //Provides SetComplete behavior in the absence of exceptions. [AutoComplete] public void Debit(int amount) { // Do some database work. Any exception thrown here aborts the // transaction; otherwise, transaction commits. } } public class client { public static int Main() { Account accountX = new Account(); accountX.Debit(100); return 0; } }

Como Habilitar Ativao JIT


Este exemplo mostra como habilitar ativao JIT e desativao e de uma classe. Exemplo C#
[JustInTimeActivation] public class TestJITObjectPooling : ServicedComponent

Compilando o cdigo

Visual C# Consolidado

752

Este exemplo requer:

Referncias para o sistema e System.EnterpriseServices espaos para nome.

Como Definir o Atributo AutoComplete em uma Classe Transaction-Aware


Este exemplo mostra a colocao de atributo AutoCompletar em uma classe reconhecem transaes. Para obter mais informaes sobre o AutoCompletar atributo, consulte Votao em uma transao automticas. Exemplo C#
[Transaction(TransactionOption.Supported)] public class Account : ServicedComponent { [AutoComplete] public void Debit(int amount) { // Do some database work. Any exception thrown here aborts the // transaction; otherwise, transaction commits. } }

Compilando o cdigo Este exemplo requer:

Referncias a espaos para nome do sistema e System.EnterpriseServices.

Como Implementar um Componente Enfileirado que Exibe uma Mensagem de Forma Assncrona
Exemplo do cdigo O servio QC COM + fornece uma maneira de uma classe componente para ser chamado assincronamente USAR O enfileiramento de mensagens Microsoft. Para obter mais informaes sobre componentes enfileirados derivados da System.EnterpriseServices.ServicedComponent classe, consulte O QC (queueds Components). Para implementar um componente enfileirado que exibe uma mensagem de forma assncrona 1. Importar espao para nome System.EnterpriseServices. C#
using System.EnterpriseServices;

2.

Defina o ApplicationActivation atributo como ActivationOption.Server; ativar o ouvinte da fila aplicativo enfileiramento e definindo o ApplicationQueuing atributo assembly, como mostrado no cdigo de exemplo a seguir: C#
[assembly: ApplicationActivation(ActivationOption.Server)] [assembly: ApplicationQueuing(Enabled=true, QueueListenerEnabled=true)]

3.

Definir uma interface na fila, e aplique o InterfaceQueuing atributo interface. Por exemplo o cdigo a seguir mostra o atributo InterfaceQueuing aplicada para a IQComponent interface que tenha um nico mtodo DisplayMessage. C#
[InterfaceQueuing] public interface IQComponent { void DisplayMessage(string msg); }

4.

Definir uma classe que deriva da classe System.EnterpriseServices.ServicedComponent e implementa a interface na fila. Por exemplo, o cdigo de exemplo a seguir declara uma

Visual C# Consolidado

753

classe denominada QComponent que deriva da classe System.EnterpriseServices.ServicedComponent e implementa a IQComponent interface. C#
public class QComponent : ServicedComponent, IQComponent { public void DisplayMessage(string msg) { MessageBox.Show(msg, "Processing message"); } }

5.

Criar um aplicativo cliente e testar o componente enfileirado. 1. Criar uma varivel cujo tipo de dados a interface na fila do qual a classe componente enfileirado derivada. C#
IQComponent iQc = null;

2.

Vincular ao moniker correspondente interface na fila, e chamamos o mtodo no componente enfileirado para exibir a mensagem de forma assncrona. Por exemplo o cdigo a seguir vincula ao componente enfileirado que corresponda interface IQComponent, e chama o mtodo DisplayMessage para exibir uma mensagem de forma assncrona. C#
IQComponent iQc = null; try { iQc = (IQComponent) Marshal.BindToMoniker("queue:/new:QCDemo.QComponent"); } catch { MessageBox.Show("Cannot create Queued Component"); } iQc.DisplayMessage (messageToSend.Text); Marshal.ReleaseComObject(iQc);

Exemplo C#
using System.Reflection; using System.EnterpriseServices; [assembly: ApplicationName("QCDemoSvr")] [assembly: ApplicationActivation(ActivationOption.Server)] [assembly: ApplicationQueuing(Enabled=true, QueueListenerEnabled=true)] [assembly: AssemblyKeyFile("QCDemoSvr.snk")] namespace QCDemo { [InterfaceQueuing] public interface IQComponent { void DisplayMessage(string msg); } public class QComponent : ServicedComponent, IQComponent { public void DisplayMessage(string msg) { MessageBox.Show(msg, "Processing message"); } } }

Como Implementar Eventos Fracamente Acoplados


Exemplo do cdigo O procedimento e exemplo a seguir mostram como para implementar uma classe de evento e coletor de eventos que implementam uma interface de eventos comuns, mais um editor para acionar um evento. Para obter mais informaes sobre como usar o modelo flexvel coupled Eventos COM +, consulte Eventos flexvel Coupled. Para implementar flexvel aliada eventos 1. Definir uma interface de eventos. Por exemplo, o cdigo a seguir define uma interface de evento denominada IlceMsg que tenha um mtodo chamado EventMethod. C#
public interface ILceMsg { void EventMethod(string message); }

Visual C# Consolidado

754

2.

Definir uma classe de evento que deriva da classe System.EnterpriseServices.ServicedComponent e implementa a interface de evento definiu na etapa 1. Por exemplo, o cdigo a seguir define uma classe de evento chamado LceClass. C#
[EventClass] public class LceClass : ServicedComponent, ILceMsg { public void EventMethod(string message){} }

3.

Definir uma classe mesmo do coletor que deriva da classe System.EnterpriseServices.ServicedComponent e implementa a interface de evento definiu na etapa 1. Por exemplo, o cdigo a seguir define uma classe do coletor de evento chamado LceSink. C#
public class LceSink : ServicedComponent, ILceMsg { public void EventMethod(string message) { MessageBox.Show(message, "Event sink"); } }

4.

Criar um editor de eventos para disparar o LCE. C#


protected void Fire_Click (object sender, System.EventArgs e) { ILceMsg evt = (ILceMsg) new LceClass(); evt.EventMethod("Hello events"); }

Exemplo C#
using System; using System.IO; using System.Reflection; using System.EnterpriseServices; using System.Runtime.InteropServices; [assembly: ApplicationName("EventDemo")] [assembly: ApplicationActivation(ActivationOption.Library)] [assembly: AssemblyKeyFile("EventDemoSvr.snk")] namespace EventDemo { public interface ILceMsg { void EventMethod(string message); } [EventClass] public class LceClass : ServicedComponent, ILceMsg { public void EventMethod(string message){} } public class LceSink : ServicedComponent, ILceMsg { public void EventMethod(string message) { MessageBox.Show(message, "Event sink"); } } }

C#
//Publisher protected void Fire_Click (object sender, System.EventArgs e) { ILceMsg evt = (ILceMsg) new LceClass(); evt.EventMethod("Hello events"); }

Como Configurar a Construo de Objetos


O procedimento e exemplo a seguir descrevem como configurar construo de objeto e definir a seqncia de inicializao padro da classe TestObjectConstruct para a seqncia "Initial Catalog=Northwind;Data Source=.\\SQLServerInstance;Trusted_Connection=yes". Essa seqncia usada para conectar a um banco de dados SQL Server. O tpico Construo de objeto,. explica mais o uso do COM + construo de objeto a partir da System.EnterpriseServices.ServicedComponent classe Para configurar construo de objeto e definir a seqncia de inicializao padro para uma classe 1. Definir uma classe que deriva direta ou indiretamente a partir da System.EnterpriseServices.ServicedComponent classe. Por exemplo, o cdigo a seguir mostra uma classe TestObjectConstruct que deriva diretamente da classe System.EnterpriseServices.ServicedComponent. C#

Visual C# Consolidado

755

using System; using System.EnterpriseServices; using System.Data; using System.Data.SqlClient; public class TestObjectConstruct : ServicedComponent { }

2.

Aplicar o ConstructionEnabled atributo para a classe e definir propriedade do atributo Default. Por exemplo, o cdigo a seguir se aplica o ConstructionEnabled atributo da TestObjectConstruct classe e define a Padro propriedade como a seqncia de conexo SQL Server. C#
[ConstructionEnabled(Default="Initial Catalog=Northwind;Data Source=.\\SQLServerInstance;Trusted_Connection=yes")] public class TestObjectConstruct : ServicedComponent { }

3.

Substituir o mtodo construir. Visual Basic


<ConstructionEnabled([Default] := "Initial Catalog=Northwind;Data Source=.\\SQLServerInstance;Trusted_Connection=yes")> _ Public Class TestObjectConstruct Inherits ServicedComponent Private m_connectStr As String Private conn as SqlConnection Protected Overrides Sub Construct(constructString As String) ' Called after constructor. m_connectStr = constructString End Sub Public Sub ConnectToDatabase() conn = New SqlConnection(m_connectStr) End Sub End Class [C#] [ConstructionEnabled(Default="Initial Catalog=Northwind;Data Source=.\\SQLServerInstance;Trusted_Connection=yes")] public class TestObjectConstruct : ServicedComponent { private string connectStr; SqlConnection conn; public TestObjectConstruct() { } protected override void Construct(string constructString) { // Called after constructor. connectStr = constructString; } public void ConnectToDatabase() { conn = new SqlConnection(connectStr); conn.Open(); } }

4.

No aplicativo do cliente, criar uma instncia da classe do componente sem especificar uma seqncia de construo, para que o padro usado. Por exemplo, o cdigo a seguir cria uma instncia da classe TestObjectConstruct, e a seqncia de construo padro ser "Initial Catalog=Northwind;Data Source=.\\SQLServerInstance;Trusted_Connection=yes". C#
public class App { public static void Main() { TestObjectConstruct order = new TestObjectConstruct(); order. ConnectToDatabase(); } }

Depois de instalar o aplicativo Servios componente, voc pode especificar seqncias de construo por meio da ferramenta administrativa Servios de componente. Para inserir uma seqncia de construo de objeto para um componente, execute as seguintes etapas: 1. 2. 3. Abra a ferramenta administrativa Servios de componente. Clique com boto direito na ferramenta administrativa Servios de componente, mouse no componente que voc deseja configurar, e, em seguida, clique em Properties. Se voc no tenha definido o atributo ConstructionEnabled para True, na caixa Properties de dilogo, na guia Activation, marque a Enable object construction caixa de seleo para ativar o uso da seqncia de caracteres de construo do objeto. Se voc desejar alterar a seqncia de construo do padro especificado com o atributo ConstructionEnabled, na caixa Constructor string, insira a seqncia de construo.

4.

Exemplo

Visual C# Consolidado

756

C#
using System; using System.EnterpriseServices; using System.Data; using System.Data.SqlClient; [assembly : ApplicationName("OCDemo")] namespace OCDemo { [ConstructionEnabled(Default="Initial Catalog=Northwind; Data Source=.\\SQLServerInstance;Trusted_Connection=yes")] public class TestObjectConstruct : ServicedComponent { private string connectStr; SqlConnection conn; public TestObjectConstruct() { } protected override void Construct(string constructString) { // Called after constructor. connectStr = constructString; } public void ConnectToDatabase() { conn = new SqlConnection(connectStr); conn.Open(); } } }

Como Obter Informaes de Tipo e Membros de um Assembly


O System.Reflection espao para nome contm vrios mtodos para obter informaes de um conjunto de mdulos (assembly). Esta seo demonstra um dos mtodos. Para obter informaes adicionais, consulte Viso geral de reflexo. O exemplo a seguir obtm informaes Tipo e membro de um conjunto. Exemplo C#
using System; using System.Reflection; class Asminfo1 { public static void Main(string[] args) { Console.WriteLine ("\nReflection.MemberInfo"); //Get the Type and MemberInfo. //Insert the fully qualified class name inside the quotation marks in the following statement. Type MyType =Type.GetType("System.IO.BinaryReader"); MemberInfo[] Mymemberinfoarray = MyType.GetMembers(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Static|BindingFlags.Insta nce|BindingFlags.DeclaredOnly); //Get and display the DeclaringType method. Console.Write("\nThere are {0} documentable members in ", Mymemberinfoarray.Length); Console.Write("{0}.", MyType.FullName); foreach (MemberInfo Mymemberinfo in Mymemberinfoarray) { Console.Write("\n" + Mymemberinfo.Name); } } }

Como Criar um Assembly de Arquivo nico


Um conjunto de Arquivo nico, que o tipo mais simples do conjunto, contm informaes de tipo e implementao,, bem como o Manifesto do conjunto. Voc pode usar Compiladores de linha de comando ou Visual Studio 2005 Para criar um conjunto de Arquivo nico. Por padro, o compilador cria um arquivo de montagem com uma extenso.exe. Observao Para Visual Studio 2005 C# e Visual Basic pode ser usada somente para criar conjuntos de Arquivo nico. Se voc deseja criar vrios arquivos conjuntos, use Compiladores de linha de comando ou Visual Studio 2005 com as extenses Managed do C++.. ou Visual Studio 2005 Com o Managed Extensions para C++ Os procedimentos a seguir mostram como criar conjuntos de Arquivo nico usando Compiladores de linha de comando. Para criar um conjunto com uma extenso.exe

Visual C# Consolidado

757

No prompt de comando, digite o seguinte comando: < compiler command> <module name> Neste comando, compiler command o comando do compilador para o idioma usado em seu mdulo de cdigo, e module name o nome do mdulo de cdigo para compilar para o conjunto.

O exemplo a seguir cria um conjunto chamado myCode.exe de um mdulo de cdigo chamado myCode. C#
csc myCode.cs

Para criar um conjunto com uma extenso.exe e especificar o nome do arquivo de sada

No prompt de comando, digite o seguinte comando: < compiler command> /out:<file name> <module name> Neste comando, compiler command o comando do compilador para o idioma usado em seu mdulo de cdigo, file name o nome de arquivo de sada, e module name o nome do mdulo de cdigo para compilar para o conjunto.

O exemplo a seguir cria um conjunto chamado myAssembly.exe de um mdulo de cdigo chamado myCode. C#
csc /out:myAssembly.exe myCode.cs

Criando conjuntos da biblioteca Um conjunto de biblioteca semelhante a uma biblioteca de classes. Ele contm tipos que sero referenciados por outros conjuntos, mas ele tem nenhum ponto de entrada para iniciar a execuo.

Para criar um conjunto de biblioteca

No prompt de comando, digite o seguinte comando: < compiler command> /t:library <module name> Neste comando, compiler command o comando do compilador para o idioma usado em seu mdulo de cdigo, e module name o nome do mdulo de cdigo para compilar para o conjunto. Voc pode usar outras opes do compilador, como a /out: opo.

O exemplo a seguir cria um conjunto de biblioteca chamado myCodeAssembly.dll de um mdulo de cdigo chamado myCode. C#
csc /out:myCodeLibrary.dll /t:library myCode.cs

Como: Criar um domnio de aplicativo


Um host Runtime de idioma comum cria domnios aplicativos automaticamente quando eles so necessrios. No entanto, voc pode criar seus prprios domnios aplicativos e carreg-los esses

Visual C# Consolidado

758

conjuntos que voc deseja gerenciar pessoal. Voc tambm pode criar domnios de aplicativo do qual voc executar cdigo. Criar um novo domnio do aplicativo usando um dos mtodos sobrecarregados CreateDomain na classe System.AppDomain. Voc pode dar o domnio do aplicativo um nome e fazer referncia a ela com esse nome. O exemplo a seguir cria um novo domnio do aplicativo, atribui o nome MyDomain, e seguida, imprime o nome de domnio host e domnio de aplicativo filho recm-criado para o console. Exemplo C#
using System; using System.Reflection; class AppDomain1 { public static void Main() { Console.WriteLine("Creating new AppDomain."); AppDomain domain = AppDomain.CreateDomain("MyDomain"); Console.WriteLine("Host domain: " + AppDomain.CurrentDomain.FriendlyName); Console.WriteLine("child domain: " + domain.FriendlyName); }}

Como determinar um conjunto o nome totalmente qualificado:


H vrias maneiras para descobrir o nome totalmente qualificado de um conjunto no cache de conjunto global:

Use o Ferramenta Configurao estrutura .NET (Mscorcfg.msc). Exibir o diretrio do cache de conjunto de mdulos global. Use o Global ferramenta cache assembly (Gacutil.exe).

Procedimentos

Para exibir os nomes de conjuntos totalmente qualificados no cache de conjunto global usando a ferramenta .NET Framework Configuration
1. 2. Clique no Start boto, aponte para Administrative Tools, e clique em Microsoft .NET Framework Configuration Clique em Manage the Assembly Cache e, clique em View List of Assemblies in the Assembly Cache.

Para obter informaes sobre como usar a ferramenta Global Assembly Cache para exibir os nomes de conjuntos, totalmente qualificados Consulte Como Visualizar o Contedo da Cache Global de Assemblies. Do Disassembler MSIL (Ildasm.exe) para conjuntos de mdulos (assemblies) que no esto no cache de conjunto global, voc pode usar cdigo para exibir as informaes para o console ou a uma varivel, ou voc pode usar para examinar metadados do conjunto, que contm o nome totalmente qualificado. Para obter mais informaes sobre como definir atributos do conjunto, como verso, cultura e nome do conjunto, consulte Definir atributos Assembly. Para obter mais informaes sobre dar um conjunto um nome de alta segurana, consulte Criando e usando assemblies de nome forte. Exemplo

Visual C# Consolidado

759

O exemplo de cdigo a seguir mostra como exibir o nome totalmente qualificado de um conjunto que contm uma classe especificada para o console. C#
using System; using System.Reflection; class asmname { public static void Main() { Type t = typeof(System.Data.DataSet); string s = t.Assembly.FullName.ToString(); Console.WriteLine("The fully qualified assembly name containing the specified class is {0}.", s); } } Imports System Imports System.Reflection Imports Microsoft.VisualBasic ' For a class not contained in mscorlib.dll, compile this code with ' the /r:<dllname> option; for example,compile the code below using: ' vbc asmname.vb /r:System.Data.dll /r:System.dll /r:System.Xml.dll ' If the class is contained in mscorlib.dll, the /r:<dllname> compiler option is unnecessary. Class asmname Public Shared Sub Main() Dim t As Type = GetType(System.Data.DataSet) Console.WriteLine("The fully qualified assembly name containing the specified class is {0}.", t.Assembly.FullName.ToString()) End Sub 'Main End Class 'asmname

Como Configurar um Domnio de Aplicativo


Voc pode fornecer o Common Language Runtime com informaes de configurao para um novo domnio do aplicativo usando a AppDomainSetup classe. Ao criar seus prprios domnios de aplicativo, a propriedade mais importante ApplicationBase. As outras AppDomainSetup propriedades so usadas principalmente por hosts de tempo de execuo para configurar um domnio aplicativo especfico. A ApplicationBase propriedade Define o Diretrio de raiz do aplicativo. Quando o Runtime precisa atender uma requisio tipo, ele investiga para o conjunto que contm o tipo no diretrio especificado pela propriedade ApplicationBase. Observao Um novo domnio do aplicativo herdar apenas a ApplicationBase propriedade do criador. O exemplo a seguir cria uma instncia da classe AppDomainSetup, usa esta classe para criar um novo domnio do aplicativo, grava as informaes ao console, e depois descarrega o domnio do aplicativo. Exemplo C#
using System; using System.Reflection; class AppDomain4 { public static void Main() { // Create application domain setup information. AppDomainSetup domaininfo = new AppDomainSetup(); domaininfo.ApplicationBase = "f:\\work\\development\\latest"; // Create the application domain. AppDomain domain = AppDomain.CreateDomain("MyDomain", null, domaininfo); // Write application domain information to the console. Console.WriteLine("Host domain: " + AppDomain.CurrentDomain.FriendlyName); Console.WriteLine("child domain: " + domain.FriendlyName); Console.WriteLine("Application base is: " + domain.SetupInformation.ApplicationBase); // Unload the application domain. AppDomain.Unload(domain); } }

Como Visualizar o Contedo de um Assembly

Visual C# Consolidado

760

Voc pode usar para exibir informaes linguagem intermediria (MSIL) Microsoft em um arquivo. o Disassembler MSIL (Ildasm.exe) Se o arquivo sendo examinado for um conjunto, essas informaes podem incluir atributos do conjunto,, bem como referncias a outros mdulos e conjuntos. Essas informaes podem ser til para determinar se um arquivo um conjunto ou parte de um conjunto, e se o arquivo possui referncias a outros mdulos ou conjuntos. Para exibir o contedo de um conjunto usando Ildasm.exe

Type ildasm <assembly name> at the command prompt. Por exemplo, o comando a seguir desmonta o Hello.exe conjunto.
ildasm Hello.exe

Para exibir informaes manifesto do conjunto

Clique duas vezes no cone MANIFEST na janela Disassembler MSIL.

Exemplo O exemplo a seguir inicia com " Um Hello, bsico " World programa. Depois compilar o programa, use Ildasm.exe para desmontar o conjunto Hello.exe e exibir o manifesto do conjunto. Visual Basic
Imports System Public Module modmain Sub Main() Console.WriteLine ("Hello World using Visual Basic!") End Sub End Module using System; class MainApp { public static void Main() { Console.WriteLine("Hello World using C#!"); } } #using <mscorlib.dll> using namespace System; void main() { Console::WriteLine(L"Hello World using Managed Extensions!"); }

Executando o ildasm.exe Comando no conjunto Hello.exe e duas vezes no cone MANIFEST na janela DASM IL produz o seguinte resultado:
.assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 1:0:2411:0 } .assembly Hello { // --- The following custom attribute is added automatically; do not uncomment. ------- // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(bool, // bool) = ( 01 00 00 01 00 00 ) .hash algorithm 0x00008004 .ver 0:0:0:0 } .module Hello.exe // MVID: {58AD9DFD-63A6462A-8AD5-42CBC95AA147} .subsystem 0x00000003 .file alignment 512 .corflags 0x00000001 // Image base: 0x03330000

A tabela a seguir descreve cada diretiva no conjunto do manifesto da montagem Hello.exe usado no exemplo. Diretiva .assembly extern <assembly name> Descrio Especifica outro conjunto que contm itens referenciados pelo mdulo atual (, neste exemplo, mscorlib).

.publickeytoken <token> Especifica o smbolo da chave real da montagem referenciada. .ver <version number> .assembly <assembly name> .hash algorithm <int32 value> .ver <version number> Especifica o nmero de verso da montagem referenciada. Especifica o nome do conjunto. Especifica o algoritmo hash usado. Especifica o nmero de verso do conjunto.

Visual C# Consolidado

761

.module <file name> .subsystem <value>

Especifica o nome dos mdulos que compem o conjunto. Neste exemplo, o conjunto consiste em apenas um arquivo. Especifica o ambiente do aplicativo necessrio para o programa. Neste exemplo, o valor 3 indica que este executvel executado de um console. Atualmente um campo reservado nos metadados.

corflags

Um manifesto do conjunto pode conter um nmero de diretivas diferentes, dependendo do contedo do conjunto. Para obter uma lista abrangente das diretivas no manifesto do conjunto, consulte a documentao ECMA, especialmente " ii partio metadados: e semntica " definio e " partio III: CIL instruo Set ". A documentao est disponvel online em http://msdn.microsoft.com/net/ECMA/ e http://www.ECMAInternational.org/publications/Standards/ECMA-335.htm.

Como Referenciar um Assembly de Nome Forte


O processo na referncia tipos ou recursos em um conjunto de nome seguro normalmente transparente. Voc pode fazer a referncia no tempo de compilao (antecipada ligao) ou em tempo de execuo. Uma referncia em tempo de compilao ocorre quando voc indicar o compilador para que seu conjunto faz referncia outro conjunto explicitamente. Quando voc usar em tempo de compilao referncia, automaticamente o compilador obtm a chave pblica do conjunto de nome seguro de destino e coloca-na referncia do conjunto da montagem sendo compilada. Observao Um conjunto de nome seguro s pode usar tipos de outros conjuntos de nome seguro. Caso contrrio a segurana do conjunto de nome seguro deve ser comprometida. Fazer uma referncia a um conjunto de nome seguro em tempo de compilao

No prompt de comando, digite o seguinte comando: < compiler command> /reference:<assembly name> Neste comando, compiler command o comando do compilador para o idioma que voc est usando e assembly name o nome do conjunto de nome seguro sendo referenciado. Voc pode usar outras opes do compilador, como a /t:library opo para criar um conjunto de biblioteca.

O exemplo a seguir cria um conjunto chamado myAssembly.dll que referncias um conjunto de nome seguro chamado myLibAssembly.dll a partir de um mdulo de cdigo chamado myAssembly.cs.
csc /t:library myAssembly.cs /reference:myLibAssembly.dll

Fazer uma referncia a um conjunto de nome seguro em tempo de execuo

Quando voc fazer uma referncia em tempo de execuo a um conjunto de nome seguro, por exemplo, usando voc deve usar o nome de exibio do conjunto de nome seguro referenciado. ou Assembly.GetType mtodos, o Assembly.Load A sintaxe de um nome de exibio a seguinte:

< assembly name>, <version number>, <culture>, <public key token>

Visual C# Consolidado

762

Por exemplo:
myDll, Version=1.1.0.0, Culture=en, PublicKeyToken=03689116d3a4ae33

Do PublicKeyToken, neste exemplo, a forma hexadecimal do smbolo de chave pblica. Se houver nenhum valor de cultura, use Culture=neutral. O exemplo de cdigo a seguir mostra como usar essas informaes com o Assembly.Load mtodo. C#
Assembly.Load("myDll,Version=1.0.0.1,Culture=neutral,PublicKeyToken=9b35aa32c18d4fb1");

Voc pode imprimir o formato hexadecimal da chave pblica e smbolo de chave pblica para um conjunto especfico usando o seguinte Ferramenta nome forte (SN.exe) Comando: sn -Tp <assembly> Se voc tiver um arquivo chave pblico, use o seguinte comando em vez disso (observe a diferena no caso com a opo de linha de comando):: (observe a diferena no caso com a opo de linha de comando) sn -tp <assembly>

Como: Descarregar um domnio de aplicativo


Quando voc tiver terminado usando um domnio de aplicativo, descarreg-lo usando o System.AppDomain.Unload mtodo. O Unload mtodo normalmente desliga o domnio do aplicativo especificado. Durante o processo descarregando, nenhum novo segmento pode acessar o domnio de aplicativo, e so liberadas estruturas dados especficos de domnio do aplicativo todos os. Conjuntos carregados no domnio de aplicativo so removidas e no esto mais disponveis. Se um conjunto no domnio do aplicativo domnio neutro-, dados para o conjunto permanece na memria at que o processo inteiro desligado. No h nenhum mecanismo para descarregar um conjunto-domnio neutro diferente desligar o processo inteiro. H situaes em que a solicitao para descarregar um domnio de aplicativo no funciona e resulta em um CannotUnloadAppDomainException.. um CannotUnloadAppDomainException O exemplo a seguir cria um novo domnio denominado MyDomain do aplicativo, imprime algumas informaes ao console, e depois descarrega o domnio do aplicativo. Observe que o cdigo tenta imprimir o nome amigvel do domnio do aplicativo descarregado para o console. Essa ao gera uma exceo que tratada pelas instrues try / catch no final do programa. Exemplo C#
using System; using System.Reflection; class AppDomain2 { public static void Main() { Console.WriteLine("Creating new AppDomain."); AppDomain domain = AppDomain.CreateDomain("MyDomain", null); Console.WriteLine("Host domain: " + AppDomain.CurrentDomain.FriendlyName); Console.WriteLine("child domain: " + domain.FriendlyName); AppDomain.Unload(domain); try { Console.WriteLine(); Console.WriteLine("Host domain: " + AppDomain.CurrentDomain.FriendlyName); // The following statement creates an exception because the

Visual C# Consolidado

763

domain no longer exists. Console.WriteLine("child domain: " + domain.FriendlyName); } catch (AppDomainUnloadedException e) { Console.WriteLine("The appdomain MyDomain does not exist."); } } }

Como Remover um Assembly de Cache Global de Assemblies


Do Ferramenta Assembly Cache global (Gacutil.exe) uso para remover um conjunto de cache de conjunto global. Para remover um conjunto de cache de conjunto global

No prompt de comando, digite o seguinte comando: gacutil u <assembly name> Neste comando, assembly name o nome da montagem para remover do cache de conjunto global.

O exemplo a seguir remove um conjunto chamado hello.dll do cache de conjunto global.


gacutil -u hello

O SDK do .NET Framework tambm fornece uma extenso Shell do Windows chamado que voc pode usar para remover conjuntos de cache de conjunto global. o Visualizador cache do conjunto (Shfusion.dll),

Como Instalar um Assembly na Cache Global de Assemblies


Existem quatro maneiras para instalar um conjunto no cache de conjunto global:

Usando o Ferramenta Assembly Cache global (Gacutil.exe). Voc pode usar Gacutil.exe para adicionar conjuntos de nome seguro de cache de conjunto global e para exibir o contedo do cache de montagem global. Observao Gacutil.exe serve apenas para fins de desenvolvimento e no deve ser usado para instalar conjuntos de produo no cache de conjunto global.

Usando o Microsoft Windows Installer 2.0. Essa a maneira recomendada e mais comum para adicionar conjuntos de cache de conjunto global. O instalador fornece referncia Contagem de conjuntos no cache de conjunto global, e outros benefcios.

Usando uma extenso do shell do Windows fornecido pelo SDK do .NET Framework chamado o Visualizador cache do conjunto (Shfusion.dll). A extenso do shell permite que voc a arrastar conjuntos para cache de conjunto global. Usando o Ferramenta Configurao estrutura .NET (Mscorcfg.msc). O Ferramenta Configurao estrutura .NET (Mscorcfg.msc) permite que voc se exibir o cache de conjunto de mdulos global e adicionar novos conjuntos de no cache.

Para instalar um conjunto de nome seguro no cache de conjunto global usando a ferramenta Global Assembly Cache (Gacutil.exe)

No prompt de comando, digite o seguinte comando:

Visual C# Consolidado

764

gacutil I <assembly name> Neste comando, assembly name o nome da montagem para instalar em cache de conjunto global. O exemplo a seguir instala um conjunto com o nome hello.dll de arquivo no cache de conjunto global.
gacutil -i hello.dll

Como Criar um Assembly de Mltiplos Arquivos


Esta seo descreve o procedimento utilizado para criar um conjunto de vrios arquivos e fornece um exemplo completo que ilustra cada uma das etapas no procedimento. Para criar um conjunto de vrios arquivos 1. Compilar todos os arquivos que contm espaos para nome referido por outros mdulos na montagem em mdulos de cdigo. A extenso padro para mdulos de cdigo .netmodule. Por exemplo, se criar um arquivo chamado Stringer espao para nome chamada myStringer que referenciado no arquivo Cdigo do cliente, Stringer deve ser compilado em um mdulo de cdigo primeiro. Compilar todos os outros mdulos, usando as opes do compilador necessrio para indicar os outros mdulos que so referenciados no cdigo. Do Vinculador do conjunto (AL.exe) uso para criar o arquivo de sada que contm o manifesto do conjunto. Esse arquivo contm informaes de referncia para todos os mdulos ou recursos que fazem parte do conjunto. Observao O Visual Studio 2005 IDE de C# e Visual Basic poder somente usar para criar conjuntos de Arquivo nico. Se voc desejar criar vrios arquivos conjuntos, deve usar os compiladores de linha de comando ou Visual Studio 2005 com Visual C++.. ou Visual Studio 2005 com Visual C++ O exemplo a seguir ilustra a etapa 1 do procedimento acima, por compilao arquivos com espaos para nome referido por outros arquivos. Este exemplo inicia com alguns cdigo simples para o Stringer arquivo. Espao para nome chamado myStringer com uma classe chamado StringerStringer. A Stringer classe contm um mtodo chamado StringerMethod que grava uma nica linha para o console. C#
// Assembly building example in the .NET Framework SDK. using System; namespace myStringer { public class Stringer { public void StringerMethod() { System.Console.WriteLine("This is a line from StringerMethod."); } } }

2. 3.

Use o seguinte comando para compilar este cdigo: C#


csc /t:module Stringer.cs

Visual C# Consolidado

765

Especificando o module parmetro com a /t: opo de compilador indica que o arquivo deve ser compilado como um mdulo em vez de como um conjunto. O compilador produz um mdulo chamado Stringer.netmodule, que pode ser adicionado a um conjunto. Na Etapa dois do procedimento acima, voc deve compilar mdulos com referncias a outros mdulos. Essa etapa usa a /addmodule opo de compilador. No exemplo a seguir, um mdulo de cdigo chamado Client tem um mtodo ponto Main de entrada que referencia um mtodo no mdulo Stringer.dll criado na etapa 1. O exemplo a seguir mostra o cdigo para Client. C#
using System; using myStringer; //The namespace created in Stringer.netmodule. class MainClientApp { // Static method Main is the entry point method. public static void Main() { Stringer myStringInstance = new Stringer(); Console.WriteLine("Client code executes"); //myStringComp.Stringer(); myStringInstance.StringerMethod(); } }

Use o seguinte comando para compilar este cdigo: C#


csc /addmodule:Stringer.netmodule /t:module Client.cs

Especificar a /t:module opo porque este mdulo ir ser adicionado a uma montagem em uma etapa futura. Especificar a /addmodule opo porque o cdigo em Client Referncias criado pelo cdigo em Stringer.netmodule um espao para nome. O compilador produz um mdulo chamado Client.netmodule que contm uma referncia a outro mdulo, Stringer.netmodule. Observao O C# e Visual Basic compiladores suportam diretamente criao usando as seguintes sintaxes diferentes dois conjuntos de vrios arquivos.

Dois compilations criar um conjunto-dois arquivos: C#


csc /t:module Stringer.cs csc Client.cs /addmodule:Stringer.netmodule

Uma compilao cria um conjunto-dois arquivos: C#


csc /out:Client.exe Client.cs /out:Stringer.netmodule Stringer.cs

Do Vinculador do conjunto (AL.exe) voc pode usar para criar um conjunto de uma coleo de compilado mdulos de cdigo.

Para criar um conjunto de vrios arquivos usando o vinculador assembly

No prompt de comando, digite o seguinte comando: al <module name> <module name> /main:<method name> /out:<file name> /target:<assembly file type>

Visual C# Consolidado

766

Os module name argumentos neste comando, especifique o nome de cada mdulo para incluir no conjunto. A /main: opo especifica o nome do mtodo que ponto de entrada do conjunto. A /out: opo especifica o nome do arquivo de sada, que contm metadados do conjunto. A /target: opo especifica que o conjunto um arquivo executvel (.exe) do aplicativo Console, um arquivo executvel (.Win) do Windows, ou um arquivo biblioteca (.lib). No exemplo a seguir, a Al.exe cria um conjunto que um aplicativo de console executvel chamado myAssembly.exe. O aplicativo consiste de dois mdulos chamados Client.netmodule e Stringer.netmodule. e o arquivo executvel chamado myAssembly.exe, que contm somente metadados conjunto O ponto de entrada do conjunto o Main mtodo na classe MainClientApp, que est localizado em Client.dll.
al Client.netmodule Stringer.netmodule /main:MainClientApp.Main /out:myAssembly.exe /target:exe

Do Disassembler MSIL (Ildasm.exe) voc pode usar para examinar o contedo de um conjunto ou determinar se um arquivo um conjunto ou um mdulo.

Como Carregar Assemblies em um Domnio de Aplicativo


No.NET Framework, existem vrias maneiras para carregar um conjunto em um domnio de aplicativo. Cada forma usa uma classe diferente. Voc pode usar os seguintes mtodos sobrecarregados para carregar um conjunto em um domnio de aplicativo:

A System.AppDomain classe contm vrios mtodos sobrecarregados Carga. Esses mtodos principalmente so usados para interoperabilidade com, embora eles podem ser usados para carregar qualquer conjunto na atual ou um novo domnio do aplicativo com xito. Tambm possvel carregar um conjunto usando os CreateInstance mtodos. A System.Reflection.Assembly classe contm dois mtodos sobrecarregados estticos, Carga e LoadFrom. Os dois mtodos variar pelo contexto de carga.

O exemplo seguinte carrega um conjunto no domnio de aplicativo atual e executa o conjunto. Para uma discusso completa sobre como obter informaes de um conjunto carregado, consulte Carregar dinamicamente e Usando tipos. Observao Na verso do .NET Framework 2.0 domnios do aplicativo possuem um contexto somente Reflection-. Conjuntos carregados neste contexto podem ser examinados mas no executado, permitindo exame de conjuntos que destino outras plataformas. Consulte Como Carregar Assemblies no Contexto Somente de Reflexo e ReflectionOnlyLoad. Exemplo C#
using System; using System.Reflection; public class Asmload0 { public static void Main () { // Use the file name to load the assembly into the current application domain. Assembly a = Assembly.LoadFrom("adname.exe"); //Get the type to use. Type myType = a.GetType("adname"); //Get the method to call. MethodInfo mymethod = myType.GetMethod("adnamemethod"); //Create an instance. Object obj = Activator.CreateInstance(myType); //Execute the adnamemethod method. mymethod.Invoke(obj,null); } }

Visual C# Consolidado

767

COMO: Assinar uma Assembly com Nome Forte


H duas maneiras para assinar um conjunto com um nome de alta segurana:

Do Vinculador do conjunto (AL.exe) Usando fornecido pelo .NET Framework SDK. Usando atributos do conjunto para inserir as informaes de nome de alta segurana em seu cdigo. Voc pode usar ou AssemblyKeyFileAttribute a AssemblyKeyNameAttribute, dependendo da onde o arquivo de chave a ser usado est localizado.

Voc deve ter um par de chaves de criptografia para assinar um conjunto com um nome de alta segurana. Para obter mais informaes sobre como criar um par de chaves, consulte Como criar um par de chaves pblica / Private:. Para criar e assinar um conjunto com um nome de alta segurana usando o vinculador assembly

No prompt de comando, digite o seguinte comando: al /out:<assembly name> <module name> /keyfile:<file name> Neste comando, assembly name o nome da montagem para entrar com um nome de alta segurana, module name o nome do mdulo do cdigo usado para criar o conjunto, e file name o nome do recipiente ou arquivo que contm o par de chaves.

O exemplo a seguir assina o conjunto MyAssembly.dll com um nome de alta segurana usando o arquivo sgKey.snk de chave.
al /out:MyAssembly.dll MyModule.netmodule /keyfile:sgKey.snk

Para assinar um conjunto com um nome de alta segurana com atributos

Entre um mdulo de cdigo, adicione o AssemblyKeyFileAttribute ou o AssemblyKeyNameAttribute, especificando o nome do arquivo ou recipiente que contm o par de chaves para usar ao assinar o conjunto com um nome de alta segurana.

Do AssemblyKeyFileAttribute exemplo usa o seguinte cdigo com um arquivo de chave chamado sgKey.snk, localizado na pasta onde o conjunto compilado. Isso pressupe que o conjunto compilado usando o vbc.exe Compiladores de linha de comando e csc.exe. C#
[assembly:AssemblyKeyFileAttribute(@"sgKey.snk")]

Observao Em ambientes de desenvolvimento, como Visual Studio, o conjunto no pode ser compilado no diretrio do projeto. Por exemplo, algumas verses do Visual Studio Compilar projetos C# em um bin\Debug subdiretrio. Nesse caso, o caminho no exemplo de cdigo seria ".. \\ \\sgKey.snk ". No Visual Studio 2005 arquivo de chave no C# pode ser especificado nas configuraes do projeto. Voc tambm pode atrasar assinar um conjunto durante a compilao. Para obter mais informaes, consulte Atraso assinatura um conjunto. Ao assinar um conjunto com um nome de alta segurana, a Vinculador do conjunto (AL.exe) Aparncia da chave arquivos relativo para a pasta atual e para o diretrio de sada. Ao usar linha comando compiladores, basta copiar a chave para a pasta atual que contm seus mdulos de cdigo.

Visual C# Consolidado

768

Como Visualizar o Contedo da Cache Global de Assemblies


Do Ferramenta Assembly Cache global (Gacutil.exe) uso para exibir o contedo do cache de montagem global. Para exibir uma lista das montagens no cache de conjunto global

No prompt de comando, digite o seguinte comando: l Gacutil

O SDK do .NET Framework tambm fornece uma extenso Shell do Windows chamado que voc pode usar para exibir o contedo do cache de conjunto global. o Visualizador cache do conjunto (Shfusion.dll),

Como Criar um par de chaves Public/Private


Para assinar um conjunto com um nome de alta segurana, voc deve ter um par de chaves pblica / particular Criptografia esse par de chaves pblica e privada usado durante a compilao para criar um conjunto de nome seguro. Voc pode criar um par de chaves usando o Ferramenta nome forte (SN.exe). Par de Chaves arquivos geralmente tm uma extenso.snk. Para criar um par de chaves

No prompt de comando, digite o seguinte comando: sn k <file name> Neste comando, file name o nome do arquivo de sada que contm o par de chaves.

O exemplo a seguir cria um par de chaves denominado sgKey.snk.


sn -k sgKey.snk

Se voc pretende atrasar a assinatura um conjunto e voc controlar o par de chaves toda (que improvvel fora cenrios de teste), voc pode usar o seguinte comandos para gerar um par de chaves e ento extrair a chave pblica em um arquivo separado. Primeiro, crie o par de chaves:
sn -k keypair.snk

Em seguida, extrair a chave pblica do par de chaves e copi-la para um arquivo separado:

sn -p keypair.snk public.snk

Assim que voc criar o par de chaves, voc deve colocar o arquivo em que ele pode localizar o nome de alta segurana assinatura ferramentas.

Ao assinar um conjunto com um nome de alta segurana, a Vinculador do conjunto (AL.exe) Aparncia da chave arquivos relativo para a pasta atual e para o diretrio de sada. Ao usar linha comando compiladores, basta copiar a chave para a pasta atual que contm seus mdulos de cdigo. Se voc estiver usando um IDE, tais como Visual Studio 2005, para assinar um conjunto com um nome de alta segurana, necessrio compreender onde o IDE procura o arquivo de chave. Por exemplo, Visual Basic 2005 procura pelo arquivo de chave no diretrio que contm a Soluo Visual Studio, enquanto o compilador C# procura o arquivo de chave no diretrio que contm o binrio. Coloque o arquivo de chave no diretrio do projeto adequado e defina o atributo de arquivo da seguinte maneira:

Visual C# Consolidado

769

C#
[assembly: AssemblyKeyFileAttribute(@"..\..\key.snk")]

Como Incorporar Bibliotecas de Tipo como Recursos Win32 em Aplicativos Baseados no .NET
Voc pode compactar uma biblioteca de tipos como um arquivo separado ou incorpor-lo como arquivo recurso Win32 dentro de um aplicativo baseado em .NET. O Microsoft Visual Basic 6.0 executado essa tarefa para voc automaticamente; no entanto, ao usar Microsoft Visual Basic 2005, voc deve incorporar sua biblioteca tipo manualmente. Para incorporar uma biblioteca de tipos como um recurso do Win32 em um aplicativo baseado em .NET 1. Compilar o aplicativo gerenciado como um arquivo de biblioteca. Por exemplo, para criar um conjunto para um aplicativo chamado MyApp, digite o seguinte comando no prompt de comando: C#
csc /t:library MyApp.cs

2.

Exportar um arquivo biblioteca tipo do seu conjunto usando o Tipo Exporter da biblioteca (TlbExp.exe). No prompt de comando, digite o seguinte comando:
tlbexp MyApp.dll /out:mytypelib.tlb

3.

Criar um script de recursos que contenha a instruo a seguir:


IDR_TYPELIB1 typelib "mytypelib.tlb"

Para este exemplo, o nome de arquivo script myresource.rc. 4. Compilar o script usando o Microsoft Windows Resource compiler (Rc.exe). No prompt de comando, digite o seguinte comando:
rc myresource.rc

Rc.exe produz ao myresource.res arquivo de recurso. 5. Compile o arquivo de origem novamente e especifique o arquivo de recurso. No prompt de comando, digite o seguinte comando: Visual Basic
vbc /t:library MyApp.vb /win32res:myresource.res

C#
csc /t:library MyApp.cs /win32res:myresource.res

Como Gerar Assemblies de Interoperabilidade Primrios Usando Tlbimp.exe


A maneira mais simples para produzir conjuntos de interoperabilidade primrias consiste em usar o Importador de Biblioteca de Tipos (TLBIMP.exe). Para gerar um conjunto de interoperabilidade primrio usando TLBIMP.exe

No prompt de comando, digite: tlbimp tlbfile /primary /keyfile:filename /out:assemblyname

Visual C# Consolidado

770

Neste comando, tlbfile o arquivo que contm a biblioteca de tipos COM, filename o nome do recipiente ou arquivo que contm o par de chaves e assemblyname o nome da montagem para entrar com um nome de alta segurana. Conjuntos de interoperabilidade primrias podem referenciar apenas outros conjuntos de interoperabilidade primrias. Se seu conjunto faz referncia tipos de uma biblioteca de tipos com de terceiros, voc dever obter um conjunto interoperacional primrio do editor antes voc pode gerar seu conjunto interoperacional primrio. Se voc for o editor, voc deve gerar um conjunto de interoperabilidade primrio para a biblioteca de tipos dependente antes de gerar conjunto de mdulos (assembly referncia o) de interoperabilidade primria. Primrio um conjunto interoperacional dependente com um nmero de verso que seja diferente da biblioteca de tipos original no localizvel quando instalado no diretrio atual. Voc deve registrar Principal conjunto interoperacional do dependente no Registro do Windows ou use a /reference Opo para ter certeza que localiza TLBIMP.exe a DLL dependente. Voc tambm poder dispor vrias verses de uma biblioteca de tipos. Para obter instrues, consulte Como Empacotar Vrias Verses de Bibliotecas de Tipos. Exemplo O exemplo a seguir importa a biblioteca LibUtil.tlb de tipos COM e assina o conjunto LibUtil.dll com um nome de alta segurana usando o arquivo CompanyA.snk de chave. Omitindo um nome de espao para nome especfico, este exemplo produz o espao para nome LibUtil padro.
tlbimp LibUtil.tlb /primary /keyfile:CompanyA.snk /out:LibUtil.dll

Para um nome mais descritivo). (usando, o exemplo a seguir substitui o nome de arquivo do conjunto padro e nome namespace nomeao diretriz. LibraryName o VendorName
tlbimp LibUtil.tlb /primary /keyfile:CompanyA.snk /namespace:CompanyA.LibUtil /out:CompanyA.LibUtil.dll

O exemplo a seguir importa MyLib.tlb, quais referncias CompanyA.LibUtil.dll, e assina o conjunto CompanyB.MyLib.dll com um nome de alta segurana usando o arquivo CompanyB.snk de chave. Espao para nome, CompanyB.MyLib,. substitui o nome de espao para nome padro
tlbimp MyLib.tlb /primary /keyfile:CompanyB.snk /namespace:CompanyB.MyLib /reference:CompanyA.LibUtil.dll /out:CompanyB.MyLib.dll

Como Criar Assemblies de Interoperabilidade Primrios Manualmente


Uma abordagem menos usada para produzir uma biblioteca de tipos envolve criar um conjunto de interoperabilidade primrio manualmente no cdigo fonte, usando uma linguagem que compatvel com o COM comum especificao (cls), como C# idioma. Essa abordagem til quando uma biblioteca de tipos no est disponvel. Para gerar um conjunto interoperacional primrio no cdigo fonte 1. Crie um conjunto de interoperabilidade no cdigo fonte. Para obter instrues, consulte Criando um wrapper manualmente. Observao Se voc deve incluir todos os tipos COM da biblioteca Tipo original quando voc cria um conjunto de interoperabilidade primrio manualmente. No nvel do conjunto, aplicar os seguintes atributos:

2.

Visual C# Consolidado

771

1.

ou AssemblyKeyFileAttributeAssemblyKeyNameAttribute, para especificar o nome do arquivo ou recipiente que contm o par de chaves para usar ao assinar o conjunto com um nome de alta segurana. GuidAttribute Para especificar o identificador de biblioteca (LIBID) da biblioteca de tipos de destino. PrimaryInteropAssemblyAttribute Para identificar o conjunto como um conjunto interoperacional primrio. Observao Voc tambm pode atrasar assinar um conjunto durante a compilao. Para obter mais informaes, consulte Atraso assinatura um conjunto.

2. 3.

3.

O exemplo de cdigo a seguir aplica chamado CompanyA.snk com um arquivo de chave e especifica que este conjunto de mdulos (assembly) um conjunto de interoperabilidade primrio suporte verses de biblioteca tipo 4.2 e 5.2. o AssemblyKeyFileAttribute Como mostra o exemplo, voc pode dispor mais de uma verso de uma biblioteca tipo Aplicando atributos adicionais conjunto-nvel.

C#
[assembly:AssemblyKeyFile(@"..\..\CompanyA.snk")] [assembly:Guid("97d25db0-0363-1cf-abc4-02608 c9e7553"] [assembly:PrimaryInteropAssembly(4, 2)] [assembly:PrimaryInteropAssembly(5, 2)]

Como Gerar Assemblies de Interoperabilidade a partir de Bibliotecas de Tipo


O Importador da biblioteca Tipo (TLBIMP.exe) uma ferramenta de linha de comando que converte o coclasses e interfaces contidos em uma biblioteca de tipos com aos metadados. Essa ferramenta cria um conjunto interoperacional e espao para nome para as informaes tipo automaticamente. Depois os metadados de uma classe estiver disponvel, clientes gerenciados podem criar instncias do tipo COM e chamar seus mtodos, apenas como se fosse uma instncia .NET. TLBIMP.exe converte uma biblioteca inteira tipo aos metadados de uma vez e no pode gerar informaes sobre tipo de um subconjunto dos tipos definidas em uma biblioteca de tipos. Para gerar um conjunto de interoperabilidade de uma biblioteca de tipos

Use o seguinte comando: TLBIMP < type-library-file> Adicionando a /out: opo produz um conjunto de interoperabilidade com um nome alterada, como LOANLib.dll. Alterar o nome Conjunto interoperacional pode ajudar a distingui-lo da DLL com original e evitar problemas que podem ocorrer tenham nomes duplicados.

Exemplo O seguinte comando produz o conjunto Loanlib.DLL no espao para nome Loanlib.
tlbimp Loanlib.dll

O seguinte comando produz um conjunto de interoperabilidade com um nome alterada (LOANLib.dll).


tlbimp LoanLib.dll /out: LOANLib.dll

Visual C# Consolidado

772

Como Gerar Eventos Manipulados por um Coletor COM


Se voc estiver familiarizado com o modelo baseado em delegate-evento fornecido pelo .NET Framework, no Consulte Manipulando e disparando eventos. Para obter detalhes especficos que se aplicam a este tpico, consulte Disparar um evento na mesma seo. O.NET Framework fornece um sistema baseado em delegate-evento para conectar-se um remetente de evento (origem) a um destinatrio de evento (PIA). Quando o coletor um cliente COM, a origem deve incluir elementos para simular pontos de conexo adicionais. Com essas modificaes, um cliente COM pode registrar sua interface do coletor de eventos no modo tradicional chamando o IConnectionPoint::Advise mtodo. (Visual Basic oculta detalhes ponto de conexo, para que no faa precise chamar esses mtodos diretamente.) Para interoperar com um coletor de eventos com 1. Definir a interface do coletor de eventos no cdigo gerenciado. Esta interface pode conter um subconjunto dos eventos sourced por uma classe gerenciado. Os nomes mtodo da interface deve ser a mesma os nomes de eventos. Do ComSourceInterfacesAttribute aplicar se conectar a interface do coletor de eventos a classe gerenciada. Exportar o conjunto que contm a classe para uma biblioteca de tipos. Use API equivalente ou Tipo Exporter da biblioteca (TlbExp.exe) um para exportar o conjunto. Implementar a interface do coletor de eventos em COM. Para clientes com que coletar eventos, implementar a interface do coletor de eventos definido pela fonte de eventos na sua biblioteca de tipos. Usar o mecanismo ponto de conexo para conectar-se a interface do coletor fonte de eventos.

2. 3. 4. 5.

Exemplo O exemplo a seguir mostra um servidor gerenciado como a origem de eventos e um cliente COM como o coletor de eventos. O servidor gerenciado declara ButtonEvents como uma interface do coletor de eventos e se conecta a interface a Button classe. O cliente no gerenciado cria uma instncia da classe Button e implementa a interface do coletor de eventos. Visual Basic
' Managed server (event source) Option Explicit Option Strict Imports System Imports System.Runtime.InteropServices Namespace EventSource Public Delegate Sub ClickDelegate(x As Integer, y As Integer) Public Delegate Sub ResizeDelegate() Public Delegate Sub PulseDelegate() ' Step 1: Defines an event sink interface (ButtonEvents) to be ' implemented by the COM sink. <GuidAttribute("1A585C4D-337148dc-AF8A-AFFECC1B0967"), _ InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)> _ Public Interface ButtonEvents Sub Click(x As Integer, y As Integer) Sub Resize() Sub Pulse() End Interface ' Step 2: Connects the event sink interface to a class ' by passing the namespace and event sink interface ' ("EventSource.ButtonEvents, EventSrc"). <ComSourceInterfaces(GetType(ButtonEvents))> _ Public Class Button Public Event Click As ClickDelegate Public Event Resize As ResizeDelegate Public Event Pulse As PulseDelegate Public Sub CauseClickEvent(x As Integer, y As Integer) RaiseEvent Click(x, y) End Sub Public Sub CauseResizeEvent() RaiseEvent Resize() End Sub Public Sub CausePulse() RaiseEvent Pulse() End Sub End Class End Namespace using System; using System.Runtime.InteropServices; namespace EventSource { public delegate void ClickDelegate(int x, int y); public delegate void ResizeDelegate(); public delegate void PulseDelegate(); // Step 1: Defines an event sink interface (ButtonEvents) to be // implemented by the COM sink. [GuidAttribute("1A585C4D-3371-48dc-AF8A-AFFECC1B0967") ]

Visual C# Consolidado

773

[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)] public interface ButtonEvents { void Click(int x, int y); void Resize(); void Pulse(); } // Step 2: Connects the event sink interface to a class // by passing the namespace and event sink interface // ("EventSource.ButtonEvents, EventSrc"). [ComSourceInterfaces(GetType(ButtonEvents))] public class Button { public event ClickDelegate Click; public event ResizeDelegate Resize; public event PulseDelegate Pulse; public Button() { } public void CauseClickEvent(int x, int y) { Click(x, y); } public void CauseResizeEvent() { Resize(); } public void CausePulse() { Pulse(); } } } ' COM client (event sink) ' This Visual Basic 6.0 client creates an instance of the Button class and ' implements the event sink interface. The WithEvents directive ' registers the sink interface pointer with the source. Public WithEvents myButton As Button Private Sub Class_Initialize() Dim o As Object Set o = New Button Set myButton = o End Sub ' Events and methods are matched by name and signature. Private Sub myButton_Click(ByVal x As Long, ByVal y As Long) MsgBox "Click event" End Sub Private Sub myButton_Resize() MsgBox "Resize event" End Sub Private Sub myButton_Pulse() End Sub

Como Personalizar Wrappers Invocveis em Tempo de Execuo


H duas maneiras para personalizar um wrapper Callable Runtime (RCW). Se voc pode modificar a fonte interface Definition Language (IDL), voc pode aplicar atributos de arquivo (tlb) de biblioteca Tipo e importar a biblioteca de tipos Como alternativa, voc pode aplicar atributos especficos interop-a tipos importados e gerar um novo conjunto. Suporte para personalizar RCWs padro limitado por esses atributos. Para modificar a fonte IDL 1. Se aplicam atributos TLB a bibliotecas, tipos, membros, e parmetros. Use a custom palavra-chave e um valor de atributo para alterar metadados. Aplicando atributos TLB, voc pode: Especifique o nome de um tipo COM importados, em vez de permitir que o Utilitrio de Importao para selecionar o nome de acordo com regras converso padro gerenciado. Definir um espao para nome de destino para os tipos em uma biblioteca com explicitamente. Compilar o cdigo fonte IDL. Gerar um conjunto do arquivo resultante de biblioteca tipo ou de um arquivo de biblioteca de vnculo dinmico (DLL) que contm o tipo que pretende implementar. Importe o arquivo de biblioteca tipo. Do Importador da biblioteca Tipo (TLBIMP.exe) uso para gerar um conjunto DLL. Criar um arquivo de texto do conjunto importado usando o Disassembler MSIL (Ildasm.exe). Aplicar Atributos de interoperabilidade ao arquivo de texto. Gerar um novo conjunto do arquivo de texto modificada usando o Assembler MSIL (Ilasm.exe).

o o

2. 3.

Para modificar um conjunto importados 1. 2. 3. 4.

Como Configurar Componentes Baseado em .NET para Habilitar Livre Registro


Ativao livre registro-para componentes baseado em .NET apenas um pouco mais complicado que ele para componentes COM. A instalao requer dois manifestos:

Aplicativos COM devem ter um manifesto de aplicativo estilo Win32-para identificar o componente gerenciado.

Visual C# Consolidado

774

Componentes baseado em .NET devem ter um manifesto componente para ativao informaes necessrias em tempo de execuo.

Este tpico descreve como associar um manifesto de aplicativo a um aplicativo; associar um manifesto componente a um componente; e incorporar um manifesto componente em um conjunto. Para criar um manifesto de aplicativo 1. 2. Usando um editor XML, criar (ou modificar) manifesto de aplicativo pertencentes ao aplicativo do COM que interoperar com um ou mais componentes gerenciados. Insira o cabealho padro a seguir no incio do arquivo:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemasmicrosoft-com:asm.v1" manifestVersion="1.0">

Para informaes sobre elementos manifesto e seus atributos, procure por " Reference Manifests Application " na Biblioteca do MSDN. 3. Identificar o proprietrio do manifesto. No exemplo a seguir, myComApp Verso 1 possui o arquivo de manifesto.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemasmicrosoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type="win32" name="myOrganization.myDivision.myComApp" version="1.0.0.0" processorArchitecture="x86" />

4.

Identificar conjuntos de mdulos (assemblies) dependentes. No exemplo a seguir,


myComApp depende da myManagedComp. <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemasmicrosoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type="win32" name="myOrganization.myDivision.myComApp" version="1.0.0.0" processorArchitecture="x86" publicKeyToken="8275b28176rcbbef" /> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="myOrganization.myDivision.myManagedComp" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="8275b28176rcbbef" language="*" /> </dependentAssembly> </dependency> </assembly>

5.

Salvar e nomear o arquivo de manifesto. O nome de um manifesto de aplicativo o nome do conjunto executvel seguido pela extenso.manifest. Por exemplo, o nome arquivo manifesto do aplicativo para myComApp.exe myComApp.exe.manifest

Voc pode instalar um manifesto de aplicativo no mesmo diretrio como o aplicativo COM. Como alternativa, voc pode adicion-lo como um recurso para arquivo.exe do aplicativo. Para obter mais informaes, procure por " conjuntos lado a lado na Biblioteca do MSDN ".

Para criar um manifesto componente


1. 2. Usando um editor XML, criar um manifesto componente para descrever o conjunto gerenciado. Insira o cabealho padro a seguir no incio do arquivo:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemasmicrosoft-com:asm.v1" manifestVersion="1.0">

3.

Identificar o proprietrio do arquivo. O <assemblyIdentity> elemento do elemento <dependentAssembly> no arquivo de manifesto de aplicativo deve corresponder ao nome

Visual C# Consolidado

775

no manifesto do componente. No exemplo a seguir, myManagedComp Verso 1.2.3.4 possui o arquivo de manifesto.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemasmicrosoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity name="myOrganization.myDivision.myManagedComp" version="1.2.3.4" /> publicKeyToken="8275b28176rcbbef"

4.

Identificar cada classe no conjunto. Use o <clrClass> elemento para identificar exclusivamente cada classe no conjunto de mdulos (assembly) gerenciado. O elemento, que um subelemento do elemento <assembly> tem dos atributos descritos na tabela a seguir. Atributo Clsid description name ProgID Descrio O identificador que especifica a classe para ser ativado. Seqncia que informe ao usurio sobre o componente. Uma seqncia vazia o padro. Uma seqncia de caracteres que representa a classe gerenciada. O identificador a ser usado para ativao vinculados as. Required Sim No Sim No No

threadingModel O modelo de segmentao com. "Both" o valor padro.

runtimeVersion Este atributo ignorado. Se o Runtime no est carregado, a verso No mais recente ser carregada antes da classe ativado. Caso contrrio, a verso atualmente carregado usada. tlbid 5. O identificador da biblioteca de tipos que contm informaes sobre a classe tipo. No

Todas as marcas de atributo diferenciam maisculas de minsculas. Voc pode obter CLSIDs, ProgIDs, segmentao modelos, e a verso de tempo de execuo, exibindo a biblioteca de tipos exportada para o conjunto com o ObjectViewer OLE / com (Oleview.exe). O manifesto componente a seguir identifica uma classe nica com dois mtodos.

6.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoftcom:asm.v1" manifestVersion="1.0"> <assemblyIdentity name="myOrganization.myDivision.myManagedComp" version="1.2.3.4" /> publicKeyToken="8275b28176rcbbef" <clrClass clsid="{65722BE6-3449-4628-ABD3-74B6864F9739}" progid="myManagedComp.testClass1" threadingModel="Both" name="myManagedComp.testClass1" runtimeVersion="v1.0.3705"> </clrClass> <clrClass clsid="{367221D6-3559-3328-ABD345B6825F9732}" progid="myManagedComp.testClass2" threadingModel="Both" name="myManagedComp.testClass2" runtimeVersion="v1.0.3705"> </clrClass> <file name="MyManagedComp.dll"> </file> </assembly>

7.

Salvar e nomear o arquivo de manifesto. O nome do componente um manifesto o nome da biblioteca do conjunto seguida pela extenso.manifest. Por exemplo, o myManagedComp.dll myManagedComp.manifest.

Voc deve incorporar o manifesto componente como um recurso no conjunto.

Para incorporar um manifesto componente em um conjunto gerenciado


1. Criar um script de recursos que contenha a instruo a seguir:
RT_MANIFEST 1 myManagedComp.manifest

Visual C# Consolidado

776

Nesta instruo myManagedComp.manifest o nome do manifesto componente sendo incorporado. Para este exemplo, o nome de arquivo script myresource.rc. 2. Compilar o script usando o Microsoft Windows Resource compiler (Rc.exe). No prompt de comando, digite o seguinte comando:
rc myresource.rc

Rc.exe produz ao myresource.res arquivo de recurso. 3. Compilar arquivo de origem do conjunto novamente e especifique o arquivo de recurso usando a /win32res opo:
/win32res:myresource.res

Novamente, myresource.res o nome do arquivo de recurso contendo recurso incorporado.

Como Implementar Funes CallBack


O procedimento e exemplo a seguir demonstram como um aplicativo gerenciado, usando plataforma chamar, pode imprimir o valor o identificador de cada janela para o computador local. Especificamente, o procedimento e exemplo use a EnumWindows funo a que o guiar pela lista de janelas e uma funo de retorno de chamada gerenciado (denominada CallBack) para imprimir o valor do identificador de janela. Para implementar uma funo de retorno de chamada 1. Examine a assinatura para a EnumWindows funo antes passar mais com a implementao. Possui EnumWindows a assinatura a seguir:
BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)

Uma pista que essa funo requer um retorno de chamada a presena do argumento lpEnumFunc. comum para ver o lp prefixo (ponteiro longo) combinado com o Func sufixo do nome do argumentos que se um ponteiro para uma funo de retorno de chamada. Para obter documentao sobre funes Win32, consulte Microsoft Platform SDK. 2. Crie a funo de retorno de chamada gerenciado. O exemplo declara um tipo delegate, que utiliza dois argumentos chamado CallBack, (hwnd e lparam.) O primeiro argumento um identificador para a janela; o segundo argumento definido pelo aplicativo. Nesta verso, ambos os argumentos devem ser inteiros. Funes de retorno de chamada geralmente retornam valores diferentes de zero para indicar xito e zero para indicar falha. Este exemplo explicitamente define o valor de retorno para true para continuar a enumerao. 3. Criar um representante e transfira-como um argumento para a EnumWindows funo. Chamar plataforma converte o representante em um formato de retorno de chamada familiarizado automaticamente. Verifique o coletor de lixo que no no recuperou o representante antes a funo de retorno de chamada conclua seu trabalho. Quando voc passar um representante como um parmetro, ou passar um representante contido como um campo em uma estrutura, ela permanece uncollected para a durao da chamada. Portanto, como o caso no seguinte exemplo de enumerao, a funo de retorno de chamada completa seu trabalho antes da chamada retorna e no requer nenhuma ao adicional pelo chamador gerenciado. Se, no entanto, a funo de retorno de chamada pode ser chamada depois retorna a chamada, o chamador gerenciado dever executar etapas para garantir que o representante permanece uncollected at terminar a funo de retorno de chamada. Para obter informaes detalhadas sobre como evitar coleta de lixo, consulte Interoperabilidade Marshaling COM Invoke Platform. Exemplo

4.

Visual C# Consolidado

777

C#
using System; using System.Runtime.InteropServices; public delegate bool CallBack(int hwnd, int lParam); public class EnumReportApp { [DllImport("user32")] public static extern int EnumWindows(CallBack x, int y); public static void Main() { CallBack myCallBack = new CallBack(EnumReportApp.Report); EnumWindows(myCallBack, 0); } public static bool Report(int hwnd, int lParam) { Console.Write("Window handle is "); Console.WriteLine(hwnd); return true; } }

Como: Mapear HRESULTs e excees


Mtodos com Relatar Erros, retornando HRESULTs; Mtodos .NET relat-los por organizando excees. Tempo de Execuo trata a transio entre os dois. Cada classe de exceo no .NET Framework mapeia para um HRESULT. Classes de exceo definida pelo usurio podem especificar qualquer HRESULT apropriado. Essas classes de exceo dinamicamente podem alterar o HRESULT a ser retornado quando a exceo gerada, definindo o HResult campo no objeto de exceo. Informaes adicionais sobre a exceo fornecidas para o cliente por meio da IErrorInfo interface, que implementado no objeto .NET durante o processo no gerenciado. Se voc criar uma classe que estende System.Exception, deve definir o campo HRESULT durante construo. Caso contrrio, a classe base atribui o valor HRESULT. Voc pode mapear novas classes de exceo para um HRESULT existente, fornecendo o valor no construtor a exceo . Observe que o Runtime s vezes ignorar uma HRESULT casos em onde h um IErrorInfo presente no segmento. Este comportamento pode ocorrer em casos onde. e HRESULT o IErrorInfo no representam o mesmo erro Para criar uma nova classe de exceo e mape-lo para um HRESULT

Use o seguinte cdigo para criar uma nova classe de exceo chamado NoAccessException e mape-lo para o HRESULT E_ACCESSDENIED. C++
Class NoAccessException : public ApplicationException { NoAccessException () { HResult = E_ACCESSDENIED; } } CMyClass::MethodThatThrows { throw new NoAccessException(); }

Voc pode encontrar um programa (em qualquer linguagem de programao) que usa um cdigo tanto gerenciados e no gerenciados ao mesmo tempo. Por exemplo, o empacotador personalizado no exemplo de cdigo a seguir usa o Marshal.ThrowExceptionForHR(int HResult) mtodo para acionar uma exceo com um valor HRESULT especfico. O mtodo procura o HRESULT e gera o tipo de exceo apropriado. Por exemplo, o HRESULT no fragmento de cdigo a seguir gera ArgumentException. C++
CMyClass::MethodThatThrows { Marshal.ThrowExceptionForHR(COR_E_ARGUMENT); }

A tabela a seguir fornece o mapeamento completo de cada HRESULT sua classe de exceo comparvel no .NET Framework. HRESULT Exceo .NET

Visual C# Consolidado

778

MSEE_E_APPDOMAINUNLOADED COR_E_APPLICATION COR_E_ARGUMENT ou E_INVALIDARG COR_E_ARGUMENTOUTOFRANGE COR_E_ARITHMETIC ou ERROR_ARITHMETIC_OVERFLOW COR_E_ARRAYTYPEMISMATCH COR_E_BADIMAGEFORMAT ou ERROR_BAD_FORMAT COR_E_COMEMULATE_ERROR COR_E_CONTEXTMARSHAL COR_E_CORE NTE_FAIL COR_E_DIRECTORYNOTFOUND ou ERROR_PATH_NOT_FOUND COR_E_DIVIDEBYZERO COR_E_DUPLICATEWAITOBJECT COR_E_ENDOFSTREAM COR_E_TYPELOAD COR_E_EXCEPTION COR_E_EXECUTIONENGINE COR_E_FIELDACCESS COR_E_FILENOTFOUND ou ERROR_FILE_NOT_FOUND COR_E_FORMAT COR_E_INDEXOUTOFRANGE COR_E_INVALIDCAST ou E_NOINTERFACE COR_E_INVALIDCOMOBJECT COR_E_INVALIDFILTERCRITERIA COR_E_INVALIDOLEVARIANTTYPE COR_E_INVALIDOPERATION COR_E_IO COR_E_MEMBERACCESS COR_E_METHODACCESS COR_E_MISSINGFIELD COR_E_MISSINGMANIFESTRESOURCE COR_E_MISSINGMEMBER

AppDomainUnloadedException ApplicationException ArgumentException ArgumentOutOfRangeException ArithmeticException ArrayTypeMismatchException BadImageFormatException COMEmulateException ContextMarshalException CoreException CryptographicException DirectoryNotFoundException DivideByZeroException DuplicateWaitObjectException EndOfStreamException EntryPointNotFoundException Exceo ExecutionEngineException FieldAccessException FileNotFoundException FormatException IndexOutOfRangeException InvalidCastException InvalidComObjectException InvalidFilterCriteriaException InvalidOleVariantTypeException InvalidOperationException IOException AccessException MethodAccessException MissingFieldException MissingManifestResourceException MissingMemberException

Visual C# Consolidado

779

COR_E_MISSINGMETHOD COR_E_MULTICASTNOTSUPPORTED COR_E_NOTFINITENUMBER E_NOTIMPL COR_E_NOTSUPPORTED OrE_POINTER COR_E_NULLREFERENCE COR_E_OUTOFMEMORY ou E_OUTOFMEMORY COR_E_OVERFLOW COR_E_PATHTOOLONG ou ERROR_FILENAME_EXCED_RANGE COR_E_RANK COR_E_REFLECTIONTYPELOAD COR_E_REMOTING COR_E_SAFEARRAYTYPEMISMATCH COR_E_SECURITY COR_E_SERIALIZATION OrERROR_STACK_OVERFLOW COR_E_STACKOVERFLOW COR_E_SYNCHRONIZATIONLOCK COR_E_SYSTEM COR_E_TARGET COR_E_TARGETINVOCATION COR_E_TARGETPARAMCOUNT COR_E_THREADABORTED COR_E_THREADINTERRUPTED COR_E_THREADSTATE COR_E_THREADSTOP COR_E_TYPELOAD COR_E_TYPEINITIALIZATION COR_E_VERIFICATION COR_E_WEAKREFERENCE COR_E_VTABLECALLSNOTSUPPORTED Todos os outros HRESULTs

MissingMethodException MulticastNotSupportedException NotFiniteNumberException NotImplementedException NotSupportedException NullReferenceException OutOfMemoryException OverflowException PathTooLongException RankException ReflectionTypeLoadException RemotingException SafeArrayTypeMismatchException SecurityException SerializationException StackOverflowException SynchronizationLockException SystemException TargetException TargetInvocationException TargetParameterCountException ThreadAbortException ThreadInterruptedException ThreadStateException ThreadStopException TypeLoadException TypeInitializationException VerificationException WeakReferenceException VTableCallsNotSupportedException COMException

Para recuperar informaes de erro estendidas, o cliente gerenciado deve examinar os campos do objeto de exceo que foi gerado. Para o objeto de exceo para fornecer informaes teis

Visual C# Consolidado

780

sobre um erro, o objeto COM deve implementa a IErrorInfo interface. Tempo de Execuo utiliza as informaes fornecidas por IErrorInfo para inicializar o objeto de exceo. Se o objeto COM no oferece suporte IErrorInfo, o Runtime Inicializa um objeto de exceo com valores padro. A tabela a seguir lista cada campo associado a um objeto de exceo e identifica a fonte de informaes padro quando o objeto com oferece suporte IErrorInfo. Observe que o Runtime s vezes ignorar uma HRESULT casos em onde h um IErrorInfo presente no segmento. Este comportamento pode ocorrer em casos onde. e HRESULT o IErrorInfo no representam o mesmo erro Campo Exceo ErrorCode HelpLink Fonte de informaes de com HRESULT retornado da chamada. Se IErrorInfo->HelpContext diferente de zero, a seqncia formada pelas concatenao IErrorInfo->GetHelpFile e " # ". e IErrorInfo>GetHelpContext Caso contrrio a seqncia retornada de IErrorInfo>GetHelpFile. Sempre uma referncia nula (Nothing no Visual Basic.) Seqncia de caracteres retornada de IErrorInfo->GetDescription. Seqncia de caracteres retornada de IErrorInfo->GetSource. O rastreamento da pilha. O nome do mtodo que retornados a falha HRESULT.

InnerException Message (Mensagem) Origem StackTrace TargetSite

Campos exceo, como Message, Source a StackOverflowException., e StackTrace no esto disponveis para

Como Editar Assemblies de Interoperabilidade


O Importador da biblioteca Tipo (TLBIMP.exe) converte assinaturas mtodo com a maioria em assinaturas gerenciadas. No entanto, vrios tipos requer informaes adicionais que voc pode especificar, editando o conjunto de interoperabilidade. Este tpico descreve como editar um conjunto de interoperabilidade. O Empacotamento alteraes tpico identifica vrios casos que exigem que voc para editar o conjunto de interoperabilidade e descreve as alteraes necessrias. Para especificar empacotamento alteraes no Microsoft intermedirios idioma (MSIL) 1. Gerar conjunto interoperacional inicial usando TLBIMP.exe. Por exemplo, para produzir um conjunto chamado New.dll de New. TLB, digite o seguinte comando no prompt de comando:
tlbimp New.tlb /out:New.dll

2.

No prompt de comando, digite o seguinte comando para produzir MSIL para o conjunto:
ildasm New.dll /out:new.il

3. 4.

Editar o MSIL conforme necessrio. No prompt de comando, digite o seguinte comando para produzir a sintaxe apropriada definindo um novo New.dll:
ilasm New.il /dll

Visual C# Consolidado

781

Como Adicionar Referncias a Bibliotecas de Tipo


Gera Visual Studio 2005 um conjunto interoperacional que contm metadados quando voc adiciona uma referncia a uma biblioteca de tipos determinado. Se um conjunto interoperacional primrio estiver disponvel, Visual Studio usar o conjunto existente antes de gerar um novo conjunto de interoperabilidade. Para adicionar uma referncia a uma biblioteca de tipos 1. 2. 3. 4. 5. Instale o arquivo exe ou dll com em seu computador, a menos que um instalar.exe do Windows executa a instalao para voc. No menu Project, selecione References. Selecione a COM guia. Selecionar a biblioteca de tipos na lista Available References, ou procure o arquivo TLB. Clique em OK.

Como Manipular Eventos Gerados por uma Fonte COM


Se voc estiver familiarizado com o modelo baseado em delegate-evento fornecido pelo .NET Framework, no Consulte Tratamento e Raising eventos. Para obter detalhes especficos que se aplicam a nesta seo, consulte Consumir eventos na mesma seo. Um cliente .NET (coletor de eventos) pode receber eventos criados por um servidor COM existente (origem de evento). Interoperabilidade com gera os representantes necessrios nos metadados que forem includos no seu cliente gerenciado. Uma assinatura de representante importados compreende a interface de evento do coletor, um sublinhado, o nome de evento, e a palavra EventHandler: SinkEventInterface _ EventName EventHandler. Observe que objetos com eventos em um cliente .NET que elevar exigir duas colees Garbage Collector (GC) antes que so lanadas. Isso ocorre quando o ciclo de referncia que ocorre entre objetos COM e clientes gerenciados. Caso voc precise explicitamente liberar um objeto com voc deve chamar o Collect mtodo duas vezes. Para interoperar com uma fonte de eventos COM existente 1. Obter Conjunto de Mdulos (Assembly o) de interoperabilidade primria para o servidor COM se os tipos com forem a ser compartilhada por outros aplicativos. Um conjunto de interoperabilidade primrio contm metadados que representa a biblioteca de tipos convertido e assinado no editor. Observao Se o conjunto de interoperabilidade primrio no disponvel ou se o conjunto for a ser usado de forma privada, voc pode importar a biblioteca de tipos usando API equivalente ou a Importador da biblioteca Tipo (TLBIMP.exe) um. 2. 3. 4. O processo de converso gera um representante para cada evento; no entanto, voc s precisa para coletar os eventos de seu interesse. Voc pode usar um navegador de metadados, como para identificar eventos representantes. o Disassembler MSIL (Ildasm.exe), Consumir eventos da fonte de eventos COM da mesma maneira que consome eventos de uma origem de evento gerenciado.

Exemplo

Visual C# Consolidado

782

O exemplo a seguir demonstra como abrir uma janela do Internet Explorer e Wire eventos criados pelo InternetExplorer Objeto para manipuladores de eventos implementado no cdigo gerenciado. Definies de tipos Internet Explorer (incluindo representantes de evento) so importadas como metadados do SHDocVw.dll. O exemplo recpetores o TitleChange evento. C#
namespace InternetExplorer { using System; using System.Runtime.InteropServices; using SHDocVw; public class Explorer { public static void Main() { Explorer explorer = new Explorer(); explorer.Run(); } public void Run() { Object o = null; String s; try { // Starts the browser. m_IExplorer = new SHDocVw.InternetExplorer(); } catch(Exception e) { Console.WriteLine("Exception when creating Internet Explorer object {0}", e); return; } // Wires your event handlers to m_IExplorer. SetAllEvents(); try { // Goes to the home page. m_WebBrowser = (IWebBrowserApp) m_IExplorer; m_WebBrowser.Visible = true; m_WebBrowser.GoHome(); // Starts navigating to different URLs. Console.Write("Enter URL (or enter to quit): "); s = Console.ReadLine(); while (s != "" && m_IExplorer != null && m_WebBrowser != null) { m_WebBrowser.Navigate(s, ref o, ref o, ref o, ref o); Console.Write("Enter URL (or enter to quit): "); s = Console.ReadLine(); } m_WebBrowser.Quit(); } catch(Exception sE) { if (m_IExplorer == null && m_WebBrowser == null) { Console.WriteLine("Internet Explorer has gone away"); } else { Console.WriteLine("Exception happens {0}", sE); } } } // Uses the += syntax for adding delegates to events. void SetAllEvents() { if (m_IExplorer != null) { // Title Change event // DWebBrowserEvents2 is the name of the sink event //interface. // TitleChange is the name of the event. // DWebBrowserEvents2_TitleChangeEventHandler is the // delegate name assigned by TlbImp.exe. DWebBrowserEvents2_TitleChangeEventHandler DTitleChangeE = new DWebBrowserEvents2_TitleChangeEventHandler(OnTitleChange); m_IExplorer.TitleChange += DTitleChangeE; } } /////////////////////////////////////////////////////////////////////// // Define event handlers. // Document title changed static void OnTitleChange(String Text) { Console.WriteLine("Title changes to {0}", Text); } ////////////////////////////////////////////////////////////////////////// // The following are class fields. static private SHDocVw.InternetExplorer m_IExplorer = null; static private IWebBrowserApp m_WebBrowser = null; } }

Como Criar Wrappers Manualmente


Se voc optar por declarar tipos com manualmente no cdigo fonte gerenciado, o melhor lugar para comear com uma biblioteca Arquivo ou tipo interface Definition Language (IDL) existente. Quando voc no tem o arquivo IDL ou no possvel gerar um arquivo de biblioteca Tipo, voc pode simular os tipos com criando declaraes gerenciadas e exportar o conjunto resultante para uma biblioteca de tipos. Para simular com tipos de fonte gerenciado 1. 2. 3. Declarar os tipos em um idioma que seja compatvel o com comum especificao (cls) idioma e compilar o arquivo. Exportar o conjunto que contm os tipos com o Tipo Exporter da biblioteca (TlbExp.exe). Usar a biblioteca de tipos com exportado como uma base para declarar tipos gerenciados orientado com. Supondo que voc tiver um arquivo IDL ou arquivo biblioteca Tipo, decidir quais classes e interfaces voc deseja incluir no RCW personalizado. Voc pode excluir qualquer tipos que voc no pretende usar diretamente ou indiretamente em seu aplicativo.

Para criar um invlucro Callable Runtime (RCW) 1.

Visual C# Consolidado

783

2.

Criar um arquivo de origem em um idioma compatvel com CLS e declarar os tipos. Consulte Biblioteca tipo para resumo de converso assembly Para uma descrio completa do processo de converso de importao. Efetivamente, quando voc cria um RCW personalizado, voc est executando a atividade de converso fornecida pelo tipo manualmente o Importador da biblioteca Tipo (TLBIMP.exe). O Exemplo que segue este tipos mostra procedimento em um arquivo de biblioteca IDL ou tipo e seus tipos correspondentes no cdigo C#. Quando as declaraes estiverem concludas, compile o arquivo como voc compila qualquer outro cdigo de fonte gerenciado. Como com os tipos importados com TLBIMP.exe, algumas exigem informaes adicionais que voc pode adicionar diretamente a seu cdigo. Para obter detalhes, consulte Como editar conjuntos Interop:.

3. 4.

Exemplo O cdigo a seguir mostra um exemplo da interface e ISATestSATest Classe em IDL e os tipos correspondentes no cdigo fonte C#. Arquivo de biblioteca IDL ou tipo
[ object, uuid(40A8C65D-2448-447A-B786-64682CBEF133), dual, helpstring("ISATest Interface"), pointer_default(unique) ] interface ISATest : IDispatch { [id(1), helpstring("method InSArray")] HRESULT InSArray([in] SAFEARRAY(int) *ppsa, [out,retval] int *pSum); }; [ uuid(116CCA1E-7E39-4515-984990790DA6431E), helpstring("SATest Class") ] coclass SATest { [default] interface ISATest; };

Wrapper no cdigo fonte gerenciado C#


using System; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; [assembly:Guid("E4A992B8-6F5C-442C-96E7-C4778924C753")] [assembly:ImportedFromTypeLib("SAServerLib")] namespace SAServer { [ComImport] [Guid("40A8C65D2448-447A-B786-64682CBEF133")] [TypeLibType(TypeLibTypeFlags.FLicensed)] public interface ISATest { [DispId(1)] //[MethodImpl(MethodImplOptions.InternalCall, // MethodCodeType=MethodCodeType.Runtime)] int InSArray( [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_I4)] ref int[] param ); } [ComImport] [Guid("116CCA1E-7E39-4515-984990790DA6431E")] [ClassInterface(ClassInterfaceType.None)] [TypeLibType(TypeLibTypeFlags.FCanCreate)] public class SATest : ISATest { [DispId(1)] [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)] extern int ISATest.InSArray( [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_I4)] ref int[] param ); } }

Como Registrar Assemblies de Interoperabilidade Primrios


Voc dever registrar todos os adquirida primrio conjuntos interoperabilidade no seu computador de desenvolvimento antes voc pode referi-las com Microsoft Visual Studio 2005. O Visual Studio procurar e usa um conjunto interoperacional primrio na primeira vez que voc referncia um tipo de uma biblioteca de tipos COM. Se Visual Studio no possvel localizar conjunto de mdulos (assembly o) de interoperabilidade primria associado biblioteca tipo, ele solicitar que voc a adquiri-lo ou oferece para criar um conjunto de interoperabilidade. Do Importador da biblioteca Tipo (TLBIMP.exe) da mesma forma, tambm usa o Registro para localizar conjuntos de interoperabilidade primrias.

Visual C# Consolidado

784

Embora ele no seja necessrio para registrar conjuntos de interoperabilidade primrias a menos que voc pretende usar Visual Studio, registro oferece duas vantagens:

Um conjunto de interoperabilidade primrio registrado claramente est marcado sob a chave de registro da biblioteca de tipos original. Registro a melhor maneira de se localizar um conjunto de interoperabilidade primrio no seu computador. Voc pode evitar acidentalmente gerar e usando um novo conjunto interoperacional se, em algum momento no futuro, voc usar o Visual Studio para fazer referncia a um tipo para as quais voc tem Conjunto de Mdulos (Assembly no registrado um) de interoperabilidade primria.

Do Ferramenta de registro do conjunto (RegAsm.exe) uso para registrar um conjunto interoperacional primrio. Para registrar um conjunto interoperacional primrio

No prompt de comando, digite: regasm assemblyname Neste comando, assemblyname o nome de arquivo do conjunto que est registrado. RegAsm.exe adiciona uma entrada para o conjunto de interoperabilidade primrio sob a mesma chave de Registro como a biblioteca tipo original.

Exemplo O exemplo a seguir registra o CompanyA.UtilLib.dll conjunto de mdulos (assembly) de interoperabilidade primria.
regasm CompanyA.UtilLib.dll

Como Empacotar Vrias Verses de Bibliotecas de Tipos


Opcionalmente, voc pode dispor mais de uma verso de uma biblioteca de tipos. Por exemplo, voc pode indicar um conjunto de interoperabilidade primrio que oferece suporte tipo verses de biblioteca 1.0 e 1.1. Para ajustar vrias verses de uma biblioteca de tipos 1. Importar um arquivo de biblioteca tipo:
tlbimp LibUtil.tlb /primary /keyfile:CompanyA.snk /out:LibUtil.dll

2.

Criar um arquivo de texto do conjunto importado usando o Disassembler MSIL (Ildasm.exe):


ildasm LibUtil.dll /out:LibUtil.il

3.

Usando um editor de texto, insira um atributo segundo PrimaryInteropAssemblyAttribute abaixo o atributo adicionado por TLBIMP.exe. Incluir os nmeros de verso primria e secundria que representam a segunda verso de biblioteca tipo. Gerar e assinar um novo conjunto do arquivo de texto modificado por meio do Assembler MSIL (Ilasm.exe):
ilasm LibUtil.il /dll /key:CompanyA.snk

4.

Visual C# Consolidado

785

Aplicativos do Windows (Como fazer em C#)


Esta pgina tem links para Ajuda sobre tarefas em aplicativos do Windows amplamente usadas. Para ver outras categorias de tarefas populares abordadas na Ajuda, Como fazer em C#.

Como: Escolher o formulrio de inicializao em um aplicativo do Windows


Quando voc adicionar um formulrio do Windows a um projeto, ele no exibir prprio por padro em tempo de execuo. Para obter informaes sobre como exibir um formulrio em tempo de execuo, consulte Exibindo JanelaRestrita e Modeless Windows Forms. Entretanto, o formulrio criado quando voc escolhe um aplicativo do Windows a partir da New Project Caixa de dilogo ser o formulrio Inicializao por padro. Para alterar o formulrio de inicializao, use a Project pgina de propriedades. Para definir o formulrio de inicializao no Windows Forms 1. No Solution Explorer, clique com o boto direito do mouse o projeto e escolha Properties. A Project pgina Propriedade abre com as General propriedades exibidas. 2. Escolha o formulrio a ser como o formulrio de inicializao da lista Startup Object dropdown.

COMO: Conectar vrios eventos a um nico manipulador de eventos em Windows Forms


No seu projeto de aplicativos, talvez seja necessrio para usar um manipulador de eventos nico para vrios eventos ou tem vrios eventos executar o mesmo procedimento. Por exemplo, geralmente um saver tempo a poderoso para que um comando de menu elevar o mesmo evento como um boto em seu formulrio faz se eles expor a mesma funcionalidade. Para fazer isso, usando a exibio Eventos da janela Propriedades em C# ou palavra-chave Handles e Class Name. e Method Name caixas suspensas no editor de cdigo do Visual Basic Para conectar mltiplos eventos a um manipulador de eventos nico no Visual Basic 1. Clique com o boto direito do mouse no formulrio e escolha View Code. 2. Na caixa Class Name suspensa, selecione um dos controles que voc deseja que tem o manipulador de eventos tratar. 3. Na caixa Method Name suspensa, selecione um dos eventos que voc deseja manipulador de eventos para manipular. 4. O Editor de Cdigo insere o manipulador de eventos apropriado e posiciona o ponto de insero dentro do mtodo. No exemplo abaixo, ele o Click evento para o Button controle. Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' Add event-handler code here. End Sub

5.

Acrescentar os outros eventos voc deseja tratado com a Handles clusula.

Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click ' Add event-handler code here. End Sub

6.

Adicione o cdigo apropriado ao manipulador de eventos.

Para se conectar vrios eventos a um manipulador de eventos nico em C#

Visual C# Consolidado

786

1. 2. 3.

Selecione o controle ao qual voc quer se conectar um manipulador de eventos. Na janela Propriedades, clique no Events boto ( ).

Clique no nome do evento que voc deseja manipular.

4. Na seo valor ao lado do nome de evento, clique no boto drop-down para exibir uma lista de existente manipuladores de eventos que correspondem assinatura mtodo do evento voc deseja manipular. 5. Selecione o manipulador de eventos apropriado na lista. Cdigo ser adicionado para o formulrio para vincular o evento ao manipulador de eventos existentes.

Como: Criar uma interface de usurio Multipainel com Windows Forms


No procedimento a seguir, voc criar uma interface usurio multipane que semelhante daquele usado no Microsoft Outlook, com uma Folder lista, um Messages painel, e um Preview painel. Essa organizao conseguida chiefly atravs de encaixe controles com o formulrio. Quando voc ancora um controle, voc determinar qual borda do recipiente pai um controle encaixado para. Assim, se voc definir a Dock propriedade para Right, a borda direita do controle ser encaixada para a borda direita de seu controle pai ser. Alm disso, a borda do controle encaixada redimensionada para coincidir com a de seu controle de recipiente. Para obter mais informaes sobre como a Dock propriedade funciona, consulte HOW TO: Dock controles em Windows Forms. Este procedimento se concentra na organizao e SplitContainer a outros controles no formulrio, no em Adicionar funcionalidade para tornar o aplicativo imitar o Microsoft Outlook. Para criar essa interface de usurio, voc coloque todos os controles em um SplitContainer controle, que contm um TreeView controle no painel esquerdo. O painel direito do controle SplitContainer contm um segundo SplitContainer controle com um ListView controle acima um RichTextBox controle. Esses SplitContainer controles permitem redimensionamento independente dos outros controles no formulrio. Voc pode adaptar as tcnicas neste procedimento para artesanato interfaces do usurio personalizada de suas preferncia. Para criar uma interface de usurio estilo Outlook-programaticamente 1. Em um formulrio, declare cada controle que abranja a interface do usurio. Neste exemplo, para usar e RichTextBox controles para imitar a interface de usurio do Microsoft Outlook., SplitContainer a TreeView, ListView C#
private System.Windows.Forms.TreeView treeView1; private System.Windows.Forms.ListView listView1; private System.Windows.Forms.RichTextBox richTextBox1; private System.Windows.Forms. SplitContainer splitContainer2; private System.Windows.Forms. SplitContainer splitContainer1;

2. Criar um procedimento que define a interface do usurio. O cdigo a seguir define as propriedades para que se ser o formulrio parecer com interface de usurio no Microsoft Outlook. No entanto, ao usando outros controles ou encaixe-los de forma diferente, apenas to fcil para criar outras interfaces de usurio que so igualmente flexveis. C#

Visual C# Consolidado

787

public void createOutlookUI() { // Create an instance of each control being used. treeView1 = new System.Windows.Forms.TreeView(); listView1 = new System.Windows.Forms.ListView(); richTextBox1 = new System.Windows.Forms.RichTextBox(); splitContainer2 = new System.Windows.Forms.SplitContainer(); splitContainer1 = new System.Windows.Forms.SplitContainer(); // Insert code here to hook up event methods. // Set properties of TreeView control. treeView1.Dock = System.Windows.Forms.DockStyle.Fill; treeView1.TabIndex = 0; treeView1.Nodes.Add("treeView"); // Set properties of ListView control. listView1.Dock = System.Windows.Forms.DockStyle.Top; listView1.TabIndex = 2; listView1.Items.Add("listView"); // Set properties of RichTextBox control. richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill; richTextBox1.TabIndex = 3; richTextBox1.Text = "richTextBox1"; // Set properties of first SplitContainer control. splitContainer1.Dock = System.Windows.Forms.DockStyle.Fil1; splitContainer2.TabIndex = 1; splitContainer2.SplitterWidth = 4; splitContainer2.SplitterDistance = 150; splitContainer2.Orientation = Orientation.Horizontal; splitContainer2.Panel1.Controls.Add(this.listView1); splitContainer2.Panel1.Controls.Add(this.richTextBox1); // Set properties of second SplitContainer control. splitContainer2.Dock = System.Windows.Forms.DockStyle.Fil1; splitContainer2.TabIndex = 4; splitContainer2.SplitterWidth = 4; splitContainer2.SplitterDistance = 100; splitContainer2.Panel1.Controls.Add(this.treeView1); splitContainer2.Panel1.Controls.Add(this.splitContainer1); // Add the main SplitContainer control to the form. this.Controls.Add(this.splitContainer2); this.Text = "Intricate UI Example"; }

3. No Visual Basic, adicione uma chamada para o procedimento recm-criado no procedimento New(). No Visual C#, adicione esta linha de cdigo para o construtor para a classe formulrio. C#
// Add this to the form class's constructor. createOutlookUI();

Como: Adicionar imagens de plano de fundo ao Windows Forms


Ao projetar sua formulrios Windows, s vezes, convm para colocar uma imagem de plano de fundo em um controle ou no prprio o formulrio. Voc pode fazer isso facilmente utilizando a Properties janela. Para adicionar uma imagem de plano de fundo a um formulrio do Windows 1. Clique em propriedade do formulrio BackgroundImage na janela Properties. Clique o reticncias ( .) boto para abrir a Select Resource caixa de dilogo 2. Clique Import para abrir a Open File caixa de dilogo. Navegue para um arquivo bitmap (.bmp), por exemplo <Windows folder> / Rhododendron.bmp. Clique Open para aceitar sua escolha. Observe que o arquivo voc separado agora aparece na lista Entry, e a imagem aparece na caixa Preview. 3. Clique OK Para importar a imagem como um recurso. Observe que a imagem agora aparece em seu formulrio. Voc pode usar a BackgroundImageLayout propriedade para controlar a aparncia da imagem no formulrio Observe tambm que o projeto agora tem uma pasta chamada Resources na qual a imagem de origem foi copiada. Para remover uma imagem de plano de fundo de um formulrio do Windows Na janela Properties, clique com o boto direito do mouse o reticncias ( BackgroundImage propriedade, em Reset seguida clique em

.), boto para a

Visual C# Consolidado

788

Como: Definir ToolTips para controles em um Windows Form em tempo de design


Voc pode definir uma ToolTip seqncia no cdigo ou em Windows Forms Designer. Para obter mais informaes sobre o ToolTip componente, consulte Dica de Ferramenta Component Overview (formulrios do Windows). Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Para definir uma dica de ferramenta programaticamente 1. 2. C#
// In this example, button1 is the control to display the ToolTip. toolTip1.SetToolTip(button1, "Save changes");

Adicione o controle que ser exibida a dica de ferramenta. Use o SetToolTip mtodo do componente ToolTip.

Para definir uma dica de ferramenta no designer 1. 2. Adicionar um ToolTip componente para o formulrio. Selecione o controle que exibir a dica de ferramenta, ou adicion-lo ao formulrio.

3. Na janela Properties, defina o ToolTip on ToolTip1 valor como uma seqncia de texto apropriada.

COMO: Adicionar controles ActiveX ao Windows Forms


Enquanto o Windows Forms Designer otimizado para host controles Windows Forms, voc tambm pode colocar controles ActiveX em Windows Forms. Cuidado Existem limitaes de desempenho para Windows Forms quando controles ActiveX so adicionados a eles. Antes de adicionar controles ActiveX a seu formulrio, voc deve adicion-los para a Caixa de ferramentas. Para obter mais informaes, consulte Componentes COM, Personalizar caixa de dilogo Caixa de ferramentas. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, clique em Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio.

Visual C# Consolidado

789

Para adicionar um controle ActiveX para o formulrio Windows

Clique duas vezes no controle na barra de ferramentas.

Adiciona Visual Studio Todas as referncias para o controle no seu projeto. Para obter mais informaes sobre o que tenha em mente ao usar controles ActiveX em Windows Forms, consulte Consideraes ao hospedando um controle ActiveX em um formulrio do Windows. Observao Formulrios Windows o Importer controle ActiveX (AxImp.exe) cria argumentos evento de um tipo diferente do esperado na importao das bibliotecas de vnculo dinmico ActiveX. Os argumentos criado pelo AxImp.exe so semelhantes ao seguinte: Invoke(object sender, DWebBrowserEvents2_ProgressChangeEvent e), quando Invoke(object sender, DWebBrowserEvents2_ProgressChangeEventArgs e) esperado. Esteja ciente que este irregularity no impede Cdigo de funcionando normalmente. Para obter detalhes, consulte Importer controle ActiveX formulrios Windows (Aximp.exe).

COMO: Criar chaves do acesso para controles do Windows Forms


Um Tecla de acesso um caractere sublinhado no texto de um menu, item de menu, ou o rtulo de um controle como um boto. Com uma tecla de acesso, o usurio pode " clicar " um boto, pressionando a tecla ALT junto com a chave predefinida de acesso. Por exemplo, faz se um boto executa um procedimento para imprimir um formulrio, e portanto sua Text propriedade estiver definida para " imprimir ", adicionando e um comercial antes da letra " P " com a letra " P " para ser sublinhada no texto do boto em tempo de execuo. O usurio pode executar o comando associado com o boto pressionando ALT + P. No possvel ter uma tecla de acesso para um controle que no pode receber o foco. Para criar uma chave de acesso para um controle Set the Text property to a string that includes an ampersand (&) before the letter that will be the shortcut.

C#
// Set the letter "P" as an access key. button1.Text = "&Print";

Observao To include an ampersand in a caption without creating an access key, include two ampersands (&&). Um nico e comercial exibido na legenda e sem caracteres so sublinhados.

Como: Adicionar ou remover de uma coleo de controles em tempo de execuo


Tarefas comuns em desenvolvimento de aplicativos so adicionar controles para e removendo controles de qualquer caixa de controles no seus formulrios o Panel, como ou GroupBox controle, ou mesmo o formulrio prprio)..), como o Panel ou GroupBox controle, ou mesmo o prprio formulrio (( Em tempo de criao, controles podem ser arrastadas diretamente em uma caixa painel ou grupo. Em tempo de execuo, esses controles manter uma Controls coleo, que mantm registro dos quais controles so colocados sobre eles. Observao

Visual C# Consolidado

790

O exemplo de cdigo a seguir aplica a qualquer controle que mantm um conjunto de controles dentro dela. Para adicionar um controle a uma coleo programaticamente 1. 2. 3. Criar uma instncia do controle a ser adicionado. Definir propriedades do novo controle. Adicione o controle coleo Controls do controle pai.

O exemplo de cdigo a seguir mostra como criar uma instncia do controle Button. Ele requer um formulrio com um Panel controle e que o mtodo tratamento de eventos para o boto sendo criada NewPanelButton_Click,. j existe C#
public Button newPanelButton = new Button(); public void addNewControl() { // The Add method will accept as a parameter any object that derives // from the Control class. In this case, it is a Button control. panel1.Controls.Add(newPanelButton); // The event handler indicated for the Click event in the code // below is used as an example. Substite the appropriate event // handler for your application. this.newPanelButton.Click += new System.EventHandler(this. NewPanelButton_Click); }

Para remover controles de uma coleo programaticamente 1. Remover o manipulador de eventos do evento. No Visual Basic, use a Instruo RemoveHandler palavra-chave; no Visual C#, use o = Operador (referncia C#). 2. 3. C#
private void removeControl(object sender, System.EventArgs e) { // NOTE: The code below uses the instance of // the button (newPanelButton) from the previous example. if(panel1.Controls.Contains(newPanelButton)) { this.newPanelButton.Click -= new System.EventHandler(this. NewPanelButton_Click); panel1.Controls.Remove(newPanelButton); newPanelButton.Dispose(); } }

Use o Remove mtodo para excluir o controle desejado do painel na Controls coleo. Chamar o Dispose mtodo para verso todos os recursos usado pelo controle.

COMO: Ativar estilos do Visual Windows XP


Estilo visual a aparncia modifiable Usurio da interface do usurio de um aplicativo ou sistema operacional. Por padro, o Windows XP fornece um novo estilo visual. O novo estilo visual a barras de rolagem e barra ttulo de um formulrio do Windows ser usam automaticamente quando o formulrio executado no Windows XP. O estilo visual se seu aplicativo chama o EnableVisualStyles mtodo, a maioria dos controles Windows Forms usar automaticamente quando seu aplicativo executado no Windows XP. Observao O suporte estilos visuais Windows XP tambm pode ser habilitado atravs da Enable Visual Styles caixa de seleo no painel Application da Project Designer. Para obter mais informaes, consulte o tpico COMO: ativar estilos visuais. Para ativar estilos visuais

Visual C# Consolidado

791

Para ativar estilos visuais na rea cliente de um formulrio do Windows, adicione o seguinte cdigo ao mtodo do aplicativo Main.

C#
Application.EnableVisualStyles();

Observao No h alguns formulrios Windows controla que ser aspecto. os mesmos em todos os sistemas operacionais; implementao EnableVisualStyles tem no afeta esses controles Eles incluem e CheckedListBox controles., DomainUpDown, NumericUpDown o LinkLabelLabel Alm disso, se voc ativar estilos visuais em alguns controles, o controle pode exibir incorretamente em certas situaes. Eles incluem o MonthCalendar controle com um conjunto intervalo, seleo com pginas guia alinhado na parte inferior ou lados do controle, e o tratamento de fontes substituto no controle TextBox. o TabControl

Como: Tornar uma Windows Form de inicializao invisvel


Para tornar o formulrio principal de um aplicativo baseado no Windows invisvel quando o aplicativo for iniciado, voc deve mover lgica de inicializao do aplicativo para uma classe separada. Simplesmente voc no pode definir sua Visvel propriedade para false. Depois voc ter separados a vida til do aplicativo da vida til do formulrio, voc pode fazer formulrios visvel (e invisvel), porque o aplicativo ser encerrado quando voc " fechar " a classe que foi usado para inicializao Aplicativo.. porque o aplicativo ser encerrado quando voc " fechar " a classe que foi usado para inicializao aplicativo Observao Como um mdulo invisvel quando seu cdigo est sendo executado, o procedimento a seguir inclui uma etapa para adicionar uma caixa de mensagem para o mdulo de inicializao para simplesmente demonstrar que o aplicativo est sendo executado. Para definir um formulrio para ser invisvel no seu incio 1. Execute uma das maneiras a seguir: 1. No Visual Basic, adicionar um mdulo a seu aplicativo baseado no Windows, com o boto direito do mouse o projeto e escolhendo Add Module. 2. 3. No Visual C#, criar uma nova classe. No Visual C++, abra Form1.cpp do seu aplicativo baseados no Windows.

Para obter mais informaes sobre como criar um aplicativo baseado no Windows, consulte Como: Criar um projeto de aplicativos Windows. 2. Dentro do mdulo ou classe, desenvolver uma Main subrotina que podem atuar como o objeto de inicializao para o projeto. O exemplo de cdigo a seguir mostra como voc pode Approach isso. C#
// All methods must be contained in a class. // This class is added to the namespace containing the Form1 class. class MainApplication { public static void Main() { // Instantiate a new instance of Form1. Form1 f1 = new Form1(); // Display a messagebox. This shows the application // is running, yet there is nothing shown

Visual C# Consolidado

792

to the user. // This is the point at which you customize your form. System.Windows.Forms.MessageBox.Show("The application " + "is running now, but no forms have been shown."); // Customize the form. f1.Text = "Running Form"; // Show the instance of the form modally. f1.ShowDialog(); } }

Observao Caixa de mensagem no exemplo de cdigo anterior especificado com um espao para nome totalmente qualificado porque o mdulo criado, diferentemente de um formulrio padro do Windows, no importa espaos para qualquer nome por padro. Para obter mais informaes sobre como importar espaos para nome, consulte Referncias e a declarao imports (Visual Basic) (Visual C# (Visual C++.), o Usando diretiva (referncia C#), ou o using Directive (C++)) Ser Application.Run() iniciado o bomba mensagem, que vital para o comportamento de determinados aplicativos e pode afetar comportamento formulrio durante determinadas horas em ciclo de vida do aplicativo, como ao desligar. Para obter mais informaes, consulte Mtodo Application.Run. 3. Alterar o objeto de inicializao para o projeto seja Sub Main em vez de Form1.

Para Visual C# definir o objeto de inicializao para ser ApplicationName, MainApplication como em nomeao da classe no exemplo de cdigo anterior. Para obter mais informaes, consulte Como: Escolher o formulrio de inicializao em um aplicativo do Windows. Observao Ignorar esta etapa para aplicativos baseados no Windows em Visual C++. 4. Pressione F5 para executar o projeto.

Quando a execuo de aplicativos, o cdigo no Main() executa primeiro enquanto a instncia do Form1 lingers, oculto, at que o cdigo para mostrar executado. Isso permite que voc para fazer o que voc deseja na instncia do Form1 em segundo plano sem conhecimento do usurio.

Como: Manter um Windows Form em exibio


Iniciando com o sistema operacional Microsoft Windows 2000, um formulrio mais alto-sempre permanece na frente de todas as janelas em um determinado aplicativo. No Microsoft Windows 98, um formulrio mais alto-permanece na frente de todas as janelas em todos os aplicativos. Por exemplo, voc pode deseja manter uma janela ferramenta flutuante no frente da janela principal do aplicativo A TopMost propriedade controla se um formulrio um formulrio mais superior. Sempre um formulrio mais alto-ser flutuar acima, outros formulrios no mais alto-mesmo quando ele no est ativa. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Para fazer um formulrio o formulrio mais alto-em uma aplicativo do Windows Forms a tempo de design

Na janela Properties, defina a TopMost propriedade como true.

Visual C# Consolidado

793

Para fazer um formulrio o formulrio mais alto-em uma aplicativo do Windows Forms programaticamente

Em um procedimento, defina a TopMost propriedade como true.

C#
public void MakeOnTop() { myTopForm.TopMost = true; }

Como: Exibir Windows Forms com e sem janelas restritas


Formulrios e caixas de dilogo so marcas restrita ou sem janela restrita. Um janela restrita formulrio ou caixa de dilogo deve ser fechado ou ocultos antes de continuar trabalhando com o restante do aplicativo. Para obter mais informaes sobre como trabalhar com caixas de dilogo, consulte Entrada de usurio para caixas de dilogo. Caixas de dilogo que exibe mensagens importantes sempre deve ser restrita. Caixa About de dilogo no Visual Studio um exemplo de uma caixa de dilogo restrita. MessageBox um formulrio modal voc pode usar. Formulrios Sem janela restrita permitem que voc alternar o foco entre o formulrio e um outro formulrio sem ter que fechar o formulrio inicial. O usurio pode continuar a trabalhar em qualquer lugar em qualquer aplicativo enquanto o formulrio exibido. Formulrios sem janela restrita so mais difceis para programa, porque os usurios possam acess-los em uma ordem imprevisveis. Voc deve manter o estado do do aplicativo consistente no importa o que o usurio faz. Freqentemente, janelas de ferramentas so mostrados em uma maneira sem janela restrita. A Find caixa de dilogo acessveis de menu Edit no Visual Studio, um exemplo de uma caixa de dilogo sem janela restrita. Usar formulrios para comandos exibio usados ou informaes sem janela restrita. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Para exibir um formulrio como uma caixa de dilogo restrita

Chame o ShowDialog mtodo.

O exemplo de cdigo a seguir mostra como exibir uma caixa de dilogo modally. C#
//Display frmAbout as a modal dialog Form frmAbout = new Form(); frmAbout.ShowDialog();

O ShowDialog mtodo contm um argumento opcional, owner,. que pode ser usado para especificar uma relao pai-filho para um formulrio Por exemplo, ao cdigo no formulrio principal mostra uma caixa de dilogo, voc pode passar Me (in Visual Basic) ou this (no Visual C#). Como o proprietrio da caixa de dilogo para estabelecer o formulrio principal como o proprietrio, como o cdigo a seguir mostra C#
private void mnuAbout_Click(object sender, System.EventArgs e) { Form f = new Form(); f.ShowDialog(this); }

Visual C# Consolidado

794

Para exibir um formulrio como uma caixa de dilogo sem janela restrita

Chame o Show mtodo.

O exemplo a seguir mostra como exibir uma About caixa de dilogo em formato sem janela restrita. C#
//Display f as a modeless dialog Form f= new Form(); f.Show();

Observao Se um formulrio exibido como janela restrita, o cdigo seguinte ao ShowDialog mtodo no ser executado at que a caixa de dilogo seja fechada. No entanto, quando um formulrio exibido como modal, o cdigo seguinte ao Show mtodo for executado imediatamente aps o formulrio exibido..

Como: Selecionar texto no controle TextBox do Windows Forms


Voc pode selecionar texto programaticamente no controle Windows Forms TextBox Por exemplo, se voc criar uma funo que procura texto para uma seqncia especfica, voc pode selecionar o texto a visualmente Alerta o leitor de posio a seqncia de caracteres encontrada na Para selecionar texto programaticamente 1. Defina a SelectionStart propriedade para o incio do texto desejado para selecionar. A SelectionStart propriedade um nmero que indica o ponto de insero dentro da seqncia de texto, com 0 a posio extrema esquerda. Se a SelectionStart propriedade definida como um valor igual a ou maior que o nmero de caracteres na caixa de texto, o ponto de insero est colocado depois do ltimo caractere. 2. Defina a SelectionLength propriedade ao comprimento do texto que deseja selecionar. A SelectionLength propriedade um valor numrico que define a largura do ponto de insero. Do SelectionLength configurao para um nmero maior que 0 causar esse nmero de caracteres a ser selecionado, iniciando a partir o ponto de insero atual. 3. (Opcional) Acessar o texto selecionado atravs da SelectedText propriedade. O cdigo a seguir seleciona o contedo de uma caixa de texto quando o controle o Enter evento ocorrer. O TextBox1_Enter manipulador de eventos deve ser vinculado ao controle; para obter mais informaes, consulte Como criar manipuladores de eventos em tempo de execuo para Windows Forms:. C#
private void textBox1_Enter(object sender, System.EventArgs e){ textBox1.SelectionStart = 0; textBox1.SelectionLength = textBox1.Text.Length; }

Como: Colocar aspas em uma seqncia (Windows Forms)


s vezes, convm colocar as aspas (. " " em uma seqncia de texto) Por exemplo: Ela dito, " Voc merece uma trate! "

Para colocar aspas em uma seqncia em seu cdigo

Visual C# Consolidado

795

1. No Visual Basic, inserir duas aspas em uma linha como uma marca cotao incorporada. Em Visual C# \ " como uma marca cotao incorporada. e Visual C++, insira a seqncia de escape Por exemplo, para criar a seqncia anterior, use o cdigo a seguir. C#
private void InsertQuote(){ textBox1.Text = "She said, \"You deserve a treat!\" "; }

- ou 2. Insira o caractere ASCII ou Unicode para uma aspa. No Visual Basic, use o caractere ASCII (34). In Visual C#, use the Unicode character (\u0022). C#
private void InsertAscii(){ textBox1.Text = "She said, " + '\u0022' + "You deserve a treat!" + '\u0022'; }

Observao In this example, you cannot use \u0022 because you cannot use a universal character name that designates a character in the basic character set. Caso contrrio, voc produzir C3851. For more information, see Compilador C3851 de erro. - ou 3. C#
const string quote = "\""; textBox1.Text = "She said, " + quote + "You deserve a treat!"+ quote ;

Voc tambm pode definir uma constante para o caractere, e us-la quando necessrio.

Como: Selecionar texto no controle TextBox do Windows Forms


Voc pode selecionar texto programaticamente no controle Windows Forms TextBox Por exemplo, se voc criar uma funo que procura texto para uma seqncia especfica, voc pode selecionar o texto a visualmente Alerta o leitor de posio a seqncia de caracteres encontrada na Para selecionar texto programaticamente 1. Defina a SelectionStart propriedade para o incio do texto desejado para selecionar. A SelectionStart propriedade um nmero que indica o ponto de insero dentro da seqncia de texto, com 0 a posio extrema esquerda. Se a SelectionStart propriedade definida como um valor igual a ou maior que o nmero de caracteres na caixa de texto, o ponto de insero est colocado depois do ltimo caractere. 2. Defina a SelectionLength propriedade ao comprimento do texto que deseja selecionar. A SelectionLength propriedade um valor numrico que define a largura do ponto de insero. Do SelectionLength configurao para um nmero maior que 0 causar esse nmero de caracteres a ser selecionado, iniciando a partir o ponto de insero atual. 3. (Opcional) Acessar o texto selecionado atravs da SelectedText propriedade. O cdigo a seguir seleciona o contedo de uma caixa de texto quando o controle o Enter evento ocorrer. O TextBox1_Enter manipulador de eventos deve ser vinculado ao controle; para obter mais informaes, consulte Como criar manipuladores de eventos em tempo de execuo para Windows Forms:. C#
private void textBox1_Enter(object sender, System.EventArgs e){ textBox1.SelectionStart = 0; textBox1.SelectionLength = textBox1.Text.Length; }

Visual C# Consolidado

796

Como exibir vrias linhas no controle TextBox de formulrios do Windows:


Por padro, o controle Windows Forms TextBox exibe uma nica linha de texto e no exibe barras de rolagem. Se o texto for maior que o espao disponvel, somente parte do texto estar visvel. Voc pode alterar esse comportamento padro, definindo o Multiline, WordWrap., e ScrollBars propriedades para valores apropriados Para exibir um retorno de carro no controle TextBox

Para exibir um retorno de carro em uma vrias linhas TextBox, use a NewLine propriedade. Esteja ciente que a interpretao de caracteres de escape ( especfico de idioma. Visual Basic usa Chr$(13) & Chr$(10) para retorno de carro e alimentao de linha a combinao de caracteres.

Para exibir vrias linhas no controle TextBox 1. Defina a Multiline propriedade para true. Se WordWrap ser true (o padro), em seguida, o texto no controle ser exibida como um ou mais pargrafos; caso contrrio, ele aparecer como uma lista, em que algumas linhas podem ser cortadas na borda do controle. Defina a ScrollBars propriedade como um valor apropriado. Value (Valor) None Descrio Use esse valor se o texto ser um pargrafo que. quase sempre ajusta o controle O usurio pode usar o ponteiro do mouse para mover-se dentro do controle se o texto for muito longa para exibir todos de uma vez. Use esse valor se voc deseja exibir uma lista de linhas, alguns dos que podem estar maior que a largura do controle TextBox. Use esse valor se a lista pode ser maior que a altura do controle.

2.

Horizontal Both 3.

Defina a WordWrap propriedade como um valor apropriado. Value (Valor) false Descrio Texto no controle no automaticamente ser ser disposto, para que ele ir rolar para a direita at que uma quebra de linha seja alcanada. Use esse valor se voc escolheu Horizontal barras de rolagem ou Both, acima. A barra de rolagem horizontal no ser exibido. Use esse valor se voc escolheu Vertical barras de rolagem ou None, acima, para exibir um ou mais pargrafos.

(true padro)

Componente Timer (Windows Forms)


Os formulrios Timer do Windows um componente que gera um evento em intervalos regulares. Este componente projetado para um ambiente Windows Forms.

Viso geral do componente de timer (Windows Forms)


Os formulrios Timer do Windows um componente que gera um evento em intervalos regulares. Este componente projetado para um ambiente Windows Forms. Se voc precisar um timer que adequado para um ambiente de servidor, consulte Introduo ao timers Based Server-. Chave propriedades, mtodos e eventos

Visual C# Consolidado

797

O comprimento de intervalos definido pela propriedade Interval, cujo valor em milissegundos. Quando o componente est ativado, o Tick evento ser gerado a cada intervalo. onde voc adicionaria cdigo para ser executado. Para obter mais informaes, consulte Como executar procedimentos na intervalos do conjunto com o componente Timer Windows Forms:.Os mtodos para o Timer componente de chave so Start e Stop, que ativar o timer e desativar. Quando o cronmetro desligado, ele redefine; no um meio para pausar um Timer componente.

Limitaes do componente Timer de formulrios do Windows na propriedade Interval


O componente Windows Forms Timer tem uma Interval propriedade que especifica o nmero de milissegundos que passam entre um evento Timer e a prxima. A menos que o componente desativado, um timer continua a receber o Tick evento em aproximadamente iguais intervalos de tempo. Este componente projetado para um ambiente Windows Forms. Se voc precisar um timer que adequado para um ambiente de servidor, consulte Introduo ao timers Based Server-. A propriedade Interval A Interval propriedade tem algumas limitaes a serem considerados quando voc est programando um Timer componente:

Se seu aplicativo ou outro aplicativo est fazendo demandas pesadas no sistema , como loops longos, intenso clculos, ou unidade, rede, ou acesso da porta seu aplicativo pode possvel obter eventos timer com freqncia como a Interval propriedade especifica. O intervalo pode ser entre 1 e 64,767, inclusive, que significa que mesmo o intervalo mais longo no muito maior que um minuto 64.8 sobre (segundos). O intervalo no garantido para decorrer exatamente no tempo. Para garantir a preciso, o timer deve verificar o relgio do sistema conforme necessrio, em vez de tentar se manter controle de tempo acumulado internamente. O sistema gera 18 pulsos do relgio por segundo to mesmo embora a Interval propriedade medida em milissegundos, a preciso de um intervalo VERDADEIRO mais de um-eighteenth de um segundo.

Como executar procedimentos na intervalos do conjunto com o componente Timer Windows Forms:
s vezes, convm criar um procedimento que executa em intervalos especficos de tempo at que um loop foi concluda ou que seja executado quando um intervalo de tempo definido tiver decorrido. O Timer componente permite tal um procedimento. Este componente projetado para um ambiente Windows Forms. Se voc precisar um timer que adequado para um ambiente de servidor, consulte Introduo ao timers Based Server-. Observao Existem algumas limitaes ao usar o Timer Componente. Para obter mais informaes, consulte Limitaes do componente Timer de formulrios do Windows na propriedade Interval. Para executar um procedimento em intervalos definidos com o componente timer

Visual C# Consolidado

798

1.

Adicionar ao seu formulrio. um Timer Consulte a seo exemplo a seguir para obter uma ilustrao de como fazer isso programaticamente. Tambm Visual Studio oferece suporte para adicionar componentes a um formulrio. Defina a Interval propriedade (em milissegundos) para o timer. Esta propriedade determina quanto tempo ir passar antes o procedimento executado novamente. Observao Quanto maior a freqncia de um evento Timer ocorrer, mais tempo do processador usado em responder ao evento. Isso pode diminuir o desempenho geral. No defina um intervalo menor do que voc precisa.

2.

3. 4. 5.

Escreva cdigo apropriado no manipulador Tick de eventos. O cdigo voc escreve nesse evento ser executado no intervalo especificado na propriedade Interval. Defina a Enabled propriedade para true Para iniciar o cronmetro. O Tick evento comear a ocorrer, executar o procedimento no intervalo conjunto. Ao tempo apropriado, defina a Enabled propriedade como false para interromper o procedimento seja executado novamente. Definir o intervalo para 0 no faz com que o timer para parar.

Exemplo Este primeiro exemplo de cdigo controla a hora do dia em incrementos um segundo. Ele usa um Button, a Label, e um Timer componente em um formulrio. A Interval propriedade definida como 1000 (igual a um segundo). No evento Tick, legenda do rtulo definida como a hora atual. Quando o boto for clicado, a Enabled propriedade definida como false, interrompendo o timer de atualizar legenda do rtulo. O exemplo de cdigo a seguir requer que voc tenha um formulrio com um Button controle denominado Button1, um Timer controle chamado Timer1, e um Label controle chamado Label1. C#
private void InitializeTimer() { //' Run this procedure in an appropriate event. // Set to 1 second. Timer1.Interval = 1000; // Enable timer. Timer1.Enabled = true; Button1.Text = "Stop"; } private void Timer1_Tick(object Sender, EventArgs e) { // Set the caption to the current time. Label1.Text = DateTime.Now.ToString(); } private void Button1_Click() { if ( Button1.Text == "Stop" ) { Button1.Text = "Start"; Timer1.Enabled = false; } else { Button1.Text = "Stop"; Timer1.Enabled = true; } }

Este exemplo de cdigo segundo executa um procedimento cada milissegundos 600 at que um loop tenha terminado. O exemplo de cdigo a seguir requer que voc tenha um formulrio com um Button controle denominado Button1, um Timer controle chamado Timer1, e um Label controle chamado Label1. C#
// This variable will be the loop counter. private int counter; private void InitializeTimer() { // Run this procedure in an appropriate event. counter = 0; timer1.Interval = 600; timer1.Enabled = true; // Hook up timer's tick event handler. this.timer1.Tick += new System.EventHandler(this.timer1_Tick); } private void timer1_Tick(object sender, System.EventArgs e) { if (counter >= 10) { // Exit loop code. timer1.Enabled = false; counter = 0; } else { // Run your procedure here. // Increment counter. counter = counter + 1; label1.Text = "Procedures Run: " + counter.ToString(); } }

Visual C# Consolidado

799

Controle toolBar Windows (formulrios)


Observao O ToolStrip controle substitui e adiciona funcionalidade para o ToolBar controle; no entanto, o ToolBar controle foi mantido para compatibilidade com verses anteriores e uso futuro, se voc escolher. O controle Windows Forms ToolBar for usado como uma barra de controle que exibe uma linha de menus suspensos e botes de bitmap que Ativar comandos em formulrios. Assim, clicar em um boto de ferramentas equivale a escolher um comando de menu. Os botes podem ser configurado para aparecem e se comportam como botes de ao, menus drop-down ou separadores. Normalmente, uma barra de ferramentas contm botes e menus que correspondem aos itens em um aplicativo na estrutura de menu, fornecendo acesso rpido s funes usadas com mais freqncia do aplicativo e comandos. Observao Propriedade do ToolBar controle DropDownMenu tem uma instncia da classe ContextMenu como uma referncia. Cuidadosamente a referncia voc passar ao implementar esse tipo de boto nas barras de ferramentas em seu aplicativo, como a propriedade aceitar qualquer objeto que herda da classe Menu.

Viso geral sobre de controle toolBar (formulrios do Windows)


Observao O ToolStrip controle substitui e adiciona funcionalidade para o ToolBar controle; no entanto, o ToolBar controle foi mantido para compatibilidade com verses anteriores e uso futuro, se voc escolher. O controle Windows Forms ToolBar for usado como uma barra de controle que exibe uma linha de menus suspensos e botes de bitmap que Ativar comandos em formulrios. Assim, clicar em um boto de ferramentas pode ser um equivalente ao escolher um comando de menu. Os botes podem ser configurado para aparecem e se comportam como pushbuttons, menus drop-down ou separadores. Normalmente, uma barra de ferramentas contm botes e menus que correspondem aos itens em um aplicativo na estrutura de menu, fornecendo acesso rpido s funes usadas com mais freqncia do aplicativo e comandos. Trabalhando com o controle ToolBar Um ToolBar controle normalmente est " ancorada " ao longo da parte superior da sua janela pai, mas ela tambm pode ser ancorada para qualquer lado da janela. Uma barra de ferramentas pode exibir dicas de ferramentas quando o usurio aponta o ponteiro do mouse em um boto da barra de ferramentas. Uma dica de ferramenta uma janela pop-up pequena que descreve resumidamente o boto ou finalidade do menu. Para exibir as dicas de ferramentas, a ShowToolTips propriedade deve ser definida para true.

Visual C# Consolidado

800

Observao Determinados aplicativos apresentam controles muito semelhantes barra de ferramentas que tm a capacidade de " flutuar " acima a janela do aplicativo e ser reposicionada. O controle Windows Forms ToolBar no podem fazer essas aes. Quando a Aparncia propriedade definida para Normal, os botes da barra de ferramentas aparecem elevado e tridimensional. Voc pode definir a Appearance Propriedade da barra de ferramentas para Flat para dar a barra de ferramentas e seus botes uma aparncia plana. Quando o ponteiro do mouse se move sobre um boto plano, aparncia do boto muda para tridimensional. Botes da barra de ferramentas podem ser dividida em grupos lgicos, usando separadores. Um separador um boto da barra de ferramentas com a Estilo propriedade definida como Separador. Ele exibido como espao vazio na barra de ferramentas. Quando tiver uma aparncia plana, barra de ferramentas separadores boto aparecem como linhas em vez de espaos entre os botes. O ToolBar controle permite que voc para criar barras de ferramentas, adicionando Button objetos a uma Buttons coleo. Voc pode usar o editor coleo para adicionar botes a um ToolBar controle; cada Button objeto deve ter texto ou uma imagem atribuda, embora voc pode atribuir ambos. A imagem fornecida por um componente Associado ImageList. Do Adicionar em tempo de execuo, voc pode adicionar ou remover botes usem o ToolBarButtonCollection e Remover mtodos. Para programar os botes de usar o ToolBar, a Boto propriedade da classe ToolBarButtonClickEventArgs para determinar qual boto foi clicado. Adicione cdigo aos ButtonClick Eventos a ToolBar,

Como adicionar botes a um controle ToolBar usando o criador:


Observao O ToolStrip controle substitui e adiciona funcionalidade para o ToolBar controle; no entanto, o ToolBar controle foi mantida para compatibilidade com verses anteriores e uso futuro, se voc escolher. Uma parte integral do controle ToolBar os botes voc adicionar a ela. Esses pode ser usado para fornecer acesso fcil aos comandos de menu ou, como alternativa, eles podem ser colocadas em outra rea da interface do usurio do seu aplicativo para expor comandos para os usurios que no esto disponveis na estrutura menu. O procedimento a seguir requer um Windows Application projeto com um formulrio contendo um ToolBar controle.Para obter informaes sobre como configurar esse projeto, consulte Como: Criar um projeto de aplicativos Windows e Como adicionar controles ao Windows Forms:. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Para adicionar botes em tempo de criao 1. Selecione o ToolBar controle.

Visual C# Consolidado

801

2. ( 3. 4.

Na janela Properties, clique na Buttons propriedade para selecion-lo e clique no Ellipsis. ) boto para abrir o ToolBarButton Collection Editor Uso e Remove botes para adicionar e remover botes do controle ToolBar. o Add

Configurar as propriedades dos botes individuais na janela Properties que aparece no painel no lado direito do editor. A tabela a seguir mostra algumas propriedades importantes a considerar. Propriedade Descrio

DropDownMenu Define o menu exibido em no boto da barra de ferramentas drop-down. Defina a DropDownButton propriedade do boto Style Barra de ferramentas. Essa propriedade tem uma instncia da classe ContextMenu como uma referncia. PartialPush Define se um boto da barra de ferramentas Estilo toggle- parcialmente pressionado. Defina a ToggleButton propriedade do boto Style Barra de ferramentas. Define se um boto da barra de ferramentas Estilo toggle-est atualmente no estado pushed. Propriedade do boto Style Barra de ferramentas deve ser definida para ToggleButton ou PushButton.. ou PushButton Define o estilo do boto da barra de ferramentas. Deve ser um dos valores na enumerao ToolBarButtonStyle. A seqncia de texto exibido pelo boto. O texto que aparece como uma dica de ferramenta para o boto.

Pushed

Style Text ToolTipText 5.

Clique OK para fechar a caixa de dilogo e criar os painis voc especificou.

Como adicionar botes a um controle ToolBar:


Observao O ToolStrip controle substitui e adiciona funcionalidade para o ToolBar controle; no entanto, o ToolBar controle foi mantido para compatibilidade com verses anteriores e uso futuro, se voc escolher. Uma parte integral do ToolBar controle os botes voc adicionar a ela. Esses podem ser usados para fornecer acesso fcil aos comandos de menu ou, como alternativa, que pode ser colocada em outra rea da interface de usurio de seu aplicativo para expor comandos para os usurios que no esto disponveis na estrutura do menu. Os exemplos abaixo suponha que um ToolBar controle foi adicionado a um formulrio do Windows (Form1). Para adicionar botes programaticamente 1. 2. Em um procedimento, Criar botes da barra de ferramentas, adicionando-os para a System.Windows.Forms.ToolBar.Buttons coleo. Especificar configuraes de propriedades para um boto individual, passando de ndice do boto via a Buttons propriedade. O exemplo a seguir assume um formulrio com um ToolBar controle j adicionado. Observao A System.Windows.Forms.ToolBar.Buttons coleo uma coleo base zero, para cdigo

Visual C# Consolidado

802

deve prosseguir adequadamente. C#


public void CreateToolBarButtons() { // Create buttons and set text property. toolBar1.Buttons.Add("One"); toolBar1.Buttons.Add("Two"); toolBar1.Buttons.Add("Three"); toolBar1.Buttons.Add("Four"); // Set properties of StatusBar panels. // Set Style property. toolBar1.Buttons[0].Style = ToolBarButtonStyle.PushButton; toolBar1.Buttons[1].Style = ToolBarButtonStyle.Separator; toolBar1.Buttons[2].Style = ToolBarButtonStyle.ToggleButton; toolBar1.Buttons[3].Style = ToolBarButtonStyle.DropDownButton; // Set the ToggleButton's PartialPush property. toolBar1.Buttons[2].PartialPush = true; // Instantiate a ContextMenu component and menu items. // Set the DropDownButton's DropDownMenu property to // the context menu. ContextMenu cm = new ContextMenu(); MenuItem miOne = new MenuItem("One"); MenuItem miTwo = new MenuItem("Two"); MenuItem miThree = new MenuItem("Three"); cm.MenuItems.Add(miOne); cm.MenuItems.Add(miTwo); cm.MenuItems.Add(miThree); toolBar1.Buttons[3].DropDownMenu = cm; // Set the PushButton's Pushed property. toolBar1.Buttons[0].Pushed = true; // Set the ToolTipText property of 1 of the buttons. toolBar1.Buttons[1].ToolTipText = "Button 2"; }

Como definir um cone para um boto toolbar usando o criador:


Observao O ToolStrip controle substitui e adiciona funcionalidade para o ToolBar controle; no entanto, o ToolBar controle foi mantida para compatibilidade com verses anteriores e uso futuro, se voc escolher. Botes ToolBar so capazes de exibir cones dentro deles para fcil identificao pelos usurios. Isso conseguido atravs adicionando imagens para o ImageList componente e associando-lo com o ToolBar controle. O procedimento a seguir requer um Windows Application projeto com um formulrio contendo um ToolBar controle e um ImageList componente. Para obter informaes sobre como configurar esse projeto, consulte Como: Criar um projeto de aplicativos Windows e Como adicionar controles ao Windows Forms:. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Para definir um cone para um boto da barra de ferramentas em tempo de criao 1. 2. 3. 4. Adicionar imagens para o ImageList Componente. Para obter mais informaes, consulte Como adicionar ou remover imagens ImageList com o designer:. Selecione o ToolBar controle no formulrio. Na janela Properties, defina a ToolBar propriedade controle ImageList para o ImageList Componente. A elipse a ToolBar propriedade do controle Buttons para selecion-lo, clique no ToolBarButton Collection Editor. ( ) boto para abrir

Visual C# Consolidado

803

5. 6.

Use o Add boto para adicionar botes para o ToolBar controle. Na janela Properties que aparece no painel no lado direito do conjunto ToolBarButton Collection Editor, a ImageIndex propriedade de cada barra de ferramentas boto para um dos valores na lista, que desenhado entre as imagens adicionadas ao ImageList componente.

Como definir um cone para um boto toolbar:


Observao O ToolStrip controle substitui e adiciona funcionalidade para o ToolBar controle; no entanto, o ToolBar controle foi mantido para compatibilidade com verses anteriores e uso futuro, se voc escolher. Botes ToolBar so capaz de exibir cones dentro deles para facilitar a identificao pelos usurios. Isso conseguido atravs de adicionando imagens para o Componente ImageList (Windows Forms) componente e ento associar o ImageList componente ao ToolBar controle. Para definir um cone para um boto da barra de ferramentas programaticamente 1. 2. 3. Em um procedimento, instanciar um ImageList componente e um ToolBar controle. No mesmo procedimento, atribuir uma imagem para o ImageList Componente. No mesmo procedimento, atribuir o ImageList controle para o ToolBar controle e atribuir a ImageIndex propriedade dos botes da barra de ferramentas individuais. No exemplo de cdigo a seguir, o caminho definido para o local da imagem a My Documents pasta. Isso feito, porque voc pode assumir que a maioria dos computadores que executam o sistema operacional Windows inclua este diretrio. Isso tambm permite que usurios com nveis de acesso sistema mnimo para executar o aplicativo com segurana. O exemplo a seguir assume um formulrio com um PictureBox controle j adicionado. Seguindo as etapas acima, voc deve ter escrito cdigo semelhante ao que exibido abaixo. C#
public void InitializeMyToolBar() { // Instantiate an ImageList component and a ToolBar control. ToolBar toolBar1 = new ToolBar(); ImageList imageList1 = new ImageList(); // Assign an image to the ImageList component. // You should replace the bold image // in the sample below with an icon of your own choosing. // Note the escape character used (@) when specifying the path. Image myImage = Image.FromFile (System.Environment.GetFolderPath (System.Environment.SpecialFolder.Personal) + @"\Image.gif"); imageList1.Images.Add(myImage); // Create a ToolBarButton. ToolBarButton toolBarButton1 = new ToolBarButton(); // Add the ToolBarButton to the ToolBar. toolBar1.Buttons.Add(toolBarButton1); // Assign an ImageList to the ToolBar. toolBar1.ImageList = imageList1; // Assign ImageIndex property of the ToolBarButton. toolBarButton1.ImageIndex = 0; }

HOW TO: eventos menu do disparador para botes da barra de ferramentas


Observao O ToolStrip controle substitui e adiciona funcionalidade para o ToolBar controle; no entanto, o ToolBar controle foi mantido para compatibilidade com verses anteriores e uso futuro, se voc escolher.

Visual C# Consolidado

804

Se o formulrio Windows recursos um ToolBar controle com botes da barra de ferramentas, ser desejar saber qual boto o usurio clicar. No evento ButtonClick do controle ToolBar, voc pode avaliar a Boto propriedade da classe ToolBarButtonClickEventArgs. No exemplo abaixo, uma caixa de mensagem mostrada, indicando qual boto foi clicado. Para obter detalhes, consulte Classe MessageBox. O exemplo a seguir supe que tem um ToolBar controle foi adicionada a um formulrio do Windows. Para manipular o evento Click em uma barra de ferramentas 1. Em um procedimento, adicionar botes de barras de ferramentas para o ToolBar controle. C#
public void ToolBarConfig() { toolBar1.Buttons.Add(new ToolBarButton("One")); toolBar1.Buttons.Add(new ToolBarButton("Two")); toolBar1.Buttons.Add(new ToolBarButton("Three")); toolBar1.ButtonClick += new ToolBarButtonClickEventHandler(this.toolBar1_ButtonClick); }

2.

Adicionar um manipulador de eventos para o ToolBar evento do controle ButtonClick. Use um caso Alternar instruo e a ToolBarButtonClickEventArgs classe para determinar o boto da barra de ferramentas que foi clicado. Com base nisso, mostrar uma caixa mensagem apropriada. Observao Uma caixa de mensagem est sendo usada exclusivamente como um espao reservado, neste exemplo. Vontade para adicionar outro cdigo seja executado quando os botes da barra de ferramentas so clicados.

C#
protected void toolBar1_ButtonClick(object sender, ToolBarButtonClickEventArgs e) { // Evaluate the Button property of the ToolBarButtonClickEventArgs // to determine which button was clicked. switch (toolBar1.Buttons.IndexOf(e.Button)) { case 0 : MessageBox.Show("First toolbar button clicked"); break; case 1 : MessageBox.Show("Second toolbar button clicked"); break; case 2 : MessageBox.Show("Third toolbar button clicked"); break; } }

Visual C# Consolidado

805

Pginas da Web e Servios da Web (Como Fazer em C#)


Esta pgina faz referncia a ajuda sobre tarefas de aplicativos da Web amplamente executadas. Para ver outras categorias de tarefas populares abordadas na ajuda, consulte Como fazer em C#.

O que h de novo no desenvolvimento para Web no Visual Studio


O Microsoft Visual Studio 2005 inclui a ferramenta de desenvolvimento para Web, Visual Web Developer, que um conjunto de ferramentas e utilitrios para criao de sites da Web ASP.NET verso 2.0. O Visual Web Developer representa uma melhoria evolutiva no suporte para a criao de sites Web. O Visual Web Developer continua trazendo os benefcios de produtividade do ambiente de desenvolvimento integrado (IDE) ao apresentar uma enorme gama de melhorias. Os aprimoramentos principais para esta verso do Visual Web Developer incluem o seguinte:

Suporte ao ASP.NET 2.0. O Visual Web Developer oferece suporte aos novos recursos do ASP.NET 2.0, incluindo um conjunto de novos controles que so introduzidos no ASP.NET 2.0. Alm disso, o Visual Web Developer adota intimamente recursos nativos do ASP.NET 2.0 e no adiciona recursos especficos do designer. Por exemplo, o Visual Web Developer no incorpora marcas especficas do designer em suas pginas ASP.NET 2.0.

Opes de projetos e implantaes mais flexveis. O Visual Web Developer permite que voc crie aplicativos tradicionais do Servio de Informaes da Internet da Microsoft (IIS) na raiz IIS em computadores locais e remotos, e tambm oferece suporte a razes virtuais, abertura de sites da Web usando File Transfer Protocol (FTP) e uso de arquivos autnomos que residam fora um projeto. O resultado final que substancialmente mais fcil criar e implantar aplicativos ASP.NET 2.0.

Modelo code-behind aprimorado. O Visual Web Developer pode criar pginas usando qualquer modelo code-behind novo ou incluindo cdigo na pgina ASP.NET (o arquivo .aspx).

Recursos aprimorados de programao. Muitas tarefas bsicas foram bastante simplificadas. Por exemplo, voc pode criar uma pgina com dados vinculados qualquer que seja a codificao. Os novos controles do ASP.NET 2.0 adicionam funcionalidades substanciais que requereriam que voc escrevesse seu prprio cdigo. O Microsoft IntelliSense e tecnologias relacionadas foram estendidos para trabalhar praticamente em todo lugar.

As sees a seguir fornecem um resumo de alto nvel das alteraes no Visual Web Developer.

Web Sites Projetos Modelo de Compilao Dinmica Edio Programao

Visual C# Consolidado

806

Modelo Code-Behind Melhorado Controles Controle e Ligao de Dados Converso de Sites Web Existentes

Para informaes sobre novos recursos no ASP.NET 2.0, consulte O que h de novo no ASP.NET Web Sites e Projetos O Visual Web Developer apresenta uma abordagem flexvel para a criao de web sites (tambm chamados projetos e aplicaes web em verses anteriores do Visual Web Developer e Web Page Designer, respectivamente). Web sites no Visual Web Developer no so, necessariamente, vinculados ao IIS nem a pastas fsicas da raiz do IIS. Agora voc pode criar os seguintes tipos de web sites:

Sistema de Arquivos. Voc pode manter todos os arquivos de um site em uma pasta simples. O sistema de arquivos de web sites no dependem do IIS. Para obter detalhes, consulte Passo-a-passo: Criando uma pgina da web bsica no Visual Web Developer.

IIS Local. Como nas verses anteriores do Visual Studio, voc pode criar aplicativos do IIS que podem residir na raiz local do IIS ou em um diretrio virtual. Voc tambm pode criar pastas virtuais. Para obter detalhes, consulte Passo-a-passo: Acesso a Dados Bsico em Pginas da Web.

Remoto. Voc pode criar aplicativos residentes em servidores remotos que oferecem suporte ao FrontPage 2002 Server Extensions da Microsoft. Este o modelo que foi usado em verses anteriores do Visual Web Developer e continua recebendo suporte nesta verso.

FTP. Voc pode abrir web sites atravs de FTP. Para obter detalhes, consulte Passo-a-passo: Edio de Web Sites com FTP no Visual Web Developer.

Servidor de Desenvolvimento do ASP.NET A ferramenta de desenvolvimento Web do Visual Web Developer inclui um servidor de aplicao de teste simplificado, o ASP.NET Development Server, que voc pode usar para testar sistemas de arquivos de web sites, sem precisar utilizar o IIS. Para mais informaes, consulte Servidores Web no Visual Web Developer. Projetos Na nova verso do Visual Web Developer, web sites no dependem de arquivos de projeto e de soluo. Voc pode adicionar arquivos a um web site no Visual Web Developer, ou usar o Microsoft Windows Explorer, e os arquivos so automaticamente parte do web site. O Visual Web Developer ainda cria arquivos de projeto e de soluo para armazenar uma pequena quantidade de informaes especficas de projeto, como as configuraes IDE. Boa parte das informaes que anteriormente eram armazenadas em arquivos de projeto, agora so armazenadas no arquivo Web.config, como configuraes padro do ASP.NET 2.0, ou no so mais necessrias. O arquivo de projeto no armazena informao necessria para executar o aplicativo.

Visual C# Consolidado

807

Trabalhar sem um modelo de projeto no somente torna possvel adicionar, editar e remover arquivos de fora do Visual Web Developer, como tambm torna mais fcil a mais de um desenvolvedor trabalhar juntos para criar um site. Mais de um desenvolvedor pode adicionar ou remover arquivos de um web site sem exigir acesso a um arquivo centralizado de projeto, que precisa ser atualizado com as informaes do arquivo. Alm disso, mais fcil manter arquivos do web site em um sistema controlado por origem, como o sistema de controle de verso do Microsoft Visual SourceSafe, porque os desenvolvedores no tm, exclusivamente, que fazer o check-out em um arquivo de projeto para adicionar arquivos ao web site. Modelo de Compilao Dinmica No Visual Web Developer, web sites no usam mais o modelo de compilao que foi usado em verses anteriores, no qual o cdigo executvel do projeto inteiro era compilado em um nico assembly. Em vez disso, como padro, a nova verso usa o modelo de compilao dinmica que nativo para o ASP.NET 2.0. Trabalhar com web sites que no produzem um assembly executvel como sada tem vrias vantagens:

Voc pode testar web sites que contm pginas ainda em desenvolvimento pginas que contm erros de compilao no impedem que outras pginas do web site sejam executadas. Para desenvolvimento em web sites grandes, no necessrio que a aplicao inteira seja recompilada sempre que uma alterao feita a uma pgina nica ou componente. Quando um desenvolvedor altera uma nica pgina, somente essa pgina recompilada quando ela solicitada em seguida. Diferentes desenvolvedores podem fazer edies em diferentes pginas ao mesmo tempo, sem interferir nas alteraes do outro, como pode acontecer quando se compila o projeto para um assembly nico no Microsoft Visual Studio .NET 2003.

Quando voc testa um web site, ele ainda compilado (built). Entretanto, a etapa de compilao usada como verificao, tal que que todas as pginas e suas dependncias possam ser compiladas; a sada do processo de compilao no usada como base para executar o web site. Essa etapa de compilao mais abrangente do que era em verses anteriores porque ele valida no apenas a compilao do cdigo como tambm, a localizao de erros na sintaxe de marcao e no arquivo Web.config. Publicao de Web Sites Por alguns desenvolvedores no optarem pela implantao de cdigo fonte nos seus web sites, a ferramenta de desenvolvimento da Web, o Visual Web Developer, oferece a opo de prcompilao e implantao de um web site usando o comando Build Web Site. O comando Build Web Site executa o compilador sobre o site inteiro (no apenas nos arquivos de cdigo), e produz um layout de web site que voc pode implantar em um servidor de produo. O layout inclui assemblies para pginas individuais, que incluem o cdigo e a marcao para a pgina (ou seja, os arquivos .aspx so compilados tambm). Observao Esta propriedade no est disponvel no Visual Web Developer Express Edition. O benefcio principal da pr-compilao que ela permite que voc implante apenas cdigo executvel, colocando uma medida de proteo em sua propriedade intelectual. Alm disso, a prcompilao localiza qualquer erro em tempo de compilao, em pginas ou cdigo dependente.

Visual C# Consolidado

808

Finalmente, a pr-compilao melhora o desempenho e reduz o tempo que leva para as pginas de seu web site processarem na primeira vez. Edio de pginas O Visual Web Developer oferece os seguintes aperfeioamentos para criar e editar pginas da web:

Suporte a novos recursos de pgina. O Web Page Designer do Visual Web Developer apresenta suporte WYSIWYG para os novos elementos de pgina do ASP.NET 2.0, como em pginas mestras. Para obter detalhes, consulte Viso Geral Sobre Pginas Mestras do ASP.NET e Passo-a-passo: Criando e Usando Pginas-Mestre do ASP.NET no Visual Web Developer.

Preservao do cdigo fonte. O Visual Web Developer mantm a formatao HTML da sua pgina quando voc alterna entre o modo Design e o Source, e quando voc salva os arquivos.

Gerao e Validao de HTML Avanadas. O Visual Web Developer oferece mais opes para gerar e validar o HTML da sua pgina. Como padro, o Web Page Designer cria uma marcao que compatvel com XHTML 1.1, e novos esquemas incluem suporte para diversas variaes de XHTML. Voc pode definir opes para determinar como, estritamente, o Visual Web Developer deve validar os elementos em sua pgina e HTML. Alm disso, o Visual Web Developer fornece informaes de erro em ToolTips.

Funcionalidade da ao Arrastar-e-Soltar no modo Source. Voc pode arrastar controles da Toolbox (caixa de ferramentas) enquanto estiver no modo Source.

Programao O Visual Web Developer inclui uma srie de aperfeioamentos para o editor de cdigos que o ajudam a programar mais produtivamente. Ele inclui o seguinte:

Tecnologia Microsoft IntelliSense. A concluso de instruo est em praticamente todos os locais quando voc edita pginas da Web. A tecnologia IntelliSense ajuda a criar cdigo code-behind e pginas de arquivo nico, tags de marcao, diretivas de pginas e assim por diante.

Evento de listas suspensas. Voc pode criar manipuladores de evento no modo Fonte usando eventos de lista suspensa, como voc poderia fazer anteriormente somente no modo Cdigo. A janela Properties agora permite que voc crie manipuladores de eventos para o Visual Basic e C#.

Suporte a pginas de arquivo nico. O Editor de cdigos agora fornece suporte equivalente para code-behind e pginas de arquivo nico em ASP.NET 2.0. (Para informaes sobre alteraes para o modelo code-behind, consulte Modelo Code-Behind Aperfeioado.) Ambos os modelos de cdigo suportam colorao de sintaxe, tecnologia IntelliSense e assim por diante.

Cdigo compartilhado. Classes para as quais o cdigo fonte est na pasta App_Code de sua aplicao da web so automaticamente referenciadas; se voc tiver compilado componentes, voc pode inseri-los na pasta Bin para que o Visual Web Developer os referencie automaticamente. A funcionalidade IntelliSense obtm informaes sobre qualquer componente que estiver instalada na pasta

Visual C# Consolidado

809

App_Code ou Bin, de sua aplicao. Para obter detalhes, consulte Passo-a-passo: Usando Cdigo Compartilhado em Web Sites no Visual Web Developer.

Depurao. Voc tem facilidades completas de depurao para Web Sites locais, incluindo arquivos de sistema. A depurao menos complexa e mais rpida do que nas verses anteriores. Para obter detalhes, consulte Passo-a-passo: Depurao de Pginas da Web no Visual Web Developer.

Modelo Code-Behind Aperfeioado Uma diferena significativa entre verses anteriores do Visual Web Developer e esta verso est no funcionamento de pginas code-behind. No Microsoft Visual Studio .NET 2002, quando voc cria pgina de Web Forms, o Visual Web Developer cria um arquivo .aspx com uma marcao e um arquivo .vb ou .cs separado (o arquivo code-behind) para o cdigo da pgina. O arquivo codebehind define uma classe completa que derivada da classe Page. O Web Page Designer guarda o arquivo .aspx e o arquivo code-behind na sincronizao. Por exemplo, se voc adicionou um controle de servidor web ao arquivo .aspx, o Web Page Designer criou uma varivel de instncia correspondente no arquivo code-behind para aquele controle. Nesta verso, o modelo code-behind tira proveito de um novo recurso de linguagem, conhecido como classes parciais. O arquivo code-behind para uma pgina no uma definio completa de classe. Em vez disso, ele inclui somente o cdigo do aplicativo que voc precisa, como manipuladores de eventos. A classe parcial code-behind no necessita incluir variveis de instncia; o ASP.NET 2.0 infere as instncias de controle da marcao, no tempo de compilao. Se voc estiver programando em C#, voc no precisa incluir representantes explcitos para vinculao de evento, porque o ASP.NET 2.0 pode deduzi-los dos atributos de evento (por exemplo, onclick) na marcao de controle. No Visual Basic, voc pode adicionar uma clusula Handles para a declarao de um mtodo de evento, como no modelo anterior, para vincular o evento ao manipulador. O novo modelo code-behind oferece uma srie de vantagens sobre o modelo anterior, da seguinte maneira:

Separao verdadeira de cdigo e marcao. Em verses anteriores, a marcao e o cdigo eram armazenados em arquivos separados. Verses anteriores necessitavam manter os arquivos em sincronizao usando variveis de instncia e representantes de evento. No entanto, no era prtico trabalhar com os arquivos separados. Por exemplo, no era prtico para um desenvolvedor de pgina trabalhar no layout de uma pgina enquanto outro desenvolvedor trabalhava no cdigo. Nesta verso, isso muito mais prtico.

Menos complexidade na referncia de controles. Conforme observado, o novo modelo code-behind no requer variveis de instncia explcitas na pgina code-behind. Embora verses anteriores gerenciassem variveis de instncia, no a faziam para todos os controles notadamente para controles de usurio ou para alguns elementos HTML que foram declarados como controles. Nesta verso, devido ao fato de nenhuma varivel de instncia ser necessria, todos os controles, incluindo controles de usurio, so referenciados implicitamente.

Menos gerao de cdigo. O novo modelo code-behind no contm praticamente nenhum cdigo gerado alm da prpria definio de classe. No h nenhuma rea reservada no code-behind que o editor possa sobrescrever.

Controles

Visual C# Consolidado

810

O Visual Web Developer oferece suporte aos novos controles ASP.NET 2.0, cujas novas funcionalidades resultam no aumento significativo da produtividade. Alm dos novos controles de hospedagem, o Web Page Designer inclui melhoras para ajud-lo a trabalhar mais facilmente com controles. Destaques incluem o seguinte:

Modelo de edio mais consistente e eficiente. O modelo geral para trabalhar com controles mais consistente entre os controles e permite que voc execute vrias outras aes sem precisar usar a janela Properties ou editar a sintaxe declarativa de um controle.

Exibio visual de controles. O Web Page Designer melhorou o suporte para processamento de controles, por exemplo, os controles de usurio so agora processados visualmente no modo Design.

Edio baseada em tarefa. Quando voc trabalha com controles, eles exibem um menu de marcas inteligentes (um menu flutuante de atalho de tarefas) para o controle atual. Aes tpicas que so oferecidas pela edio baseada em tarefas incluem edio de modelos e configurao de dados vinculados.

Edio de modelo. O Web Page Designer fornece uma interface simplificada e mais intuitiva para criar e editar modelos em controles complexos, como o controle DataList e o GridView.

Edio de Tabela. muito mais fcil agora criar e editar tabelas HTML no Web Page Designer. Para obter detalhes, consulte Passo-a-passo: Editando Tabelas HTML no Visual Web Developer.

Extensibilidade de Controle Agora voc pode estender controles de novas e eficientes maneiras. Como antes, voc pode criar controles de usurio e controles personalizados. Esta verso da ferramenta de desenvolvimento da Web, o Visual Web Developer, fornece suporte aprimorado para controles de usurio, incluindo processamento WYSIWYG no modo Design e janela Properties de suporte. Voc pode estender o comportamento em tempo de execuo dos controles criando adaptadores que definem a sada do controle para um dispositivo especfico ou navegador. Em tempo de execuo, o ASP.NET 2.0 determina o tipo de dispositivo que gerou a solicitao e chama um adaptador de controle para processar a sada apropriada para este dispositivo, para um dado controle. Criando um adaptador para um controle e uma classe especfica de dispositivo, voc pode personalizar a sada para o controle do dispositivo. Adaptadores so especialmente teis para criar processamento personalizado para novos dispositivos. Para mais informaes, consulte Criao de Adaptadores de Controle do Servidor ASP.NET - Uma Introduo. Se voc desenvolver controles comuns, voc ter melhorado o suporte para hospedar seu controle em um Web Page Designer, incluindo o seguinte:

Classes que permitem que voc adicione edio baseada em regio aos controles em tempo de design. Suporte a edio baseada em tarefas, de modo que voc possa definir verbos (tarefas) que so expostos para o controle usando atalhos de menu no Web Page Designer. Servios de edio de modelos que simplificam a adio de suporte para modelos nos controles. Controles podem se beneficiar dos servios baseados em ferramentas para melhor interagir com o ambiente de hospedagem. Por exemplo, controles tem acesso diretiva de pgina, ao sistema do projeto e ao documento atual.

Visual C# Consolidado

811

Controles de Dados e Vinculao de Dados Trabalhar com dados uma parte importante em muitas pginas web em ASP.NET 2.0, e o Visual Web Developer inclui vrios aprimoramentos para facilitar a implementao e gerenciamento do acesso a dados. O objetivo geral para a vinculao de dados no ASP.NET 2.0 tornar possvel a realizao de uma variedade de cenrios de vinculao de dados, sem precisar gravar qualquer cdigo. Esta verso suporta essa meta e a estende oferecendo assistentes que o ajudam a configurar a vinculao de dados e criao de componentes de dados. Ligao de Dados com Controles de Fonte de Dados O modelo para vincular controles de pgina a fontes de dados foi aperfeioado consideravelmente. O modelo de vinculao de dados do Microsoft Visual Studio .NET 2002 necessitava que voc adicionasse componentes de dados como objetos e conexes dataset na pgina. Em seguida, voc precisava escrever o cdigo para gerenciar dados vinculando a controles de dados, como o controle DataList e o DataGrid. Para simplificar vinculao de dados, o ASP.NET 2.0 introduz controles de fonte de dados. Controles de fonte de dados fornecem um nico objeto no qual voc pode, declarativamente, definir o seguinte:

Informaes de conexo. Consultas (um instruo SQL, nome de parmetro armazenado ou nomes dos mtodos para chamar em um objeto). Parmetros Voc pode definir parmetros declarativamente e especificar que eles obtenham seus valores de um controle na pgina, de uma seqncia de caracteres de consulta, de variveis de sesso ou de outras fontes. As opes de comportamento (dependendo do controle da fonte de dados), como paginao e cache.

Em geral, voc no precisa trabalhar diretamente com os objetos que so usados para gerenciar acesso a dados, como datasets ou leitores de dados. Controles de fonte de dados criam componentes de dados de forma transparente. Voc no trabalha com esses componentes, mas no precisa estar ciente deles quando desejar usar um recurso, como o de paginao, que depende da escolha entre um dataset e um leitor de dados. O ASP.NET 2.0 fornece controles de fonte de dados para diferentes tipos de armazenamentos de dados, incluindo SQL (para OLE DB e bancos de dados Open Database Connectivity [ODBC]), arquivos XML e objetos comerciais. Todos os controles de fonte de dados expem a mesma interface para controles de dados na pgina, como o controle DataList e o Repeater, e o novo controle GridView pode ligar o mesmo caminho a qualquer controle de fonte de dados, apesar do armazenamento de dados subjacente que eles representam, e depois mostra os dados na pgina. O resultado que voc pode usar a matriz completa dos controles de dados do ASP.NET 2.0 para trabalhar com uma ampla variedade de fontes de dados. Para ajud-lo a criar e configurar controles de fonte dados, a ferramenta de desenvolvimento da Web, o Visual Web Developer, inclui assistentes que o ajudam a criar conexes, definir consultas ou especificar mtodos para chamar e configurar parmetros. Controles de dados avanados Todos os controles de dados no ASP.NET 2.0 foram aprimorados para trabalhar com controles de fonte de dados. Em vez de apontar um controle em um dataset ou leitor de dados, voc referencia um controle de fonte de dados. Depois, o controle de dados e o controle da fonte de dados

Visual C# Consolidado

812

trabalham juntos para gerenciar, automaticamente, a vinculao de dados, para que na maioria dos casos, voc no precise escrever cdigo para executar a vinculao. Como resultado, voc pode tirar proveito da vinculao de dados automtica, em qualquer controle de vinculao de dados. Alm disso, o ASP.NET 2.0 introduz novos controles de dados que fornecem funcionalidades adicionais. Eles incluem o seguinte:

O controle GridView, que o sucessor do controle DataGrid. O controle GridView automatiza muitos dos recursos do controle DataGrid, para que voc no precise escrever cdigo para edio, classificao ou paginao. Para situaes em que voc desejar personalizar o comportamento do controle, voc pode continuar usando o modelo de objeto que voc estiver familiarizado a partir do controle DataGrid.

O controle DetailsView exibe um registro por vez e permite que voc edite, exclua e insira registros. Voc pode tambm paginar atravs de vrios registros. O controle FormView semelhante ao controle DetailsView, mas permite que voc defina um layout de forma livre para cada registro. O controle FormView como um controle DataList para um registro individual.

Voc pode continuar usando o controle DataGrid, embora ele seja substitudo pelo controle GridView. Pginas existentes que usam o controle DataGrid trabalham como so. Como em outros controles de dados, o controle DataGrid foi aprimorado para interagir com controles de fonte de dados. Vinculao bidirecional de dados A combinao de controles de fonte de dados, parmetros declarativos e controles de dados avanados fornece a capacidade para criar vinculao bidirecional de dados, sem precisar escrever cdigo. Nos controles de fonte de dados, voc pode definir consultas ou nomes de mtodos a serem usados para atualizaes. Controles de dados, como o controle GridView, DetailsView e FormView, suportam modos de edio e excluso (e para alguns controles, modo de insero) que automaticamente podem interagir com os controles de fonte de dados, para gravar dados na fonte de dados. Armazenamento de seqncia de caracteres de conexo Para ajudar a tornar seus sites mais manutenveis e mais seguros, voc pode manter as seqncias de caracteres de conexo no arquivo Web.config em uma nova seo, que foi desenvolvida especificamente para armazenamento de seqncia de caracteres de conexo. Quando utilizar a ferramenta de desenvolvimento da Web, o Visual Web Developer, para criar ou configurar controles de fonte de dados, voc pode especificar que a seqncia de caracteres de conexo seja armazenada no arquivo Web.config. Se voc alterar as fontes de dados, voc pode facilmente alterar a seqncia de caracteres de conexo em um local, ao invs de ter que atualizar todos os componentes de dados em todas as pginas, com uma nova seqncia de caracteres de conexo. Para segurana adicional, voc pode criptografar a seo de seqncia de caracteres de conexo do arquivo Web.config. Para obter detalhes, consulte Criptografar informaes de configurao usando configurao protegida. Acesso a dados em duas e trs camadas O modelo anterior de vinculao de dados incentivava a criao de solues de dados em duas camadas, na qual as pginas da Web interagiam diretamente com o banco de dados para preencher o dataset e para vincular controles a ele. O novo modelo continua facilitando o trabalho em uma estrutura em duas camadas. Por exemplo, o controle SqlDataSource se conecta

Visual C# Consolidado

813

diretamente a um banco de dados e executa instrues SQL ou procedimentos para ler e gravar dados armazenados. O novo modelo de vinculao de dados tambm torna mais fcil criar uma estrutura em trs camadas na qual o acesso a dados tratado por um objeto corporativo de camada intermediria. O controle ObjectDataSource interage com um objeto corporativo chamando mtodos no objeto para recuperar e atualizar dados. Controles de dados em uma pgina podem se vincular ao controle ObjectDataSource da mesma maneira como eles fazem a quaisquer outros controles de fonte de dados, como o controle SqlDataSource. A ferramenta de desenvolvimento da Web, o Visual Web Developer, inclui um assistente de componente de dados que ajuda a criar um objeto personalizado que contm mtodos para ler e atualizar dados. Como alternativa, voc pode criar seu prprio objeto de camada intermediria que contm mtodos. Enquanto seu objeto personalizado expe os mtodos com as assinaturas apropriadas, voc pode referenci-los de um controle ObjectDataSource. Para obter detalhes, consulte Passo-a-passo: Vinculao de Dados Para Um Objeto Corporativo Personalizado. Compatibilidade com Verses Anteriores para Acesso a Dados A ferramenta de desenvolvimento da Web, o Visual Web Developer, continua oferecendo suporte a pginas que usam o modelo de vinculao de dados de verses anteriores. Pginas que contm datasets e outros componentes executam como faziam antes, e voc pode abrir e editar as pginas no Web Page Designer. O Visual Web Developer no remove os componentes de dados e no converte os componentes para controles de fonte de dados. Observao Componentes de dados, como datasets e conexes de dados, no so mostrados no Web Page Designer do Visual Web Developer. Portanto, voc no pode definir, nem examinar as propriedades usando a janela Properties. Entretanto, voc ainda pode editar o cdigo que usado para instanciar os componentes de dados e definir suas propriedades. Para obter mais informaes, consulte Viso Geral de Controles de Fonte de Dados e Passo-apasso: Acesso Bsico a Dados em Pginas da Web. Convertendo sites da Web existentes O Visual Web Developer, pode converter automaticamente seus projetos existentes para o novo e modernizado layout de site. O processo de converso preserva a funcionalidade de seu aplicativo e as opes de projeto que so aplicadas. Pginas da Web code-behind existentes so convertidas em um novo modelo code-behind que preserva a separao de HTML e cdigo, mas fornece uma estrutura simplificada. Para mais informaes, consulte Converso do Projeto Da Web no Visual Studio.NET. Aps a converso, voc pode usar o Web Page Designer para trabalhar com pginas e controles que foram desenvolvidos em verses anteriores do Visual Web Developer.

Visual C# Consolidado

814

Introduo a pginas da Web do ASP.NET


Pginas da Web do ASP.NET permitem que sejam criados contedos dinmicos para seu site da Web. Com uma pgina de HTML esttico (arquivo .htm ou .html), o servidor atende uma solicitao Web por ler o arquivo e envi-lo como ele para o navegador. Por outro lado, quando algum solicita uma pgina da Web do ASP.NET (arquivo.aspx), a pgina executada como um programa no servidor Web. Enquanto a pgina estiver sendo executada, ele pode executar qualquer tarefa que seu site da Web requerer, inclusive calcular valores, leitura ou gravao de informaes no banco de dados, ou chamada de outros programas. Como sua sada, a pgina dinamicamente produz marcao (elementos em HTML ou outra linguagem de marcao) e envia essa sada dinmica para o navegador. Este tpico fornece uma viso geral sobre as caractersticas fundamentais de como pginas da Web do ASP.NET funcionam em aplicativos da Web. Postbacks e Round Trips Pginas ASP.NET executam como cdigo no servidor. Portanto, para a pgina ser processada, a pgina configurada para enviar para o servidor quando os usurios clicarem em botes (ou opcionalmente, quando os usurios marcarem caixas ou interagir com outros controles da pgina). Cada vez, a pgina enviada de volta a si mesma para que ela possa executar seu cdigo de servidor novamente e depois processar uma nova verso de si prpria para o usurio. O ciclo de processamento para um pgina da Web do ASP.NET : 1. O usurio solicita a pgina. (A pgina solicitada usando um mtodo HTTP GET). A pgina executa pela primeira vez, executando processamentos preliminares se voc tiver programado-a para fazer isso. A pgina dinamicamente processa a marcao para o navegador, que o usurio v como uma pgina da Web semelhante a qualquer outra pgina. O usurio digita informaes ou seleciona a partir das opes disponveis e clica em um boto. (Se os usurios clicarem em um link em vez de um boto, simplesmente a pgina pode ser redirecionada para outra pgina, e no ocorre mais processamento na primeira pgina.) A pgina remetida para o servidor Web. ( O navegador executa um mtodo HTTP POST, que no ASP.NET conhecido como um postback). Especificamente, a pgina remetida de volta a si mesma. Por exemplo, se o usurio que estiver trabalhando com a pgina Default.aspx clicar em um boto na pgina , a pgina a remete de volta para o servidor com um destino de Default.aspx. No servidor Web, a pgina executa novamente. As informaes que o usurio digitou ou selecionou esto disponveis para a pgina. A pgina executa o processamento que voc a tiver programado para fazer. A pgina processa ela mesma de volta para o navegador.

2. 3.

4.

5. 6. 7.

Esse ciclo continua, enquanto o usurio estiver trabalhando na pgina. Cada vez que um boto clicado, a informao na pgina remetida para o servidor Web e a pgina executada novamente. Cada ciclo conhecido como um round trip(processamento). Como o processamento da pgina ocorre no servidor Web, cada ao que pode fazer a pgina requer um round trip para o servidor. Observao

Visual C# Consolidado

815

Uma pgina da Web do ASP.NET pode executar scripts de cliente, o que no requer um round trip para o servidor, e que til para validao de entrada de usurio e para alguns tipos de interface de programao. Para obter mais informaes, consulte Programando pginas da Web do ASP.NET com script de cliente. Postagem cruzada de pginas Em algumas circunstncias, voc pode querer que uma pgina poste para uma pgina diferente, no a si prpria. Isso chamado de da cross-page posting(postagem cruzada de pgina). Por exemplo, voc pode ir criando uma srie de pginas que processam um pedido do cliente. Cada pgina pode enviar para a prxima pgina na seqncia. Para obter mais informaes, consulte Postagem entre Pginas em Pginas da Web do ASP.NET. Vida til da pgina Diferente de formulrios em aplicativos desktop, uma pgina da Web do ASP.NET no inicializada, executa enquanto o usurio trabalha com o formulrio, e depois descarrega somente quando o usurio clicar um boto Close (fechar). Isso ocorre porque a Web est desconectada inerentemente. Quando um navegador solicita uma pgina de um servidor Web, o navegador e o servidor esto conectados somente durante tempo suficiente para processar a solicitao. Depois que o servidor Web tenha processado uma pgina para o navegador, a conexo encerrada. Se o navegador fizer outra solicitao para o mesmo servidor Web, mesmo para a mesma pgina, a solicitao ser processada como uma nova solicitao. A natureza desconectada da Web determina a maneira que uma pgina ASP.NET executa. Quando um usurio solicita uma pgina da Web do ASP.NET, uma nova instncia da pgina criada. A pgina executa seu processamento, processa a marcao para o navegador, e descartada. Se o usurio clica em um boto para executar uma nova postagem, uma nova instncia da pgina criada, a pgina executa seu processamento, e novamente ser descartada. Assim, cada nova postagem e round trip resulta em uma nova instncia da pgina. Para obter mais informaes, consulte Pginas da Web ASP.NET. Preservando o estado da pgina No protocolo normal HTTP, a nica informao que o servidor tem sobre uma pgina a informao que o usurio especificou usando controles na pgina, porque o navegador envia somente essas informaes para o servidor quando a pgina postada. Outras informaes, tais como valores de varivel e definies de propriedade, so descartadas. ASP.NET ajuda a preservar outras informaes de pgina das seguintes maneiras:

ASP.NET salva as configuraes de controle (propriedades) entre round trips, que chamada de salvar o estado de controle. O ASP.NET fornece recursos de gerenciamento de estado para que voc possa salvar suas prprias variveis e informaes especficas do aplicativo ou informaes especficas de sesso entre as round trips. ASP.NET pode detectar quando uma pgina solicitada pela primeira vez e quando a pgina enviada, o que lhe permite programar adequadamente. Por exemplo, voc talvez queira ler informaes de um banco de dados na primeira vez que uma pgina exibida, mas no em cada novo postback. Observao

Visual C# Consolidado

816

O servidor pode ser configurado para guardar informaes de pgina para otimizar as pginas, mas para fins de programao de aplicativos, melhor pensar em pginas como sendo descartadas assim que o servidor terminar seu processamento. Para obter mais informaes, consulte Viso Geral sobre o Gerenciamento de Estado do ASP.NET. Programando pginas da Web ASP.NET Voc pode criar o cdigo de servidor para suas pginas da Web ASP.NET usando uma variedade de idiomas no.NET Framework, incluindo Visual Basic, C#, e J#. As pginas da Web ASP.NET podem conter scripts de cliente que executam dentro do navegador. Algumas funes ASP.NET geram scripts de cliente e inserem-nos na pgina. Nesse caso, ASP.NET sempre gera ECMAScript (JavaScript) para melhor funcionalidade de navegadores cruzados. Alm disso, voc pode adicionar seus prprios scripts de cliente para funcionalidade personalizada. Se fizer isso, voc pode utilizar qualquer linguagem de script de cliente que seja compatvel com os navegadores que voc estiver como objetivo. Controles de servidor Como qualquer pgina da Web, as pginas da Web ASP.NET podem conter texto esttico. Com mais freqncia, entretanto, voc adicionar controles para a pgina, como caixas de texto, caixas de seleo e botes. Esses controles permitem ao usurio interagir com a pgina e enviar informaes para o servidor quando a pgina remetida novamente. O ASP.NET fornece um conjunto de controles conhecido como controles do servidor Web. Controles do servidor ASP.NET podem ser semelhante aos elementos de formulrios HTML correspondentes. Por exemplo, o controle ASP.NET TextBox semelhante a um marcador HTML <input type="text">. Entretanto, os controles do servidor ASP.NET oferecem uma experincia de programao mais enriquecedora de elementos HTML. H tambm controles do servidor ASP.NET para um intervalo muito maior de funes que o que oferecido pelos elementos HTML. Entre os controles do servidor que podem ser usados em um pgina da Web do ASP.NET est um controle de calendrio, controles com dados vinculados que exibem listas ou grades, um controle de logon para adicionar segurana a seu site, e muito mais. Para obter mais informaes, consulte Controles de servidores Web do ASP.NET. Pgina e eventos de controle do servidor Um pgina da Web do ASP.NET e os controles dele oferecem suporte a um modelo de evento como os encontrados em Windows Forms. Por exemplo, quando os usurios clicar em um controle Button em um pgina da Web do ASP.NET, a pgina remetida de volta para o servidor, recriada, e um evento de clique criado. Voc pode adicionar cdigo para a pgina que responde a este evento de clique. A prpria pgina inicia eventos de ciclos de vida quando inicializada, como os eventos Page_Init e Page_Load, que oferecem a oportunidade de executar o cdigo quando a pgina inicializada (Lembre-se de que a pgina criada e reinicializada em cada round trip). Controles individuais podem iniciar seus prprios eventos. Controles de boto iniciam um evento Click, controles de boto de rdio e caixas de seleo iniciam um mtodo CheckedChanged, e caixa de listagem e controles de lista drop-down iniciam um evento SelectedIndexChanged. Alguns controles, tais como o controle Calendar, disparam eventos que so mais abstratos do que simples eventos de clique. Por exemplo, o controle Calendar dispara um evento VisibleMonthChanged quando usurios navegarem para um ms diferente.

Visual C# Consolidado

817

A maioria dos controles servidor ASP.NET suportam somente alguns dos eventos que voc pode tratar no cdigo servidor. Para processar um evento, a pgina deve executar uma round trip para que a escolha do usurio possa ser enviada para a pgina para processamento. Os controles do servidor no expe eventos de alta freqncia como onmouseover, porque sempre que esse evento iniciado, outra round trip para o servidor deve ocorrer, o que iria afetar consideravelmente o tempo de resposta na pgina. Entretanto, voc pode configurar controles de servidor ASP.NET para iniciar eventos do lado do cliente, como onmouseover. Nesse caso, os controles no iro ser remetidos novamente para o servidor, e voc criar um script de cliente para responder a eventos. Para obter mais informaes sobre como criar e usar eventos e manipuladores de eventos, consulte Tratamento de Evento de servidor em pginas da Web ASP.NET. Compatibilidade do navegador Como o processamento da pgina da Web do ASP.NET ocorre no servidor Web, pginas da Web ASP.NET so compatveis com qualquer navegador ou dispositivo mvel. Uma pgina da Web processa automatica e corretamente a marcao (XHTML ou outra linguagem de marcao) compatvel com o navegador para recursos, como estilos e layout. Como alternativa, voc pode criar pginas da Web com controles projetados especificamente para processar a sada para dispositivos especficos, como telefones celulares. Para obter mais informaes, consulte Criando Aplicativos da Web ASP.NET Mobile.

Documentos e dados XML


As classes XML na namespace System.Xml fornecem um conjunto abrangente e integrado de classes, permitindo-lhe trabalhar com documentos XML e dados. As classes XML do suporte a leitura e escrita XML, edio de dados XML em memria, validao de dados, e transformao XSLT.

O que h de novo no System.Xml


Os seguintes recursos System.Xml so novo in .NET Framework verso 2.0. Novo modelo para processamento de dados XML A verso 2.0 inclui um novo modelo para processamento de dados XML na memria. A XPathNavigator classe foi atualizada para incluir editar recursos. Pode ser usado para modificar dados armazenados na classe XmlDocument. Para obter mais informaes consulte Processo dados XML usando o modelo de dados XPath. Novo processador XSLT Tem a arquitetura XSLT foi redefinida na verso .NET Framework 2.0. A XslCompiledTransform classe o novo processador XSLT. A XslCompiledTransform classe inclui muitos aprimoramentos de desempenho e otimizaes que que facilitam muito mais rpida que a classe obsoleta XslTransform. Para obter mais informaes consulte Transformaes em XSLT. Suporte a tipo

Visual C# Consolidado

818

O XmlWriterXmlReader,. e XPathNavigator Classes tiver sido atualizadas para incluir suporte tipo Novos mtodos nessas classes Ativar voc retornar um valor de n como um objeto Runtime de idioma comum. Para obter mais informaes consulte Suporte tipo nas classes System.Xml. Novo modelo para criao XmlReader e objetos XmlWriter Do XmlReader os mtodos estticos Create Em e XmlWriter classes so a prtica recomendada para criar XmlReader e XmlWriter objetos. Do XmlReader o Create mtodo permite que voc para especificar o conjunto de recursos que voc deseja ou XmlWriter Objeto para oferecer suporte. Consulte Criando leitores XML e Criando Writers XML Para obter mais informaes. Inference do esquema A classe classe XmlSchemaInference permite-lhe inferir um esquema de idioma (XSD) de definio esquema XML da estrutura de um documento XML.

Migrando de verso 1.1 das classes XML


O Microsoft .NET Framework verso 2.0 inclui vrias atualizaes para as classes XML. Em ordem para tirar total proveito dos novos recursos, talvez precise mover o seu cdigo existente para as novas APIs. As sees a seguir descrevem alteraes as APIs existentes que podem exigir que voc para atualizar o cdigo existente. Criao XmlReader Na verso 2.0, XmlReader objetos so criados usando o mtodo esttico Create na classe XmlReader. Um XmlReaderSettings objeto especifica os recursos que voc deseja o criado XmlReader para oferecer suporte. Observao Embora o .NET Framework inclui concreto implementaes da classe XmlReader, como o XmlTextReader, XmlNodeReader.. e as XmlValidatingReader classes, recomendvel que voc cria XmlReader instncias usando o Create mtodo, e as XmlValidatingReader classes, recomendvel que voc cria XmlReader instncias usando o Create mtodo, o XmlTextReader, XmlNodeReader Isso permite que voc para tirar proveito dos todos os novos recursos que tenham sido adicionados para a XmlReader classe.

Verso 1.1
O cdigo a seguir cria um XmlTextReader objeto que ignora espao em branco e usa um XmlUrlResolver objeto para resolver o nome do arquivo URI. C#
// Supply the credentials necessary to access the Web server. XmlUrlResolver resolver = new XmlUrlResolver(); resolver.Credentials = CredentialCache.DefaultCredentials; // Create the XmlTextReader. XmlTextReader reader = new XmlTextReader("http://serverName/data/books.xml"); reader.WhitespaceHandling = WhitespaceHandling.None; reader.XmlResolver = resolver;

Visual C# Consolidado

819

Verso 2,0
O cdigo a seguir cria um XmlReader objeto com a mesma configurao, usando o Create mtodo. C#
// Supply the credentials necessary to access the Web server. XmlUrlResolver resolver = new XmlUrlResolver(); resolver.Credentials = CredentialCache.DefaultCredentials; // Create the XmlReader. XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreWhitespace = true; settings.XmlResolver = resolver; XmlReader reader = XmlReader.Create("http://serverName/data/books.xml", settings);

Para obter mais informaes, consulte Criando leitores XML. Validao XML Do XmlValidatingReader na verso 2.0, e XmlSchemaCollection Classes tiver sido marcadas obsoletos. Em vez disso, voc deve usar a XmlReaderSettings classe para criar um objeto validao XmlReader. A XmlSchemaCollection classe substituda pela XmlSchemaSet classe. Observao O XmlReaderSettings e XmlSchemaSet Classes no oferecem suporte validao de esquema XML-Data Reduced (XDR). Use a XmlValidatingReader classe se voc deve validar usando um esquema XDR.

Verso 1.1
Do XmlValidatingReader o cdigo a seguir valida dados usando e XmlSchemaCollection Classes. C#
XmlValidatingReader reader = new XmlValidatingReader(new XmlTextReader("books.xml")); reader.ValidationType = ValidationType.Schema; reader.Schemas.Add("urn:books", "books.xsd"); reader.ValidationEventHandler += new ValidationEventHandler (ValidationCallBack); while (reader.Read());

C#
private static void ValidationCallBack(object sender, ValidationEventArgs e) { Console.WriteLine("Validation Error: {0}", e.Message); }

Verso 2,0
Do XmlReader o cdigo a seguir valida dados usando e XmlSchemaSet Classes. C#
XmlReaderSettings settings = new XmlReaderSettings(); settings. ValidationType = ValidationType.Schema; settings.Schemas.Add("urn:books", "books.xsd"); settings.ValidationEventHandler += new

Visual C# Consolidado

820

ValidationEventHandler (ValidationCallBack); XmlReader reader = XmlReader.Create("books.xml",settings); while (reader.Read());

C#
private static void ValidationCallBack1(object sender, ValidationEventArgs e) { Console.WriteLine("Validation Error: {0}", e.Message); }

Criao XmlWriter Na verso 2.0, XmlWriter objetos so criados usando o mtodo esttico Create na classe XmlWriter. Um XmlWriterSettings objeto especifica os recursos que voc deseja o criado XmlWriter para oferecer suporte. Observao Embora o .NET Framework inclui a XmlTextWriter classe, que uma implementao da classe XmlWriter, recomendvel que voc criar XmlWriter objetos com o Create mtodo. Isso permite que voc para tirar proveito dos todos os novos recursos adicionada classe XmlWriter.

Verso 1.1
O cdigo a seguir cria um XmlTextWriter objeto com uma codificao especfica. C#
XmlTextWriter writer = new XmlTextWriter("books.xml", Encoding.Unicode); writer.Formatting = Formatting.Indented;

Verso 2,0
O cdigo a seguir cria um XmlWriter objeto com a mesma configurao, usando o Create mtodo. C#
XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.Encoding = Encoding.Unicode; XmlWriter writer = XmlWriter.Create("books.xml", settings);

Para obter mais informaes, consulte Criando Writers XML. Processamento XSLT A XslCompiledTransform classe o novo processador XSLT. Ele substituir a XslTransform classe. A XsltSettings enumerao usada para ativar as configuraes opcionais, como o suporte para scripts incorporados ou a funo XSLT document() XSLT.

Verso 1.1
O cdigo a seguir executa uma transformao XSLT usando a XslTransform classe. C#

Visual C# Consolidado

821

// Create the XslTransform. XslTransform xslt = new XslTransform(); // Create a resolver and set the credentials to use. XmlUrlResolver resolver = new XmlUrlResolver(); resolver.Credentials = CredentialCache.DefaultCredentials; // Load the style sheet. xslt.Load("http://serverName/data/xsl/sort.xsl", resolver); // Transform the file. XPathDocument doc = new XPathDocument(filename); XmlTextWriter writer = new XmlTextWriter("output.xml", null); xslt.Transform(doc, null, writer, null);

Verso 2,0
O cdigo a seguir executa uma transformao XSLT usando a XslCompiledTransform classe. C#
// Create the XslCompiledTransform object. XslCompiledTransform xslt = new XslCompiledTransform(); // Create a resolver and set the credentials to use. XmlUrlResolver resolver = new XmlUrlResolver(); resolver.Credentials = CredentialCache.DefaultCredentials; // Load the style sheet. xslt.Load("http://serverName/data/xsl/sort.xsl", XsltSettings.Default, resolver); // Transform the file. XmlWriter writer = XmlWriter.Create("output.xml"); xslt.Transform("books.xml", writer);

Para obter mais informaes, consulte Migrando da classe XslTransform.

Arquitetura Overview of XML no .NET Framework


Esta seo fornece uma viso geral da arquitetura de XML no .NET Framework. O metas de design para as classes XML no .NET Framework so:

Produtividade alta-. Com base em padres. Suporte multilnge. Extensvel. Arquitetura conectvel. Concentrada no desempenho, confiabilidade e escalabilidade. Integrao com o ADO.NET.

Para obter mais informaes sobre a arquitetura conectvel, consulte Objetivos de Design para XML no .NET Framework. O.NET Framework fornece uma oportunidade para criar um conjunto de classes XML integrado e tambm mostrar inovaes no mundo XML. As classes XML fornecidas so elementos principais do .NET Framework. Essas classes fornecem uma soluo aberto, compatvel com padres, interopervel para os desafios que os desenvolvedores enfrentam hoje. Para obter mais informaes sobre o conjunto de classes no XML no .NET Framework, consulte e System.Xml.Schema espaos de nome., System.Xml.Xsl a System.Xml, System.Xml.XPath

Segurana e seus aplicativos System.Xml


Segurana um aspecto importante de qualquer aplicativo. O primeiro procedimento para criar um aplicativo seguro para compreender os tipos de questes de segurana voc necessrias para estar ciente das, e tambm para compreender as estratgias bsicas voc pode usar para proteger seu aplicativo.

Visual C# Consolidado

822

Esta seo aborda questes que so especficas para as tecnologias XML. Ele tambm oferece algumas diretrizes que podem ajudar a proteger seus aplicativos. Para obter mais informaes, consulte que fornece a documentao mais recente, informaes tcnicas, downloads, grupos de notcias, e outros recursos para desenvolvedores Xml. o Centro do desenvolvedor XML,

Consideraes sobre segurana System.Xml


As sees a seguir discutem os tipos de problemas de segurana que possam surgir ao trabalhar com System.Xml componentes o que voc pode fazer para atenuar essas ameaas. Observao Os System.Xml componentes dependem do sistema de segurana Microsoft .NET Framework. Este tpico somente soluciona problemas de segurana especificamente que so tratados pelas classes XML. Para obter mais informaes, consulte Segurana no .NET Framework.

XmlResolver Class XmlReader and XmlReaderSettings Classes XmlTextReader Class XslCompiledTransform Class Document Object Model

Classe XmlResolver A XmlResolver classe usada para resolver recursos. usado para carregar documentos XML, e para resolver externos recursos, como entidades, DTDs ou esquemas, e importar ou incluir diretivas. O.NET Framework inclui duas implementaes da classe XmlResolver. A XmlUrlResolver classe o resolvedor padro para todas as classes no espao para nome System.Xml. Do file:// oferece suporte e http:// Protocolos e solicitaes a partir da WebRequest classe. Em muitos casos, se voc no especificar um XmlResolver objeto que seu aplicativo deve usar, um XmlUrlResolver objeto COM sem credenciais de usurio usado para acessar recursos XML. A XmlSecureResolver classe ajuda a proteger outro XmlResolver objeto, disposio o XmlResolver objeto e restringindo os recursos que base XmlResolver tem acesso ao. Por exemplo, a XmlSecureResolver classe pode proibir acesso a determinado sites ou zonas. Voc deve considerar os seguintes itens ao trabalhar com a XmlResolver classe.

Objetos XmlResolver podem conter informaes sigilosas such as credenciais de usurio que podem ser usadas para acessar e recuperar dados. Do XmlResolver voc deve ter cuidado ao cache XmlResolver objetos e no deve passar o XmlResolver objeto para um componente no confivel porque o componente no confivel pode usar e suas credenciais de usurio para acessar dados. Se voc estiver criando uma propriedade de classe que usa a XmlResolver classe, a propriedade deve ser definida como uma propriedade somente para gravao. A propriedade pode ser usada para especificar mas ela no pode ser usada para retornar um XmlResolver objeto. a ser usado, o XmlResolver Isso permite um uso componente no confiveis a classe, mas no permite-lo para recuperar e use o XmlResolver objeto diretamente.

Visual C# Consolidado

823

Se o aplicativo aceita XmlResolver objetos do cdigo no confivel, voc no pode presumir que o URI passado para o GetEntity mtodo a mesma que retornado pelo mtodo ResolveUri. Classes derivadas da classe XmlResolver podem substituir o GetEntity mtodo e retornar dados que so diferentes das que estivesse contido no URI original. O aplicativo pode atenuar Negao de memria das ameaas do servio para o GetEntity mtodo implementando uma disposio implementada IStream que limita o nmero de bytes lidos. Isso ajuda a proteo contra situaes onde cdigo mal-intencionado tenta se passar um fluxo de bytes infinito para o GetEntity mtodo.

XmlReader e classes XmlReaderSettings Praticamente todos os System.Xml componentes so criados acima do conceito de Anlise XML. Por exemplo, a XmlDocument classe usa a XmlReader classe para analisar um documento e criar uma representao na memria do documento XML. recomendvel usar o Create mtodo para criar XmlReader objetos. A XmlReaderSettings classe especifica o conjunto de recursos voc deseja ativar para o XmlReader objeto. Processamento DTD Processamento DTD pode levar a uma condio de negao de servio. Por exemplo, o DTD pode conter entidades aninhadas ou complexos Modelos de contedo que podem tirar uma quantidade excessiva de tempo para processar. Processamento DTD desativado por padro. Um XmlException encontrar os XmlReader dados DTD acionada quando. Processamento de esquema O ProcessInlineSchema e ProcessSchemaLocation Sinalizadores de validao de um XmlReaderSettings objeto no so definidas por padro. Do XmlReader Isso ajuda a proteger contra ataques baseada em esquema quando ele est processando dados XML de uma origem no confivel. Quando esses sinalizadores so definidas, o XmlResolver. do objeto XmlReaderSettings usado para resolver locais do esquema encontrados no documento de ocorrncia na XmlReader Locais de esquema no sero resolvidos se a XmlResolver propriedade estiver definida como null, mesmo que. e ProcessSchemaLocation Sinalizadores de validao esto definidas o ProcessInlineSchema Esquemas adicionadas durante a validao adicionar novos tipos e pode alterar o resultado de validao do documento que est sendo validado. Como resultado, esquemas externas somente devem ser resolvidas de fontes confiveis. Microsoft recomenda desativar o ProcessIdentityConstraints Sinalizador (ativado por padro) quando XML validando, no confiveis, grande documentos em cenrios alta disponibilidade em um esquema com restries de identidade sobre uma grande parte do documento. Recursos externos Dados XML podem incluir referncias a recursos externos, como um arquivo de esquema. Por padro recursos externos so resolvidos usando um XmlUrlResolver objeto COM sem credenciais de usurio. Isso significa que, por padro, voc pode acessar qualquer locais que no exigem credenciais. Voc pode proteger isso mais seguindo um destes procedimentos:

Restringir os recursos que. pode acessar, definindo a System.Xml.XmlReaderSettings.XmlResolver propriedade a um XmlSecureResolver objeto a XmlReader

Visual C# Consolidado

824

No permitir para abrir qualquer recursos externos, definindo a System.Xml.XmlReaderSettings.XmlResolver propriedade a null. o XmlReader

Compartilhar objetos XmlReaderSettings Objetos XmlReaderSettings podem conter informaes sigilosas such as credenciais de usurio. Um componente no confivel pode usar o XmlReaderSettings objeto e suas credenciais de usurio para criar XmlReader objetos para ler dados. Voc deve ser cuidado quando cache XmlReaderSettings Objetos, ou quando passando o XmlReaderSettings objeto de um componente para outro. Suporte componentes

No aceitar suporte componentes, como NameTable, XmlNamespaceManager,. e XmlResolver Objetos, de uma fonte no confivel

Processamento de dados Dados XML podem conter um nmero de atributos, declaraes de espao para nome, elementos aninhados grande e assim por diante que exigem uma quantidade considervel de tempo para processar.

Voc pode criar uma implementao personalizada IStream que limita o tamanho de entrada usado e fornecer isso para a XmlReader classe. Use o ReadValueChunk mtodo para lidar com grandes fluxos de dados. Esse mtodo l um pequeno nmero de caracteres de cada vez em vez de alocar uma nica seqncia para o valor inteiro.

Classe XmlTextReader A XmlTextReader classe uma implementao da classe XmlReader legada. Processamento DTD Processamento DTD ativado por padro. Para desativar processamento DTD, defina a ProhibitDtd propriedade como true. Tratamento de entidade Por padro entidades gerais no so expandidas. Entidades gerais so expandidas quando voc chamar o ResolveEntity mtodo. Recursos externos Dados XML podem incluir referncias a recursos externos, como referncias DTD. Por padro recursos externos so resolvidos usando um XmlUrlResolver objeto COM sem credenciais de usurio. Voc pode proteger isso mais seguindo um destes procedimentos:

Restringir os recursos que. pode acessar, definindo a XmlResolver propriedade a um XmlSecureResolver objeto a XmlTextReader No permitir para abrir qualquer recursos externos, definindo a XmlResolver propriedade a null. o XmlTextReader

Classe XslCompiledTransform

Visual C# Consolidado

825

A XslCompiledTransform classe um processador XSLT processador XSLT que oferece suporte sintaxe XSLT 1.0. Ele permite que voc para dados XML usando um folha de estilo XSLT transformaes. Recursos externos Folhas de estilos podem incluir referncias a recursos externos, como xsl:import ou xsl:include elementos ou a document() funo. Do xsl:import o XslCompiledTransform oferece suporte de classe ou xsl:include elementos por padro. A XslCompiledTransform classe desabilita o suporte para a document() funo por padro. A XsltSettings classe usada para ativar a document() funo. O Load e Transform mtodos incluir overloads que se um XmlResolver objeto como um dos seus argumentos. Se no for especificado, um padro XmlUrlResolver com nenhum credenciais usado. um XmlResolver Voc pode controlar recursos como externos so acessados, siga um destes procedimentos:

Restringir os recursos que o processo XSLT pode acessar, usando um XmlSecureResolver objeto. No permitir que o processo XSLT aberto qualquer recursos externos passando em null Para o XmlResolver argumento.

Blocos de script A XslCompiledTransform classe no oferece suporte blocos de script por padro. Blocos de script so ativados atravs da XsltSettings classe. XSLT script deve ser ativada somente se voc exigem suporte script e voc estiver trabalhando em um ambiente totalmente confivel. Objetos de extenso Objetos extenso adicionam recursos de programao ao transformaes XSLT. Esse recurso ativado por padro. Se Objetos de extenso for passados para o Transform mtodo, elas so usadas na transformao XSLT. Modelo de Objeto de Documento Porque o DOM (modelo de objeto Document) caches todos os dados da memria, operaes DOM, como Consultar, Editar, mover sub-Trees entre documentos, e salvar objetos DOM no so recomendadas se voc estiver trabalhando com dados no confiveis e estiver preocupado com a ataques de negao de servio. Outra opo para definir um limite para a quantidade de dados para ler em DOM. Uma maneira para fazer isso para criar uma implementao personalizada de fluxo que limita o tamanho de entrada usado e Use isso para carregar o objeto DOM. Objetos XmlDocument podem conter informaes sigilosas such as credenciais de usurio no objeto incorporado XmlResolver. Se a System.Xml.XmlDocument.XmlResolver propriedade estiver definida como um XmlResolver objeto com credenciais de usurio, no cache o XmlDocument objeto ou transmiti-las a um componente no confivel. Um componente no confivel pode usar o objeto DOM, e as credenciais do usurio incorporado XmlResolver, para acessar e carregar dados.

Visual C# Consolidado

826

System.Xml codificao diretrizes


As sees a seguir fornecem diretrizes gerais podem ser usadas para ajudar a proteger seus System.Xml aplicativos. Observao Os System.Xml componentes dependem do sistema de segurana Microsoft .NET Framework. Este tpico somente soluciona problemas de segurana especificamente que so tratados pelas classes XML. Para obter mais informaes, consulte Segurana no .NET Framework. Questes de segurana As questes de segurana podem ser divididas fora em trs categorias gerais. Acesso externo Vrias tecnologias XML tm a capacidade para recuperar outros documentos durante o processamento. Por exemplo, uma definio de tipo de documento (DTD) pode residir no documento sendo analisada. O DTD tambm pode morar em um documento externo que referenciado pelo documento sendo analisada. O idioma de definio esquema XML (XSD) e tecnologias XSLT tambm tm a capacidade para incluir informaes de outros arquivos. Esses recursos externos podem apresentar algumas questes de segurana:

Faa como voc garantir que seu aplicativo somente recupera arquivos de sites confiveis? Por exemplo, se um documento XML tiver uma referncia de arquivo a um arquivo a partir da Internet, voc deseja seu aplicativo para recuperar este arquivo? Fazer se voc recuperar um arquivo, como voc garantir esse arquivo no contm dados mal intencionados?

Negao de Servio Porque documentos XML podem incluir referncias a outros arquivos, difcil para determinar a quantidade de capacidade de processamento necessrio para analisar um documento XML. Por exemplo, documentos XML podem incluir um DTD. Se o DTD contm entidades aninhadas ou complexos Modelos de contedo, ele poder ter uma quantidade excessiva de tempo para analisar o documento. Os seguintes cenrios so considerados para ser menos vulnervel a ataques de negao de servio porque as System.Xml classes fornecem um meio de proteo contra esses ataques. Para saber sobre os tipos de questes de segurana que possam surgir ao trabalhar com System.Xml componentes e o que voc pode fazer para atenuar essas ameaas, consulte Consideraes sobre segurana System.Xml.

Analisar texto dados XML. Anlise binrios dados XML se os dados XML binrios foi gerados pelo Microsoft SQL Server 2005. Gravao documentos XML e fragmentos do fontes de dados para o sistema de arquivos, transmite, uma TextWriter, ou uma StringBuilder. Carregando documentos para o objeto documento DOM) se voc estiver usando um XmlReader objeto e ProhibitDtd definido como true. Navegando o objeto DOM.

Visual C# Consolidado

827

Os cenrios a seguir no so recomendados se estiver preocupado com a ataques, negao de servio ou se voc estiver trabalhando em um ambiente no confivel.

Processamento DTD. Processamento de esquema. Isso inclui adicionar um esquema no confivel coleo de esquemas, compilar um esquema no confivel e validao usando o esquema no confivel. Processamento XSLT. Analisar qualquer fluxo arbitrrio do usurio fornecidas binrios dados XML. Operaes DOM, como consultar, editando, movendo sub-Trees entre documentos, e salvar objetos DOM.

Processamento As tecnologias XSD e XSLT possuem recursos adicionais que podem afetar o desempenho de processamento. Por exemplo, ele possvel para construir um esquema XML que requer uma quantidade considervel de tempo para processar quando avaliada em um documento relativamente pequeno. Tambm possvel para incorporar blocos de script em um folha de estilo XSLT. Ambos os casos representar uma ameaa de segurana potencial ao seu aplicativo. Recursos externos A XmlUrlResolver classe o resolvedor padro para todas as classes no espao para nome System.Xml. usado para carregar documentos XML, e para resolver externos recursos, como entidades, DTDs ou esquemas, e importar ou incluir diretivas. As APIs permite que sejam substitu-lo, especificando o XmlResolver objeto para utilizar. Use a XmlSecureResolver classe caso voc precise abrir um recurso que voc no faa controle, ou que no confivel. A XmlSecureResolver disposio e permite que voc para restringir os recursos que base XmlResolver tem acesso ao. um XmlResolver Processamento DTD No ative processamento DTD se voc estiver preocupado com a problemas dos ou se voc est lidando com fontes no confiveis. Processamento DTD desativado por padro em XmlReader Objetos criado pelo mtodo Create. Observao O XmlTextReader permite DTD processamento por padro. Use a System.Xml.XmlTextReader.ProhibitDtd propriedade para desativar este recurso. Se voc tiver processamento DTD ativado, voc poder usar pode acessar. Para restringir os recursos que o XmlSecureResolver o XmlReader Voc tambm pode criar seu aplicativo para que o processamento XML a memria e tempo restrita. Por exemplo, configurar limites de tempo limite em seu aplicativo ASP.NET. Processamento XSLT Ao criar um aplicativo que usa a XslCompiledTransform classe, voc deve estar ciente dos itens as seguir e suas implicaes:

Visual C# Consolidado

828

Script XSLT desativado por padro. XSLT script deve ser ativada somente se voc exigem suporte script e voc estiver trabalhando em um ambiente totalmente confivel. A funo XSLT document() desativada por padro. Se voc ativar a document() funo, restringir os recursos que podem ser acessados, passando um XmlSecureResolver objeto para o Transform mtodo Objetos extenso so ativados por padro. Se um XsltArgumentList objeto contendo objetos de extenso passado para o Transform mtodo, eles so utilizados. Folhas de estilos XSLT podem incluir referncias a outros arquivos e blocos de script incorporado. Um usurio mal-intencionado pode explorar isso, fornecendo voc com dados ou estilo folhas que quando executado pode causar o sistema para processar at que o computador executar baixa em Recursos. Aplicativos XSLT que executados em um ambiente misto confiana podem resultar em folhas de estilo spoofing. Por exemplo, um usurio mal-intencionado pode carregar um objeto com um folhas de estilo prejudicial e entreg-lo para outro usurio que subseqentemente chama o Transform mtodo e executa a transformao.

Esses problemas de segurana podem ser atenuados com no ativar scripts ou a document() Funo. a menos que o folhas de estilo provm de uma fonte confivel, e por no aceitar XslCompiledTransform Objetos, folhas de estilos XSLT ou XML fonte de dados de uma fonte no confivel Tratamento de exceo Excees geradas por componentes de nvel inferiores podem divulgar informaes de caminho que voc no deseja bubbled backup para o aplicativo. Os aplicativos devem Capturar excees e process-los adequadamente. Uso XmlTextWriter Do XmlTextWriter quando voc passar para outro aplicativo o fluxo subjacente exposto a esse aplicativo. Se precisar de passar para um aplicativo semiconfivel, voc deve usar um XmlWriter objeto criado atravs do Create mtodo em vez disso. o XmlTextWriter

Dados XML processo In-Memory


O Microsoft .NET Framework inclui dois modelos para processar dados XML. A XmlDocument classe implementa o ncleo Nvel 1 documento DOM) do W3C e as recomendaes 2 Nvel DOM principal. O DOM um na memria (cache) rvore representao de um documento XML. COM e suas classes relacionados, voc pode construir documentos XML, carregar e acessar dados, modificar dados, e salvar alteraes. o XmlDocument, A XPathDocument classe armazenamento de dados na memria somente leitura, que baseado no modelo de dados XPath. A XPathNavigator classe oferece vrias opes de edio e recursos de navegao usando um modelo cursor sobre documentos XML contidos na leiturasomente XPathDocument Classe, bem como a XmlDocument classe.

Processo dados XML usando o modelo DOM


XML documento o DOM) trata dados XML como um conjunto padro de objetos e usado para processar dados XML na memria. O System.Xml espao para nome fornece uma representao programtica de XML documentos, fragmentos, ns, ou n-define. Se baseia o ncleo Nvel 1 DOM W3C (World Wide Web Consortium) (W3C) e as recomendaes Nvel DOM principal 2.

Visual C# Consolidado

829

A XmlDocument classe representa um documento XML. Ele inclui membros para recuperar e criar todos os outros objetos XML. Usando e suas classes relacionados, voc pode construir documentos XML, carregar e acessar dados, modificar dados, e salvar alteraes. o XmlDocument, Nesta seo Ler um documento XML para o DOM. Discute como ler dados XML em um documento XML. Inserir ns em um documento XML Discute como inserir ns em um documento XML. Remover ns, contedo, e valores de um documento XML Explica como remover ns, incluindo valores de n. Modificar ns, contedo, e valores em um documento XML Discute como modificar o contedo de n. Resolvendo recursos externos Discute usando a XmlResolver classe para Resolver e acessar recursos externos. Estendendo o DOM Discute como estender as classes DOM para fornecer funcionalidade adicional. Sees relacionadas Processo dados XML usando o modelo de dados XPath Discute processamento XML usando a XPathNavigator classe.

Processo dados XML usando o modelo de dados XPath


Do XmlDocument espao para nome System.Xml fornece uma representao programtica da XML documentos, fragmentos, ns, ou Define ns na memria, Usando. ou XPathDocument Classes A XPathDocument classe fornece uma representao de um documento XML usando o modelo de dados XPath rpida, somente leitura, na memria. A XmlDocument classe fornece uma representao na memria editvel de um documento XML implementao documento DOM) do W3C principal nvel 1 e 2 Nvel DOM principal. Ambas as classes implementam a IXPathNavigable interface e retornar um XPathNavigator objeto usado para selecionar, Avaliar, navegar, e em alguns casos, editar os dados XML subjacentes. As sees a seguir descrevem a funcionalidade da XPathNavigator classe com base na classe que devolve. Nesta seo Lendo dados XML usando XPathDocument e XmlDocument

Visual C# Consolidado

830

Descreve como criar uma leitura-somente XPathDocument Classe objeto para ler um documento XML e como criar um objeto de classe editvel XmlDocument para ler e editar um documento XML. Este tpico tambm descreve como retorno um XPathNavigator objeto de cada classe para navegar e editar um documento XML. Selecionar, Evaluating e correspondncia dados XML usando XPathNavigator Descreve os mtodos da classe XPathNavigator utilizada para selecionar ns no ou XmlDocument Objeto utilizando uma consulta XPath, avaliar e examine os resultados de uma expresso XPath, e determinar se um n em um documento XML coincide com uma expresso XPath especificada. um XPathDocument Acessando dados XML usando XPathNavigator Descreve os mtodos da classe XPathNavigator usada para navegar ns, extrair dados XML e acessar altamente digitados dados XML no ou XmlDocument Objeto. um XPathDocument Editando dados XML usando XPathNavigator Descreve os mtodos da XPathNavigator classe usada para inserir, modificar e remover ns e valores de um documento XML contido em um XmlDocument objeto. Validao de esquema usando XPathNavigator Descreve as maneiras para validar o contedo XML contido no ou XmlDocument Objeto. um XPathDocument

Lendo XML com o XmlReader


A XmlReader classe uma classe base abstrata que fornece no-armazenados em cache, somente de encaminhamento, acesso a dados XML somente leitura. Est de acordo para o W3C (XML) 1.0 e o Namespaces em recomendaes XML. A XmlReader classe oferece suporte ler dados XML de um fluxo ou arquivo. Ele define mtodos e propriedades que permitem a voc para percorrer os dados e ler o contedo de um n. O n atual se refere o n em que o leitor est posicionado. O leitor avanado usando qualquer um dos mtodos de leitura e propriedades retornar o valor do n atual. A XmlReader classe permite que voc para:

Verifique se os caracteres so legais caracteres XML, e desse elemento e nomes de atributos so nomes XML vlidos. Verifique o documento XML que est formado. Validar os dados contra um DTD ou esquema. Recuperar dados do fluxo XML ou ignorar indesejados registros usando um modelo de recebimento.

Nesta seo Novos recursos na classe XmlReader Descreve alteraes para a XmlReader classe. Tarefas comuns XmlReader

Visual C# Consolidado

831

Descreve as tarefas mais comuns XmlReader. Usando a classe XmlReader Descreve como criar XmlReader instncias, validao de dados, dados de leitura, e assim por diante. Comparando XmlReader para leitor SAX Descreve as diferenas entre a XmlReader classe e o leitor SAX.

Escrevendo XML com o XmlWriter


A XmlWriter classe uma classe base abstrata que fornece uma forma de gerar fluxos XML somente de encaminhamento, somente para gravao, armazenado em cache no-. Pode ser usado para criar documentos XML que esto em conformidade para o W3C (XML) 1.0 (Second Edition) (www.w3.org/TR/2000/REC-XML-20001006.html) Recomendao e o Namespaces na recomendao XML (www.w3.org/TR/REC-XML-Names/). O XmlWriter permite que voc se:

Verifique se os caracteres so legais caracteres XML e desse elemento e nomes de atributos so nomes XML vlidos. Verifique se o documento XML vlido. Codificar bytes binrios como BASE64, ou BinHex, e gravao sem o texto resultante. Passar os valores usando tipos Runtime de idioma comuns em vez de seqncias. Isso permite evitar a Executar converses valor manualmente. Gravar vrios documentos em um fluxo de sada. Gravar nomes vlidos, nomes qualificados e smbolos nome.

Novos recursos na classe XmlWriter


O Microsoft .NET Framework verso 2.0 inclui muitas alteraes Design e funcionalidade para a XmlWriter classe. Criao XmlWriter O Create mtodo o mecanismo preferido para obter XmlWriter objetos. O Create mtodo usa a XmlWriterSettings classe para especificar quais recursos deve oferecer suporte a XmlWriter instncia. Para obter mais informaes, consulte Criando Writers XML. Conformance de dados Objetos XmlWriter criados atravs do Create mtodo so, por padro, mais conformant que a XmlTextWriter implementao. Usando o Create mtodo e a XmlWriterSettings classe oferece dois outros recursos verificao conformance-.

Visual C# Consolidado

832

Verificao de caracteres Do XmlWriter a System.Xml.XmlWriterSettings.CheckCharacters propriedade configura para verificar caracteres no fluxo de dados XML para garantir que todos os caracteres sejam dentro do intervalo de caracteres XML vlidos. Caractere verificao inclui, verificando se h caracteres invlidos em ns de texto e nomes XML, assim como verificao validade de nomes XML no (por exemplo, um nome xml pode comear com um numrica). Se os dados XML no no vir dentro do intervalo de caracteres XML legais, acionada. um XmlException Verificando a conformidade Do XmlWriter a System.Xml.XmlWriterSettings.ConformanceLevel propriedade configura para verificar e garantir que o fluxo sendo lidos compatvel com um determinado conjunto de regras. Dependendo do nvel conformidade que for especificado, os dados XML podem ser verificados para ver que est de acordo com as regras para um documento XML 1.0 vlido ou fragmento de documento. Se os dados no estiver em conformidade, acionada. um XmlException Para obter mais informaes, consulte Conformance de dados e o XmlWriter. Suporte a tipo A XmlWriter classe permite-lhe gravar valores como tipo simples-comuns valores Runtime (CLR) de idioma. Voc pode usar o WriteValue mtodo para passar valores usando tipos sistema em vez de seqncias. Dessa forma, voc pode gravar valores diretamente sem que seja necessrio executar converses valor manualmente.

Usando o XmlWriter
A XmlWriter classe grava dados XML em um fluxo, arquivo, TextReader,. ou seqncia A XmlWriter classe grava dados XML em um fluxo, arquivo, TextReader,. ou seqncia Ele fornece um meio de criao vlidos dados XML de uma maneira somente de encaminhamento, somente para gravao, armazenado em cache no-. D a XmlWriter classe suporte o W3C XML 1.0 e Namespaces em recomendaes XML. Esta seo discute como criar uma XmlWriter instncia com um conjunto especificado de recursos, conformidade de dados verificao, gravar dados digitados, e assim por diante. Nesta seo Criando Writers XML Explica como criar gravadores usando o System.Xml.XmlWriter.Create mtodo. Conformance de dados e o XmlWriter Descreve verificaes conformidade de dados que podem ser definidas na classe XmlWriter. Namespace tratamento no XmlWriter Discute os recursos espao para nome na classe XmlWriter. Dados digitados escrita

Visual C# Consolidado

833

Discute como gravar dados digitados. Gravar atributos Descreve os mtodos disponveis para gravar atributos. Elementos de escrita Descreve os mtodos disponveis para gravar elementos. Gravar XML usando o XmlTextWriter Discute como usar a XmlTextWriter classe. Observao No Microsoft .NET Framework verso 2.0, recomendvel criar XmlWriter objetos usando o Create mtodo.

Transformaes em XSLT
A transformao XSL Transformation (XSLT) permite que voc transformar o contedo de um documento XML de origem em outro documento que seja diferente em formato ou estrutura. Por exemplo, voc pode usar XSLT para transformar XML em HTML para uso em um site da Web ou para transform-lo em um documento que contenha apenas os campos necessrios para um aplicativo. Esse processo de transformao especificado pela recomendao W3C Transformaes em XSL (XSLT) verso 1.0 localizada em www.w3.org/TR/XSLT. A XslCompiledTransform classe o processador XSLT no .NET Framework. A XslCompiledTransform classe oferece suporte a recomendao W3C 1.0 XSLT. Observao A XslTransform classe obsoleto no .NET Framework verso 2.0. A XslCompiledTransform classe uma nova implementao do mecanismo XSLT. Ele inclui aprimoramentos de desempenho e novos recursos de segurana. A prtica recomendada para criar aplicativos XSLT usando a XslCompiledTransform classe.

Usando a classe XslCompiledTransform


A XslCompiledTransform classe o processador XSLT do Microsoft .NET Framework. Essa classe usada para compilar folhas de estilos e executar transformaes XSLT. Nesta seo Entradas para a classe XslCompiledTransform Descreve as opes de entrada XSLT disponveis. Opes de sada na classe XslCompiledTransform

Visual C# Consolidado

834

Descreve as Opes de sada XSLT disponveis. Resolvendo recursos externos durante processamento XSLT Discute usando a XmlResolver classe para resolver recursos externos. Estendendo folhas de estilos XSLT Discute como h suporte para extenses XSLT.

Migrando da classe XslTransform


Tem a arquitetura XSLT foi redefinida na verso 2.0 Framework Microsoft .NET. A XslTransform classe foi substituda pela classe XslCompiledTransform. Desempenho A XslCompiledTransform classe inclui muitos aprimoramentos de desempenho. O novo processador XSLT compila o folha de estilo XSLT Down to um formato intermedirio comum, semelhante que o Common Language Runtime (CLR) faz para outras linguagens de programao. Depois que o folhas de estilo compilado, ele pode ser armazenadas em cache e reutilizados. A XslCompiledTransform classe tambm inclui outras otimizaes que tornam muito mais rpida que a XslTransform classe. Segurana A XslCompiledTransform classe desativa suporte para a funo XSLT document() e script incorporado por padro. Esses recursos podem ser ativados, criando um XsltSettings objeto com os recursos habilitados e passando-para o Load mtodo. Para obter mais informaes, consulte Consideraes sobre segurana XSLT. Migrando cdigo As novas classes XSLT tenham sido designadas para ser muito semelhante s classes existentes. A XslCompiledTransform classe substitui a XslTransform classe. Folhas de estilo so compiladas usando o Load mtodo. Transformaes so executadas usando o Transform mtodo. Os procedimentos a seguir mostrar tarefas comuns, XSLT e compare o cdigo usando a XslTransform classe versus a XslCompiledTransform classe.

Para transformar um arquivo e sada para um URI


Cdigo usando a XslTransform classe. C#
XslTransform xslt = new XslTransform(); xslt.Load("output.xsl"); xslt.Transform("books.xml", "books.html");

Cdigo usando a XslCompiledTransform classe.

C#
XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load("output.xsl"); xslt.Transform("books.xml", "books.html");

Para compilar um folhas de estilo e usar um resolvedor com credenciais padro Visual C# Consolidado 835

Cdigo usando a XslTransform classe.

C#
XslTransform xslt = new XslTransform(); XmlUrlResolver resolver = new XmlUrlResolver(); resolver.Credentials = CredentialCache.DefaultCredentials; xslt.Load("sort.xsl", resolver);

Cdigo usando a XslCompiledTransform classe.

C#
XslCompiledTransform xslt = new XslCompiledTransform(); XmlUrlResolver resolver = new XmlUrlResolver(); resolver.Credentials = CredentialCache.DefaultCredentials; xslt.Load("sort.xsl", XsltSettings.Default, resolver);

Para usar um parmetro XSLT


Cdigo usando a XslTransform classe. C#
XslTransform xslt = new XslTransform(); xslt.Load("order.xsl"); //Create the XsltArgumentList. XsltArgumentList argList = new XsltArgumentList(); //Create a parameter which represents the current date and time. DateTime d = DateTime.Now; argList.AddParam("date", "", d.ToString()); //Create the XmlTextWriter. XmlTextWriter writer = new XmlTextWriter("output.xml", null); //Transform the file. xslt.Transform(new XPathDocument(filename), argList, writer, null);

Cdigo usando a XslCompiledTransform classe.

C#
XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load("order.xsl"); // Create the XsltArgumentList. XsltArgumentList argList = new XsltArgumentList(); // Create a parameter which represents the current date and time. DateTime d = DateTime.Now; argList.AddParam("date", "", d.ToString()); // Create the XmlWriter. XmlWriter writer = XmlWriter.Create("output.xml", null); // Transform the file. xslt.Transform(new XPathDocument(filename), argList, writer);

Para ativar scripts XSLT


Cdigo usando a XslTransform classe. C#
XslTransform xslt = new XslTransform(); xslt.Load("output.xsl"); xslt.Transform("books.xml", "books.html");

Cdigo usando a XslCompiledTransform classe.

C#
// Create the XsltSettings object with script enabled. XsltSettings settings = new XsltSettings(false,true); // Execute the transform. XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load("calc.xsl", settings, new XmlUrlResolver()); xslt.Transform("books.xml", "books.html");

Para carregar os resultados em um objeto DOM


Observao A XslCompiledTransform classe no tem um mtodo que retorna os resultados de transformao XSLT como um XmlReader objeto. No entanto, voc pode sada para um arquivo

Visual C# Consolidado

836

XML e carregar o arquivo XML para outro objeto. Cdigo usando a XslTransform classe. C#
// Execute the transformation. XslTransform xslt = new XslTransform(); xslt.Load("output.xsl"); XmlReader reader = xslt.Transform(new XPathDocument("books.xml"), null, new XmlUrlResolver()); // Load the results into a DOM object. XmlDocument doc = new XmlDocument(); doc.Load(reader);

Cdigo usando a XslCompiledTransform classe.

C#
// Execute the transformation. XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load("output.xsl"); xslt.Transform("books.xml", "output.xml"); // Load the results into a DOM object. XmlDocument doc = new XmlDocument(); doc.Load("output.xml");

Para transmitir os resultados em outro armazenamento de dados


Cdigo usando a XslTransform classe. C#
// Execute the transformation. XslTransform xslt = new XslTransform(); xslt.Load("output.xsl"); XmlReader reader = xslt.Transform(new XPathDocument("books.xml"), null, new XmlUrlResolver()); // Load the results into an XPathDocument object. XPathDocument doc = new XPathDocument(reader);

Cdigo usando a XslCompiledTransform classe.

C#
// Execute the transformation. XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load("output.xsl"); MemoryStream ms = new MemoryStream(); xslt.Transform(new XPathDocument("books.xml"), null, ms); // Load the results into an XPathDocument object. ms.Seek(0, SeekOrigin.Begin); XPathDocument doc = new XPathDocument(ms);

Consideraes sobre segurana XSLT


O idioma XSLT tem um rico conjunto de recursos que lhe um grande aumento da capacidade e flexibilidade. Ele inclui diversos recursos que, enquanto til, tambm pode ser explorados por fontes externas. Para usar XSLT com segurana, voc deve entender os tipos de problemas de segurana que surgirem ao usar XSLT, e as estratgias bsicas que voc pode empregar para atenuar esses riscos. Extenses XSLT Dois populares extenses XSLT so folhas de estilo objetos scripts e extenso. Essas extenses permitem que o processador XSLT para executar cdigo.

Objetos extenso adicionam recursos de programao ao Transformaes em XSL. Scripts podem ser incorporadas ao folhas de estilo usando o msxsl:script elemento de extenso.

Objetos de extenso
Objetos extenso so adicionados usando o AddExtensionObject mtodo. O conjunto de permisses FullTrust necessrio para suporte a objetos de extenso. Isso garante que elevao

Visual C# Consolidado

837

de permisses no acontecer quando cdigo objeto de extenso executado. Tentativa de chamar o AddExtensionObject mtodo sem resultados permisses FullTrust em uma exceo de segurana sendo geradas.

Scripts da folha de estilos


Scripts podem ser incorporadas a uma folhas de estilo usando o msxsl:script elemento de extenso. Suporte script um recurso opcional na classe XslCompiledTransform que desativada por padro. Script pode ser habilitada ao definir a System.Xml.Xsl.XsltSettings.EnableScript propriedade como true e passar o XsltSettings objeto para o Load mtodo.

Diretrizes
Ativar scripting somente quando o folhas de estilo provm de uma fonte confivel. Se voc no pode verificar a origem do folhas de estilo, ou se o folhas de estilo no no vm de uma fonte confivel, passar em null para o argumento configuraes XSLT. Recursos externos O idioma XSLT tem recursos, como xsl:import, xsl:include,. ou a document() funo, onde o processador necessita para resolver referncias URI A XmlResolver classe usada para resolver recursos externos. Recursos externos talvez precise ser resolvido nos dois casos a seguir:

Durante a compilao um folhas de estilo, e xsl:include Resoluo. usado para xsl:import o XmlResolver Do XmlResolver ao executar a transformao, usado para resolver a document() funo. Observao A document() funo desativada por padro na classe XslCompiledTransform. Esse recurso pode ser ativado ao definir a System.Xml.Xsl.XsltSettings.EnableDocumentFunction propriedade como true e passar o XsltSettings objeto para o Load mtodo.

A Load um dos seus argumentos. e Transform Cada incluir overloads que aceitam uma XmlResolver como mtodos Se no for especificado, um padro XmlUrlResolver com nenhum credenciais usado. um XmlResolver Diretrizes Ativar a document() funo somente quando o folhas de estilo provm de uma fonte confivel. A lista a seguir descreve quando se desejar especificar um XmlResolver objeto:

Se o processo XSLT precisa acessar um recurso de rede que exija autenticao, voc pode usar com as credenciais necessrias. um XmlResolver Se voc quiser restringir os recursos que o processo XSLT pode acessar, voc poder usar com a permisso correta Definir. um XmlSecureResolver Use a XmlSecureResolver classe caso voc precise abrir um recurso que voc no faa controle, ou que no confivel. Se voc desejar personalizar comportamento, voc pode implementar sua prprias XmlResolver Classe e us-lo para resolver recursos. Se voc desejar garantir que nenhum recursos externos so acessados, voc pode especificar null para o XmlResolver argumento.

Visual C# Consolidado

838

Consulte tambm

Transformaes em XSLT com a classe XslTransform


Observao A XslTransform classe obsoleta no Microsoft .NET Framework verso 2.0. Voc pode executar Extensible Stylesheet Language para transformaes transformaes (XSLT) usando a XslCompiledTransform classe. Consulte Usando a classe XslCompiledTransform e Migrando da classe XslTransform Para obter mais informaes. O objetivo da XSLT para transformar o contedo de um documento XML de origem em outro documento que seja diferente em formato ou estrutura (por exemplo, para transformar XML em HTML para uso em um site da Web ou para transform-lo em um documento que contenha apenas os campos necessrios para um aplicativo). Esse processo de transformao especificado pelo W3C (World Wide Web Consortium) (W3C) Recomendao verso 1.0 XSLT localizado em www.w3.org/TR/XSLT. No, .NET Framework a XslTransform classe, encontrada no espao para nome System.Xml.Xsl, o processador XSLT que implementa a funcionalidade dessa especificao. Existe um pequeno nmero dos recursos que no foram implementados da recomendao W3C 1.0 XSLT, listada em Sadas de um XslTransform. A figura a seguir mostra a arquitetura de transformao a .NET Framework. Viso Geral Arquitetura de transformao

A recomendao XSLT usa XML Path Language (XPath) para selecionar partes de um documento XML, XPath uma linguagem de consulta usada para navegar ns de uma rvore de documentos. Como mostrado no diagrama, a .NET Framework Implementao do XPath usada para selecionar partes de XML armazenados em vrias classes, como um XmlDocument, um XmlDataDocument, e um XPathDocument. Um XPathDocument um armazenamento de dados XSLT otimizado, e quando usado com XslTransform, ele fornece transformaes XSLT com bom desempenho. A seguinte lista de tabela normalmente usa classes ao trabalhar com XslTransform e XPath e suas funes.

Visual C# Consolidado

839

Classe ou interface XPathNavigator

Funo uma API que fornece um modelo de estilo cursor para navegar em um armazenamento, juntamente com suporte a consultas XPath. Ele no fornece a edio de armazenamento subjacente. Para edio, use a XmlDocument classe. Ele uma interface que fornece um CreateNavigator mtodo para para o armazenamento. um XPathNavigator Ele permite edio do documento. Ele implementa IXPathNavigable, permitindo cenrios edio documento-onde transformaes XSLT so necessrias posteriormente. Para obter mais informaes, consulte Entrada XmlDocument para XslTransform.

IXPathNavigable XmlDocument

XmlDataDocument Ele derivado da XmlDocument. Ele Bridges o relacional e mundos XML por meio. Para otimizar o armazenamento de dados estruturados dentro do documento XML de acordo com mapeamentos especificados em um DataSet o DataSet Ele implementa IXPathNavigable, permitindo cenrios onde transformaes XSLT podem ser executadas sobre dados recuperados de um banco de dados relacionais. Para obter mais informaes, consulte Integrao XML com dados relacional e ADO.NET. XPathDocument Essa classe otimizada para XslTransform consultas XPath, processamento e e ele fornece um cache de alto desempenho somente leitura. Ele implementa IXPathNavigable e o armazenamento preferencial a ser usado para transformaes XSLT. Ele fornece navegao pela conjuntos de n XPath. Todos os mtodos de Seleo XPath no XPathNavigator retorno um XPathNodeIterator. Vrios XPathNodeIterator objetos podem ser criados sobre o mesmo armazenamento, que representa cada um conjunto de ns selecionado.

XPathNodeIterator

Extenses XSLT MSXML O msxsl:script e msxsl:node-set funes so as extenses XSLT Microsoft XML Core Services (MSXML) somente suporte para a XslTransform classe. Exemplo Cdigo o exemplo seguinte carrega um folha de estilo XSLT, l um arquivo denominado meusdados.xml em e executa uma transformao sobre os dados em um arquivo fictcio chamado myStyleSheet.xsl, enviar a sada formatada para o console. an XPathDocument, C#
using System; using System.IO; using System.Xml; using System.Xml.XPath; using System.Xml.Xsl; public class Sample { private const String filename = "mydata.xml"; private const String stylesheet = "myStyleSheet.xsl"; public static void Main() { XslTransform xslt = new XslTransform(); xslt.Load(stylesheet); XPathDocument xpathdocument = new XPathDocument(filename); XmlTextWriter writer = new XmlTextWriter(Console.Out); writer.Formatting=Formatting.Indented; xslt.Transform(xpathdocument, null, writer, null); } }

Visual C# Consolidado

840

Modelo de objeto de esquema (SOM) do XML


Um esquema XML uma ferramenta poderosa e complexa para criar e validando estrutura em documentos XML compatveis. Semelhante ao dados modelagem em um banco de dados relacional, um esquema fornece uma maneira de definir a estrutura de documentos XML, especificando os elementos que podem ser usados nos documentos,, bem como o estrutura e tipos que esses elementos devem seguir para poder ser vlido para que esquema especfica. O esquema Object Model (SOM) fornece um conjunto de classes no espao para nome System.Xml.Schema que permitem a voc para ler um esquema de um arquivo ou para criar um esquema na memria programaticamente. O esquema ento pode ser traversed, editando, compilados, validado, ou gravadas em um arquivo.

Viso geral do modelo de objeto do esquema XML


O esquema Objeto Modelo (SOM) no Microsoft .NET Framework uma API Rich que permite que voc se criar, editar, e validar esquemas programaticamente. O som opera em documentos de esquema XML de forma semelhante maneira como o DOM (modelo de objeto Document) opera em documentos XML. Documentos de esquema XML so vlidos arquivos XML que, uma vez carregados no som, transmitir significado sobre a estrutura e validade de outros documentos XML que esto de acordo com o esquema. Um esquema um documento XML que define uma classe de documentos XML, especificando a estrutura ou modelo de documentos XML para um esquema especfico. Um esquema identifica as restries sobre o contedo dos documentos XML, e descreve o vocabulrio (regras ou gramtica) que compatveis documentos XML devem seguir a fim de ser considerada Valid esquema com esse esquema especfica. Validao de um documento XML o processo que garante que o documento est de acordo com a gramtica especificada pelo esquema. A seguir esto maneiras a API som no .NET Framework permite-lhe criar, editar, e validar esquemas.

Carregar e salvar esquemas vlidas para e dos arquivos. Crie esquemas na memria usando classes de tipo forte. Interagir com a XmlSchemaSet classe para cache, compilar, e recuperarem esquemas. Interagir com o Create mtodo da XmlReader classe para validar documentos da instncia XML com base em esquemas. Criar editores para criar e manter esquemas. Editar um esquema que pode ser complied e salvos para uso na validao dos documentos da instncia XML dinamicamente.

O modelo de objeto de esquema O som consiste de um conjunto abrangente de classes no espao para nome System.Xml.Schema correspondente aos elementos em um esquema XML. Por exemplo, o <xsd:schema>...</xsd:schema> elemento mapeia para a System.Xml.Schema.XmlSchema classe, e todas as informaes que podem estar contidas em um <xsd:schema/> elemento podem ser representadas usando a XmlSchema classe. Da mesma forma, e System.Xml.Schema.XmlSchemaAttribute Classes respectivamente. e <xsd:attribute>...</xsd:attribute> elementos mapear para o <xsd:element>...</xsd:element> o System.Xml.Schema.XmlSchemaElement Este mapeamento continua para todos os elementos de um Esquema XML criando um modelo de objeto de esquema XML no espao para nome System.Xml.Schema ilustrado no diagrama a seguir.

Visual C# Consolidado

841

Para obter mais informaes sobre cada classe no espao para nome System.Xml.Schema, consulte a System.Xml.Schema documentao de referncia espao para nome da biblioteca de classe do .NET Framework.

Visual C# Consolidado

842

Leitura e escrita esquemas XML


Schema Object Model o som (API) pode ser usado para ler e gravar idioma de definio esquema XML (XSD) esquemas de arquivos ou outras fontes e criar esquemas na memria XML usar as classes no espao para nome System.Xml.Schema que mapeiam para as estruturas definidas na recomendao Esquema XML W3C (World Wide Web Consortium) (W3C). Leitura e escrita esquemas XML Do Read a XmlSchema classe fornece e Write mtodos para ler e gravar esquemas XML. O Read mtodo retorna um XmlSchema objeto que representa o esquema XML e leva um opcional ValidationEventHandler como um parmetro para lidar com avisos de validao de esquema e erros encontrados ao ler um esquema XML. O Write mtodo grava esquemas XML para Stream, TextWriter e XmlWriter objetos e pode levar um objeto como um parmetro opcional XmlNamespaceManager. Um XmlNamespaceManager usado para tratar espaos para nome encontrado em um esquema XML. Para obter mais informaes sobre a XmlNamespaceManager classe, consulte Gerenciar Namespaces usando o XmlNamespaceManager. O exemplo de cdigo a seguir ilustra Leitura e Gravao esquemas XML de e para um arquivo. O exemplo de cdigo utiliza o example.xsd arquivo, l-lo em um XmlSchema objeto usando o static Read mtodo, e seguida, gravar o arquivo para o console e um novo new.xsd arquivo. O exemplo de cdigo tambm fornece um ValidationEventHandler como um parmetro para o static Read mtodo para lidar com quaisquer avisos de validao de esquema ou erros encontrados ao ler o esquema XML. Se (null. no for especificado sem avisos ou erros so relatados,) a ValidationEventHandler C#
using System; using System.IO; using System.Text; using System.Xml; using System.Xml.Schema; class XmlSchemaReadWriteExample { static void Main() { try { XmlTextReader reader = new XmlTextReader("example.xsd"); XmlSchema myschema = XmlSchema.Read(reader, ValidationCallback); myschema.Write(Console.Out); FileStream file = new FileStream("new.xsd", FileMode.Create, FileAccess.ReadWrite); XmlTextWriter xwriter = new XmlTextWriter(file, new UTF8Encoding()); xwriter.Formatting = Formatting.Indented; myschema.Write(xwriter); } catch(Exception e) { Console.WriteLine(e); } } static void ValidationCallback(object sender, ValidationEventArgs args) { if (args.Severity == XmlSeverityType.Warning) Console.Write("WARNING: "); else if (args.Severity == XmlSeverityType.Error) Console.Write("ERROR: "); Console.WriteLine(args.Message); } }

O exemplo utiliza a example.xsd como entrada.


<?xml version="1.0"?> <xs:schema id="play" targetNamespace="http://tempuri.org/play.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/play.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name='myShoeSize'> <xs:complexType> <xs:simpleContent> <xs:extension base='xs:decimal'> <xs:attribute name='sizing' type='xs:string' /> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> </xs:schema>

Visual C# Consolidado

843

Criando esquemas XML


As classes no espao para nome System.Xml.Schema Mapear para as estruturas definidas na recomendao Esquema XML W3C (World Wide Web Consortium) (W3C) e pode ser usado para criar esquemas XML na memria. Criando um esquema XML Nos exemplos de cdigo a seguir, a API som usado para criar um cliente Esquema XML na memria.

Criando Elemento e atributos


Exemplos de cdigo criar o cliente Esquema da parte inferior Backup, criao o filho elementos, atributos, e seus tipos correspondentes primeiro, e os elementos de primeiro nvel. No exemplo de cdigo a seguir, a FirstName e XmlSchemaAttribute Classes do SOM. e LastName elementos, bem como o CustomerId atributo do esquema do cliente criado usando o XmlSchemaElement Alm das propriedades Name do e XmlSchemaAttribute Classes. e XmlSchemaAttribute classes, que correspondem ao atributo " name " do) ter propriedades correspondentes em, fixedValue, form, e assim por diante e <xs:attribute /> elementos em um esquema XML, todos os outros atributos permitidos pelo esquema o XmlSchemaElement (defaultValue o <xs:element /> o XmlSchemaElement C#
// Create the FirstName and LastName elements. XmlSchemaElement firstNameElement = new XmlSchemaElement(); firstNameElement.Name = "FirstName"; XmlSchemaElement lastNameElement = new XmlSchemaElement(); lastNameElement.Name = "LastName"; // Create CustomerId attribute. XmlSchemaAttribute idAttribute = new XmlSchemaAttribute(); idAttribute.Name = "CustomerId"; idAttribute.Use = XmlSchemaUse.Required;

Criar tipos esquema


O contedo do elementos e atributos definido por seus tipos. Do XmlSchemaElement para criar elementos e atributos cujos tipos so uma do esquema interna tipos, a SchemaTypeName propriedade do ou XmlSchemaAttribute classes esto definidas com o nome qualificado correspondente do tipo interno usando a XmlQualifiedName classe. Do XmlSchemaSimpleType para criar um tipo definido pelo usurio para elementos e atributos, um novo tipo simples ou complexos criado usando ou XmlSchemaComplexType Classe. Observao Para criar sem nome tipos simples ou complexos que sejam filhos de um elemento ou atributo annimos definir a SchemaType propriedade de. (somente tipos simples aplicar para atributos), ou XmlSchemaAttribute classes para o tipo simples ou complexos sem nome, em vez da SchemaTypeName propriedade do ou XmlSchemaAttribute Classes o XmlSchemaElement o XmlSchemaElement Esquemas XML permitir ambos annimo e simples nomeado tipos para ser derivado por restrio de outros tipos simples (internas ou definida pelo usurio) ou construdo como uma lista ou unio de outros tipos simples. A XmlSchemaSimpleTypeRestriction classe usada para criar um tipo

Visual C# Consolidado

844

simples, restringindo o tipo interno xs:string. Voc tambm pode usar ou XmlSchemaSimpleTypeUnion classes para criar tipos Lista ou unio. o XmlSchemaSimpleTypeList A System.Xml.Schema.XmlSchemaSimpleType.Content propriedade indica se ele uma restrio de tipo simples, lista, ou unio. No exemplo de cdigo a seguir, tipo do FirstName elemento o tipo xs:string interno, tipo do LastName elemento um tipo simples nomeado que uma restrio do tipo xs:string interno, com um MaxLength aspecto Valor de 20, e tipo do CustomerId atributo o tipo xs:positiveInteger interno. O Customer elemento um tipo complexo annimo cuja partcula a seqncia de. elementos e LastName cujos atributos contm o CustomerId atributo a FirstName Observao Voc tambm pode usar ou XmlSchemaAll Classes como a partcula do tipo complexo para duplicam <xs:choice /> ou <xs:all /> semntica. o XmlSchemaChoice C#
// Create the simple type for the LastName element. XmlSchemaSimpleType lastNameType = new XmlSchemaSimpleType(); lastNameType.Name = "LastNameType"; XmlSchemaSimpleTypeRestriction lastNameRestriction = new XmlSchemaSimpleTypeRestriction(); lastNameRestriction.BaseTypeName = new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema"); XmlSchemaMaxLengthFacet maxLength = new XmlSchemaMaxLengthFacet(); maxLength.Value = "20"; lastNameRestriction.Facets.Add(maxLength); lastNameType.Content = lastNameRestriction; // Associate the elements and attributes with their types. // Built-in type. firstNameElement.SchemaTypeName = new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema"); // User-defined type. lastNameElement.SchemaTypeName = new XmlQualifiedName("LastNameType", "http://www.tempuri.org"); // Built-in type. idAttribute.SchemaTypeName = new XmlQualifiedName("positiveInteger", "http://www.w3.org/2001/XMLSchema"); // Create the top-level Customer element. XmlSchemaElement customerElement = new XmlSchemaElement(); customerElement.Name = "Customer"; // Create an anonymous complex type for the Customer element. XmlSchemaComplexType customerType = new XmlSchemaComplexType(); XmlSchemaSequence sequence = new XmlSchemaSequence(); sequence.Items.Add(firstNameElement); sequence.Items.Add(lastNameElement); customerType.Particle = sequence; // Add the CustomerId attribute to the complex type. customerType.Attributes.Add(idAttribute); // Set the SchemaType of the Customer element to // the anonymous complex type created above. customerElement.SchemaType = customerType;

Criando e Compiling esquemas


Nesse ponto, os elementos filho e atributos, seus tipos correspondentes, e o elemento de nvel superior Customer ter sido criado usando a API som na memria. No exemplo de cdigo a seguir, o elemento de esquema criado usando a XmlSchema classe, a elementos de primeiro nvel e tipos so adicionados a ele usando a System.Xml.Schema.XmlSchema.Items propriedade e o esquema completa compilado usando a XmlSchemaSet classe e gravada para o console. C#
// Create an empty schema. XmlSchema customerSchema = new XmlSchema(); customerSchema.TargetNamespace = "http://www.tempuri.org"; // Add all top-level element and types to the schema customerSchema.Items.Add(customerElement); customerSchema.Items.Add(lastNameType); // Create an XmlSchemaSet to compile the customer schema. XmlSchemaSet schemaSet = new

Visual C# Consolidado

845

XmlSchemaSet(); schemaSet.ValidationEventHandler += new ValidationEventHandler(ValidationCallback); schemaSet.Add(customerSchema); schemaSet.Compile(); foreach (XmlSchema schema in schemaSet.Schemas()) { customerSchema = schema; } // Write the complete schema to the Console. customerSchema.Write(Console.Out);

O System.Xml.Schema.XmlSchemaSet.Compile mtodo valida o esquema do cliente contra as regras para um esquema XML e torna propriedades Post Schema--compilation disponveis. Observao Todas as propriedades Post Schema--compilation na API som diferem da Post Schema-Validation-InfoSet. O ValidationEventHandler um delegado que chama o mtodo ValidationCallback de retorno de chamada para tratar erros e avisos de validao de esquema. adicionados a XmlSchemaSet A seguir exemplo de cdigo completa, e o esquema do cliente gravados no console. C#
using System; using System.Xml; using System.Xml.Schema; class XmlSchemaCreateExample { static void Main(string[] args) { // Create the FirstName and LastName elements. XmlSchemaElement firstNameElement = new XmlSchemaElement(); firstNameElement.Name = "FirstName"; XmlSchemaElement lastNameElement = new XmlSchemaElement(); lastNameElement.Name = "LastName"; // Create CustomerId attribute. XmlSchemaAttribute idAttribute = new XmlSchemaAttribute(); idAttribute.Name = "CustomerId"; idAttribute.Use = XmlSchemaUse.Required; // Create the simple type for the LastName element. XmlSchemaSimpleType lastNameType = new XmlSchemaSimpleType(); lastNameType.Name = "LastNameType"; XmlSchemaSimpleTypeRestriction lastNameRestriction = new XmlSchemaSimpleTypeRestriction(); lastNameRestriction.BaseTypeName = new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema"); XmlSchemaMaxLengthFacet maxLength = new XmlSchemaMaxLengthFacet(); maxLength.Value = "20"; lastNameRestriction.Facets.Add(maxLength); lastNameType.Content = lastNameRestriction; // Associate the elements and attributes with their types. // Built-in type. firstNameElement.SchemaTypeName = new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema"); // User-defined type. lastNameElement.SchemaTypeName = new XmlQualifiedName("LastNameType", "http://www.tempuri.org"); // Built-in type. idAttribute.SchemaTypeName = new XmlQualifiedName("positiveInteger", "http://www.w3.org/2001/XMLSchema"); // Create the top-level Customer element. XmlSchemaElement customerElement = new XmlSchemaElement(); customerElement.Name = "Customer"; // Create an anonymous complex type for the Customer element. XmlSchemaComplexType customerType = new XmlSchemaComplexType(); XmlSchemaSequence sequence = new XmlSchemaSequence(); sequence.Items.Add(firstNameElement); sequence.Items.Add(lastNameElement); customerType.Particle = sequence; // Add the CustomerId attribute to the complex type. customerType.Attributes.Add(idAttribute); // Set the SchemaType of the Customer element to // the anonymous complex type created above. customerElement.SchemaType = customerType; // Create an empty schema. XmlSchema customerSchema = new XmlSchema(); customerSchema.TargetNamespace = "http://www.tempuri.org"; // Add all top-level element and types to the schema customerSchema.Items.Add(customerElement); customerSchema.Items.Add(lastNameType); //

Visual C# Consolidado

846

Create an XmlSchemaSet to compile the customer schema. XmlSchemaSet schemaSet = new XmlSchemaSet(); schemaSet.ValidationEventHandler += new ValidationEventHandler(ValidationCallback); schemaSet.Add(customerSchema); schemaSet.Compile(); foreach (XmlSchema schema in schemaSet.Schemas()) { customerSchema = schema; } // Write the complete schema to the Console. customerSchema.Write(Console.Out); } static void ValidationCallback(object sender, ValidationEventArgs args) { if (args.Severity == XmlSeverityType.Warning) Console.Write("WARNING: "); else if (args.Severity == XmlSeverityType.Error) Console.Write("ERROR: "); Console.WriteLine(args.Message); } } <?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:tns="http://www.tempuri.org" targetNamespace="http://www.tempuri.org" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Customer"> <xs:complexType> <xs:sequence> <xs:element name="FirstName" type="xs:string" /> <xs:element name="LastName" type="tns:LastNameType" /> </xs:sequence> <xs:attribute name="CustomerId" type="xs:positiveInteger" use="required" /> </xs:complexType> </xs:element> <xs:simpleType name="LastNameType"> <xs:restriction base="xs:string"> <xs:maxLength value="20" /> </xs:restriction> </xs:simpleType> </xs:schema>

Atravessando esquemas XML


Atravessando um Esquema XML usando o esquema Objeto Modelo (SOM) API fornece acesso a elementos, atributos, e tipos armazenados no SOM. Atravessando um XML esquema carregada no som tambm a primeira etapa da edio um Esquema XML usando a API som. Atravessando o esquema XML As seguintes propriedades da classe XmlSchema fornecem acesso coleo de todos os itens adicionados ao esquema XML globais. Propriedade Elements Attributes AttributeGroups Groups Includes Items Notations SchemaTypes UnhandledAttributes Observao Todas as propriedades listadas na tabela acima, exceto para a Items propriedade, so Post Schema--Compilation-InfoSet propriedades (PSCI) que no esto disponveis at que o esquema tiver sido compilada. A Items propriedade uma propriedade Pre Schema--compilation que pode ser usada antes o esquema tem foi compilada para acessar e editar todos os elementos nvel globais, atributos e tipos. Tipo de objeto armazenado na coleo ou matriz XmlSchemaElement XmlSchemaAttribute XmlSchemaAttributeGroup XmlSchemaGroup XmlSchemaExternalXmlSchemaInclude ou XmlSchemaRedefine, XmlSchemaImport (XmlSchemaObject fornece acesso a todos os elementos nvel globais, atributos e tipos.) XmlSchemaNotation XmlSchemaType, XmlSchemaSimpleType, XmlSchemaComplexType (XmlAttribute) fornece acesso a atributos que no pertencem ao espao para nome do esquema

Visual C# Consolidado

847

A UnhandledAttributes propriedade fornece acesso a todos os atributos que no pertencem ao espao para nome do esquema. Esses atributos no so processados pelo processador de esquema. O exemplo de cdigo a seguir demonstra atravessando o esquema do cliente criada no tpico Criando esquemas XML. O exemplo de cdigo demonstra atravessando o esquema usando as colees descritas acima e grava todos os elementos e atributos no esquema no console. O exemplo traverses o esquema do cliente nas etapas a seguir. 1. Adiciona o esquema do cliente para um novo XmlSchemaSet objeto e ento compila ele. Quaisquer avisos de validao de esquema e erros encontrados ler ou Compilar o esquema so tratados pelo ValidationEventHandler delegado. Do XmlSchemaSet recupera o objeto compilado XmlSchema por Iterando sobre a Schemas propriedade. Como o esquema compilada, POST Schema--Compilation-InfoSet propriedades (PSCI) so acessveis. Itera por cada XmlSchemaElement na coleo Values do POST-Schema - coleo de compilao System.Xml.Schema.XmlSchema.Elements gravar o nome de cada elemento para o console. Obtm o Customer elemento usando a XmlSchemaComplexType Classe de tipo complexo. Se o tipo complexo tem os atributos, obter e grava seu nome para o console. Para enumerar sobre cada XmlSchemaAttribute um IDictionaryEnumerator Obtm a partcula de seqncia do tipo complexo usando a XmlSchemaSequence classe. Itera por cada XmlSchemaElement na coleo System.Xml.Schema.XmlSchemaSequence.Items gravar o nome de cada elemento filho para o console.

2.

3.

4. 5. 6. 7.

A seguir o exemplo cdigo completo. C#


using System; using System.Collections; using System.Xml; using System.Xml.Schema; class XmlSchemaTraverseExample { static void Main() { // Add the customer schema to a new XmlSchemaSet and compile it. // Any schema validation warnings and errors encountered reading or // compiling the schema are handled by the ValidationEventHandler delegate. XmlSchemaSet schemaSet = new XmlSchemaSet(); schemaSet.ValidationEventHandler += new ValidationEventHandler(ValidationCallback); schemaSet.Add("http://www.tempuri.org", "customer.xsd"); schemaSet.Compile(); // Retrieve the compiled XmlSchema object from the XmlSchemaSet // by iterating over the Schemas property. XmlSchema customerSchema = null; foreach (XmlSchema schema in schemaSet.Schemas()) { customerSchema = schema; } // Iterate over each XmlSchemaElement in the Values collection // of the Elements property. foreach (XmlSchemaElement element in customerSchema.Elements.Values) { Console.WriteLine("Element: {0}", element.Name); // Get the complex type of the Customer element. XmlSchemaComplexType complexType = element.ElementSchemaType as XmlSchemaComplexType; // If the complex type has any attributes, get an enumerator // and write each attribute name to the console. if (complexType.AttributeUses.Count > 0) { IDictionaryEnumerator enumerator = complexType.AttributeUses.GetEnumerator(); while (enumerator.MoveNext()) { XmlSchemaAttribute attribute = (XmlSchemaAttribute)enumerator.Value; Console.WriteLine("Attribute: {0}", attribute.Name); } } // Get the sequence particle of the complex type. XmlSchemaSequence sequence =

Visual C# Consolidado

848

complexType.ContentTypeParticle as XmlSchemaSequence; // Iterate over each XmlSchemaElement in the Items collection. foreach (XmlSchemaElement childElement in sequence.Items) { Console.WriteLine("Element: {0}", childElement.Name); } } } static void ValidationCallback(object sender, ValidationEventArgs args) { if (args.Severity == XmlSeverityType.Warning) Console.Write("WARNING: "); else if (args.Severity == XmlSeverityType.Error) Console.Write("ERROR: "); Console.WriteLine(args.Message); } }

A System.Xml.Schema.XmlSchemaElement.ElementSchemaType propriedade pode ser XmlSchemaSimpleType, ou XmlSchemaComplexType se ele for um tipo simples definida pelo usurio ou um tipo complexo. Tambm pode ser XmlSchemaDatatype se ele um dos tipos de dados internos definido na Recomendao Esquema XML do W3C. No esquema do cliente, e a FirstName. do elemento Customer XmlSchemaComplexType, e LastName so XmlSchemaSimpleType elementos a ElementSchemaType Exemplo de cdigo no tpico Criando esquemas XML utilizado a System.Xml.Schema.XmlSchemaComplexType.Attributes coleo para adicionar o atributo CustomerId para o Customer elemento. Esta uma propriedade Pre Schema--compilation. A propriedade Post Schema--Compilation-InfoSet correspondente a System.Xml.Schema.XmlSchemaComplexType.AttributeUses coleo, que contm todos os atributos do tipo complexo, incluindo aqueles que so herdadas a derivao de tipo.

Editar Esquemas XML


Editar um esquema XML um dos recursos mais importantes do esquema Objeto Modelo (SOM). Todas as propriedades Pre Schema--compilation do som poder usar para alterar os valores existentes em um esquema XML. O esquema XML ento pode ser recompiled para refletir as alteraes. A primeira etapa na edio um esquema carregada no som para atravessar o esquema. Voc deve estar familiarizado com atravessando um esquema usando a API som antes de tentar editar um esquema. Voc tambm deve estar familiarizado com as propriedades e POST Schema-compilation antes do POST Schema--Compilation-InfoSet (PSCI). Editar um esquema XML Nesta seo, dois exemplos de cdigo so fornecidos, ambos os quais editar o esquema do cliente criada no tpico Criando esquemas XML. O primeiro exemplo de cdigo adiciona um novo PhoneNumber elemento para o Customer elemento e o segundo exemplo de cdigo adiciona um novo Title atributo para o FirstName elemento. O primeiro exemplo tambm usa o POST-Schema coleo de compilao System.Xml.Schema.XmlSchema.Elements como o meio de atravessando o esquema do cliente enquanto o segundo exemplo de cdigo usa o Pre-Schema - coleo de compilao System.Xml.Schema.XmlSchema.Items.

Exemplo do elemento PhoneNumber


Este primeiro exemplo de cdigo adiciona um novo PhoneNumber elemento para o Customer elemento do esquema do cliente. O exemplo de cdigo edita o esquema do cliente nas etapas a seguir. 1. Adiciona o esquema do cliente para um novo XmlSchemaSet objeto e ento compila ele. Quaisquer avisos de validao de esquema e erros encontrados ler ou Compilar o esquema so tratados pelo ValidationEventHandler delegado.

Visual C# Consolidado

849

2.

Do XmlSchemaSet recupera o objeto compilado XmlSchema por Iterando sobre a Schemas propriedade. Como o esquema compilada, POST Schema--Compilation-InfoSet propriedades (PSCI) so acessveis. Cria o PhoneNumber elemento usando a XmlSchemaElement classe, a xs:string restrio de tipo simples Usando. e XmlSchemaSimpleTypeRestriction classes, adiciona um aspecto padro propriedade Facets da restrio, e adiciona a restrio propriedade Content de tipo simples e o tipo simples para do elemento PhoneNumber o XmlSchemaSimpleType o SchemaType Itera por cada XmlSchemaElement na coleo Values do POST-Schema - coleo de compilao System.Xml.Schema.XmlSchema.Elements. Do QualifiedName se do elemento "Customer", obtm o Customer elemento usando a XmlSchemaComplexType classe e a partcula de seqncia do tipo complexo usando a XmlSchemaSequence Classe de tipo complexo. Adiciona o novo PhoneNumber elemento seqncia contendo o existente FirstName e LastName elementos usando o Pre-Schema - coleo de compilao Items da seqncia. Finalmente, reprocesses e compila o objeto modificado XmlSchema Usando e grava-para o console. e Compile mtodos de classe XmlSchemaSet a Reprocess

3.

4. 5.

6. 7.

A seguir o exemplo cdigo completo. C#


using System; using System.Xml; using System.Xml.Schema; class XmlSchemaEditExample { static void Main(string[] args) { // Add the customer schema to a new XmlSchemaSet and compile it. // Any schema validation warnings and errors encountered reading or // compiling the schema are handled by the ValidationEventHandler delegate. XmlSchemaSet schemaSet = new XmlSchemaSet(); schemaSet.ValidationEventHandler += new ValidationEventHandler(ValidationCallback); schemaSet.Add("http://www.tempuri.org", "customer.xsd"); schemaSet.Compile(); // Retrieve the compiled XmlSchema object from the XmlSchemaSet // by iterating over the Schemas property. XmlSchema customerSchema = null; foreach (XmlSchema schema in schemaSet.Schemas()) { customerSchema = schema; } // Create the PhoneNumber element. XmlSchemaElement phoneElement = new XmlSchemaElement(); phoneElement.Name = "PhoneNumber"; // Create the xs:string simple type restriction. XmlSchemaSimpleType phoneType = new XmlSchemaSimpleType(); XmlSchemaSimpleTypeRestriction restriction = new XmlSchemaSimpleTypeRestriction(); restriction.BaseTypeName = new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema"); // Add a pattern facet to the restriction. XmlSchemaPatternFacet phonePattern = new XmlSchemaPatternFacet(); phonePattern.Value = "\\d{3}-\\d{3}-\\d(4)"; restriction.Facets.Add(phonePattern); // Add the restriction to the Content property of the simple type // and the simple type to the SchemaType of the PhoneNumber element. phoneType.Content = restriction; phoneElement.SchemaType = phoneType; // Iterate over each XmlSchemaElement in the Values collection // of the Elements property. foreach (XmlSchemaElement element in customerSchema.Elements.Values) { // If the qualified name of the element is "Customer", // get the complex type of the Customer element // and the sequence particle of the complex type. if (element.QualifiedName.Name.Equals("Customer")) { XmlSchemaComplexType customerType = element.ElementSchemaType as XmlSchemaComplexType; XmlSchemaSequence sequence = customerType.Particle as XmlSchemaSequence; // Add the new PhoneNumber element to the sequence. sequence.Items.Add(phoneElement); } } // Reprocess and compile the modified XmlSchema object and write it to the console. schemaSet.Reprocess(customerSchema); schemaSet.Compile(); customerSchema.Write(Console.Out); } static void ValidationCallback(object sender,

Visual C# Consolidado

850

ValidationEventArgs args) { if (args.Severity == XmlSeverityType.Warning) Console.Write("WARNING: "); else if (args.Severity == XmlSeverityType.Error) Console.Write("ERROR: "); Console.WriteLine(args.Message); } }

A seguir o esquema do cliente modificado criada no tpico Criando esquemas XML.


<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:tns="http://www.tempuri.org" targetNamespace="http://www.tempuri.org" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Customer"> <xs:complexType> <xs:sequence> <xs:element name="FirstName" type="xs:string" /> <xs:element name="LastName" type="tns:LastNameType" /> <xs:element name="PhoneNumber"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="\d{3}\d{3}-\d(4)" /> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> <xs:attribute name="CustomerId" type="xs:positiveInteger" use="required" / > </xs:complexType> </xs:element> <xs:simpleType name="LastNameType"> <xs:restriction base="xs:string"> <xs:maxLength value="20" /> </xs:restriction> </xs:simpleType> </xs:schema>

Exemplo do atributo de ttulo


Este exemplo de cdigo segundo, adiciona um novo Title atributo para o FirstName elemento do esquema do cliente. No primeiro exemplo de cdigo, o tipo do elemento FirstName xs:string. Para o FirstName elemento para que um atributo junto com contedo de seqncia, seu tipo deve ser alterado para um tipo complexo com um modelo de contedo simples de extenso contedo. O exemplo de cdigo edita o esquema do cliente nas etapas a seguir. 1. Adiciona o esquema do cliente para um novo XmlSchemaSet objeto e ento compila ele. Quaisquer avisos de validao de esquema e erros encontrados ler ou Compilar o esquema so tratados pelo ValidationEventHandler delegado. Do XmlSchemaSet recupera o objeto compilado XmlSchema por Iterando sobre a Schemas propriedade. Como o esquema compilada, POST Schema--Compilation-InfoSet propriedades (PSCI) so acessveis. Cria um novo tipo complexo para o FirstName elemento usando a XmlSchemaComplexType classe. Do XmlSchemaSimpleContent cria uma nova extenso de contedo simples, com um tipo base de xs:string, usando e XmlSchemaSimpleContentExtension Classes. Cria o novo Title atributo usando a XmlSchemaAttribute classe, COM e adiciona o atributo extenso de contedo simples. de xs:string um SchemaTypeName Define o modelo de contedo do contedo simples para a extenso de contedo simples e o modelo de contedo do tipo complexo para o contedo simples. Adiciona o novo tipo complexo para o Pre-Schema - coleo de compilao System.Xml.Schema.XmlSchema.Items. Itera por cada XmlSchemaObject no Pre-Schema - coleo de compilao System.Xml.Schema.XmlSchema.Items.

2.

3. 4. 5. 6. 7. 8.

Observao Do System.Xml.Schema.XmlSchema.Items porque o FirstName elemento um elemento global no no esquema, no est disponvel em ou System.Xml.Schema.XmlSchema.Elements Colees. O exemplo de cdigo localiza o FirstName elemento, localizando o Customer elemento

Visual C# Consolidado

851

primeiro. O primeiro exemplo de cdigo traversed o esquema usando o POST-Schema - coleo de compilao System.Xml.Schema.XmlSchema.Elements. Neste exemplo, o Pre-schema -. coleo de compilao System.Xml.Schema.XmlSchema.Items usada para atravessar o esquema Enquanto as duas colees fornecem acesso aos elementos globais no esquema, Iterando atravs da Items coleo mais demorada porque voc deve iterar sobre todos os elementos no esquema globais e ele no tem nenhuma propriedade PSCI. As colees PSCI (System.Xml.Schema.XmlSchema.Elements., System.Xml.Schema.XmlSchema.Attributes) fornecer acesso direto a seus elementos globais, atributos, e tipos e suas propriedades PSCI, System.Xml.Schema.XmlSchema.SchemaTypes, e assim por diante 1. Se cujos QualifiedName "Customer", obtm do elemento Customer usando a XmlSchemaComplexType classe e a partcula de seqncia do tipo complexo usando a XmlSchemaSequence classe tipo complexo. um elemento, o XmlSchemaObject Itera por cada XmlSchemaParticle no Pre-Schema - coleo de compilao System.Xml.Schema.XmlSchemaSequence.Items. Se que. um elemento, o QualifiedName "FirstName", define do elemento FirstName para o novo FirstName tipo complexo ao XmlSchemaParticleSchemaTypeName Finalmente, reprocesses e compila o objeto modificado XmlSchema Usando e grava-para o console. e Compile mtodos de classe XmlSchemaSet a Reprocess

2. 3. 4.

A seguir o exemplo cdigo completo. C#


using System; using System.Xml; using System.Xml.Schema; class XmlSchemaEditExample { static void Main(string[] args) { // Add the customer schema to a new XmlSchemaSet and compile it. // Any schema validation warnings and errors encountered reading or // compiling the schema are handled by the ValidationEventHandler delegate. XmlSchemaSet schemaSet = new XmlSchemaSet(); schemaSet.ValidationEventHandler += new ValidationEventHandler(ValidationCallback); schemaSet.Add("http://www.tempuri.org", "customer.xsd"); schemaSet.Compile(); // Retrieve the compiled XmlSchema object from the XmlSchemaSet // by iterating over the Schemas property. XmlSchema customerSchema = null; foreach (XmlSchema schema in schemaSet.Schemas()) { customerSchema = schema; } // Create a complex type for the FirstName element. XmlSchemaComplexType complexType = new XmlSchemaComplexType(); complexType.Name = "FirstNameComplexType"; // Create a simple content extension with a base type of xs:string. XmlSchemaSimpleContent simpleContent = new XmlSchemaSimpleContent(); XmlSchemaSimpleContentExtension simpleContentExtension = new XmlSchemaSimpleContentExtension(); simpleContentExtension.BaseTypeName = new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema"); // Create the new Title attribute with a SchemaTypeName of xs:string // and add it to the simple content extension. XmlSchemaAttribute attribute = new XmlSchemaAttribute(); attribute.Name = "Title"; attribute.SchemaTypeName = new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema"); simpleContentExtension.Attributes.Add(attribute); // Set the content model of the simple content to the simple content extension // and the content model of the complex type to the simple content. simpleContent.Content = simpleContentExtension; complexType.ContentModel = simpleContent; // Add the new complex type to the pre-schema-compilation Items collection. customerSchema.Items.Add(complexType); // Iterate over each XmlSchemaObject in the pre-schemacompilation // Items collection. foreach (XmlSchemaObject schemaObject in customerSchema.Items) { // If the XmlSchemaObject is an element, whose QualifiedName // is "Customer", get the complex type of the

Visual C# Consolidado

852

Customer element // and the sequence particle of the complex type. if (schemaObject is XmlSchemaElement) { XmlSchemaElement element = schemaObject as XmlSchemaElement; if (element.QualifiedName.Name.Equals("Customer")) { XmlSchemaComplexType customerType = element.ElementSchemaType as XmlSchemaComplexType; XmlSchemaSequence sequence = customerType.Particle as XmlSchemaSequence; // Iterate over each XmlSchemaParticle in the pre-schemacompilation // Items property. foreach (XmlSchemaParticle particle in sequence.Items) { // If the XmlSchemaParticle is an element, who's QualifiedName // is "FirstName", set the SchemaTypeName of the FirstName element // to the new FirstName complex type. if (particle is XmlSchemaElement) { XmlSchemaElement childElement = particle as XmlSchemaElement; if (childElement.Name.Equals("FirstName")) { childElement.SchemaTypeName = new XmlQualifiedName("FirstNameComplexType", "http://www.tempuri.org"); } } } } } } // Reprocess and compile the modified XmlSchema object and write it to the console. schemaSet.Reprocess(customerSchema); schemaSet.Compile(); customerSchema.Write(Console.Out); } static void ValidationCallback(object sender, ValidationEventArgs args) { if (args.Severity == XmlSeverityType.Warning) Console.Write("WARNING: "); else if (args.Severity == XmlSeverityType.Error) Console.Write("ERROR: "); Console.WriteLine(args.Message); } }

A seguir o esquema do cliente modificado criada no tpico Criando esquemas XML.


<?xml version="1.0" encoding=" utf-8"?> <xs:schema xmlns:tns="http://www.tempuri.org" targetNamespace="http://www.tempuri.org" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Customer"> <xs:complexType> <xs:sequence> <xs:element name="FirstName" type="tns:FirstNameComplexType" /> <xs:element name="LastName" type="tns:LastNameType" /> </xs:sequence> <xs:attribute name="CustomerId" type="xs:positiveInteger" use="required" / > </xs:complexType> </xs:element> <xs:simpleType name="LastNameType"> <xs:restriction base="xs:string"> <xs:maxLength value="20" /> </xs:restriction> </xs:simpleType> <xs:complexType name="FirstNameComplexType"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="Title" type="xs:string" /> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:schema>

Incluindo ou importar esquemas XML


Um esquema XML pode conter <xs:import />, <xs:include />,. e <xs:redefine /> elementos Esses elementos de esquema consultar outros esquemas XML podem ser usadas para complementar a estrutura do esquema que inclui ou importa-los. O XmlSchemaImport, XmlSchemaInclude e XmlSchemaRedefine classes, mapeie para esses elementos no esquema Objeto modelo o som (API). Incluindo ou importando um esquema XML O exemplo de cdigo a seguir complementa o esquema do cliente criada no tpico Criando esquemas XML com o esquema de endereo. Supplementing o esquema do cliente com o esquema de endereo torna tipos de endereo disponvel no esquema do cliente. O esquema de endereo pode ser incorporada usando uma <xs:include /> ou <xs:import /> elementos para usar os componentes do esquema de endereo como. - , ou usando um <xs:redefine /> elemento para modificar qualquer um dos seus componentes para atender a necessidade do esquema do cliente Como o esquema de endereo tem uma targetNamespace que diferente do esquema do cliente, o <xs:import /> elemento e portanto semntica de importao usada.

Visual C# Consolidado

853

O exemplo de cdigo inclui o esquema de endereo nas etapas a seguir. 1. Adiciona o esquema do cliente e o esquema de endereo a um novo XmlSchemaSet objeto e ento compila-los. Quaisquer avisos de validao de esquema e erros encontrados ler ou compilar os esquemas so tratados pelo ValidationEventHandler delegado. Do XmlSchemaSet recupera os objetos compilados XmlSchema para esquemas tanto o cliente e endereo de por Iterando sobre a Schemas propriedade. Como os esquemas so compiladas, POST Schema--Compilation-InfoSet propriedades (PSCI) so acessveis. Cria um XmlSchemaImport objeto, define a Namespace Propriedade da importao ao espao para nome do esquema do endereo, define a Schema Propriedade da importao para o XmlSchema objeto do esquema de endereo, e adiciona a importao Includes propriedade do esquema do cliente. Reprocesses e compila o objeto modificado XmlSchema do esquema usando o do cliente e grava-para o console. e Compile mtodos de classe XmlSchemaSet a Reprocess Finalmente, recursivamente grava todos os os esquemas importadas para o esquema do cliente para o console usando a Includes propriedade do esquema do cliente. Do a Includes propriedade fornece acesso a todos inclui, importaes, ou redefines adicionado a um esquema.

2.

3.

4. 5.

A seguir exemplo de cdigo concluda e os esquemas Cliente e Endereo gravadas o console. C#


using System; using System.Xml; using System.Xml.Schema; class XmlSchemaImportExample { static void Main(string[] args) { // Add the customer and address schemas to a new XmlSchemaSet and compile them. // Any schema validation warnings and errors encountered reading or // compiling the schemas are handled by the ValidationEventHandler delegate. XmlSchemaSet schemaSet = new XmlSchemaSet(); schemaSet.ValidationEventHandler += new ValidationEventHandler(ValidationCallback); schemaSet.Add("http://www.tempuri.org", "customer.xsd"); schemaSet.Add("http://www.example.com/IPO", "address.xsd"); schemaSet.Compile(); // Retrieve the compiled XmlSchema objects for the customer and // address schema from the XmlSchemaSet by iterating over // the Schemas property. XmlSchema customerSchema = null; XmlSchema addressSchema = null; foreach (XmlSchema schema in schemaSet.Schemas()) { if (schema.TargetNamespace == "http://www.tempuri.org") customerSchema = schema; else if (schema.TargetNamespace == "http://www.example.com/IPO") addressSchema = schema; } // Create an XmlSchemaImport object, set the Namespace property // to the namespace of the address schema, the Schema property // to the address schema, and add it to the Includes property // of the customer schema. XmlSchemaImport import = new XmlSchemaImport(); import.Namespace = "http://www.example.com/IPO"; import.Schema = addressSchema; customerSchema.Includes.Add(import); // Reprocess and compile the modified XmlSchema object // of the customer schema and write it to the console. schemaSet.Reprocess(customerSchema); schemaSet.Compile(); customerSchema.Write(Console.Out); // Recursively write all of the schemas imported into the // customer schema to the console using the Includes // property of the customer schema. RecurseExternals(customerSchema); } static void RecurseExternals(XmlSchema schema) { foreach (XmlSchemaExternal external in schema.Includes) { if (external.SchemaLocation != null) { Console.WriteLine("External SchemaLocation: {0}", external.SchemaLocation); } if (external is XmlSchemaImport) { XmlSchemaImport import = external as XmlSchemaImport; Console.WriteLine("Imported namespace: {0}", import.Namespace); } if (external.Schema != null) { external.Schema.Write(Console.Out); RecurseExternals(external.Schema); } } } static void ValidationCallback(object sender, ValidationEventArgs args) { if (args.Severity ==

Visual C# Consolidado

854

XmlSeverityType.Warning) Console.Write("WARNING: "); else if (args.Severity == XmlSeverityType.Error) Console.Write("ERROR: "); Console.WriteLine(args.Message); } } <?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:tns="http://www.tempuri.org" targetNamespace="http://www.tempuri.org" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:import namespace="http://www.example.com/IPO" /> <xs:element name="Customer"> <xs:complexType> <xs:sequence> <xs:element name="FirstName" type="xs:string" /> <xs:element name="LastName" type="tns:LastNameType" /> </xs:sequence> <xs:attribute name="CustomerId" type="xs:positiveInteger" use="required" / > </xs:complexType> </xs:element> <xs:simpleType name="LastNameType"> <xs:restriction base="xs:string"> <xs:maxLength value="20" /> </xs:restriction> </xs:simpleType> </xs:schema> <schema targetNamespace="http://www.example.com/IPO" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ipo="http://www.example.com/IPO"> <annotation> <documentation xml:lang="en"> Addresses for International Purchase order schema Copyright 2000 Example.com. All rights reserved. </documentation> </annotation> <complexType name="Address"> <sequence> <element name="name" type="string"/> <element name="street" type="string"/> <element name="city" type="string"/> </sequence> </complexType> <complexType name="USAddress"> <complexContent> <extension base="ipo:Address"> <sequence> <element name="state" type="ipo:USState"/> <element name="zip" type="positiveInteger"/> </sequence> </extension> </complexContent> </complexType> <!-- other Address derivations for more countries or regions --> <simpleType name="USState"> <restriction base="string"> <enumeration value="AK"/> <enumeration value="AL"/> <enumeration value="AR"/> <!-- and so on ... --> </restriction> </simpleType> </schema>

Para obter mais informaes sobre e XmlSchemaRedefine classes, consulte documentao de referncia de classe espao para nome e Especificaes do esquema do W3C XML a System.Xml.Schema., e <xs:redefine /> elementos e XmlSchemaImport, XmlSchemaInclude a <xs:import />, <xs:include />

Integrao XML com dados relacional e ADO.NET


A XmlDataDocument classe uma classe derivada de e contm dados XML. o XmlDocument, A vantagem de que ele fornece uma ponte entre dados relacionais e hierrquico. o XmlDataDocument um XmlDocument que pode ser vinculados a e ambas as classes podem sincronizar alteraes feitas nos dados contidos em duas classes. um DataSet Um XmlDocument que esteja vinculado ao permite XML para integrar com dados relacionais, e voc que no tm com os dados representados como o XML ou em um formato Relacional. um DataSet Voc pode fazer ambos e no ser restrito a um nica representao dos dados. Os benefcios de ter dados em dois modos de exibio disponveis so:

A parte do documento XML estruturada pode ser mapeado para um DataSet, e ser eficiente armazenados, indexado, e pesquisados. Transformaes, validao e navegao pode ser feito com eficincia atravs de um modelo Cursor em vez dos dados XML que so armazenados relationally. s vezes, ele pode ser feito com mais eficincia em estruturas que se o XML ser armazenado em um XmlDocument modelo relacionais. O DataSet pode armazenar uma parte do XML. Isto , voc pode usar XPath ou XslTransform Para armazenar a. apenas os elementos e atributos de juros um DataSet A partir da, as alteraes podem ser feitas o subconjunto de dados, menores e filtrados com as alteraes propagando aos dados maiores no XmlDataDocument.

Visual C# Consolidado

855

Voc tambm pode executar uma transformao sobre os dados que foi carregados em do SQL Server. o DataSet Outra opo para vincular WinForm gerenciados classes-Estilo- .NET Framework e controles WebForm para uma DataSet que foi preenchido de um fluxo de entrada XML. Alm de suporte XslTransform, um XmlDataDocument Dados Relacionais expe para XPath consultas e validao. Basicamente, todos os servios XML esto disponveis sobre dados relacionais, e instalaes relacionais como vnculo de controle, CodeGen, e assim por diante, esto disponveis sobre uma projeo de XML estruturada sem comprometer fidelidade XML. Porque XmlDataDocument herdada de um XmlDocument, ele fornece uma implementao de DOM W3C. O fato de alguma forma. que associado a, e armazenar um subconjunto de seus dados em, um DataSet faz no restringir ou alterar seu uso como a XmlDataDocument uma XmlDocument Cdigo escrito para consumir um XmlDocument funciona inalterado contra um XmlDataDocument. O DataSet Fornece exibio relacional dos mesmos dados definindo tabelas, colunas, relaes, e restries, e um armazenamento de dados do usurio Autnomo, na memria. A ilustrao a seguir mostra as associaes diferentes que dados XML tem com e XmlDataDocument. o DataSet

A ilustrao mostra dados XML que podem ser carregados diretamente em que permite a manipulao direta com XML da maneira Relacional. a DataSet, Ou, o XML pode ser carregado em uma classe de DOM, que o XmlDataDocument, e posteriormente carregado e sincronizado com derivado o DataSet.. o DataSet Porque as alteraes feitas aos dados em um armazenamento de dados, so refletidas no outro armazenamento. e XmlDataDocument esto sincronizados em um nico conjunto a DataSet Do XmlDocument o XmlDataDocument herda todos os recursos de edio e navegao. H momentos ao usar. e seus recursos herdados, sincronizados com uma opo mais apropriada que carregar XML diretamente na XmlDataDocument a DataSet, o DataSet A tabela a seguir mostra os itens a serem considerados ao escolher o mtodo a ser usado para carregar o DataSet. Quando se carregar XML diretamente para um DataSet Quando se sincronizar um XmlDataDocument com um DataSet

Consultas de dados na DataSet so mais fcil com Consultas XPath so necessrias sobre os SQL que XPath. dados no DataSet. Preservao do elemento ordenao no cdigofonte XML no crtica. Espao em branco entre elementos e formatao no precise ser preservado no cdigo-fonte XML. Preservao do elemento ordenao no cdigo-fonte XML essencial. Espao em branco e formatao manuteno no cdigo-fonte XML crtica.

Visual C# Consolidado

856

Se carregar e gravar XML diretamente em e fora de um DataSet Endereos suas necessidades, consulte Carregar um DataSet de XML e Gravar um DataSet como dados XML. Do DataSet se carregando de um XmlDataDocument Endereos suas necessidades, consulte Sincronizando um Datasetwith um documento XML.

Resolver externos recursos XML nomeados por um URI


O XmlResolver uma classe abstrata que localiza externos recursos XML que tiver sido nomeados por um URI. usado para carregar documentos XML, e para resolver externos recursos, como entidades, DTDs ou esquemas, e importar ou incluir diretivas. As XmlResolver alas digite todos os aspectos do negociar a conexo com os recursos, inclusive tratamento credenciais de segurana, abrindo a conexo com a fonte de dados, e retornar o recurso sob a forma de um fluxo ou outro objeto. O.NET Framework inclui duas implementaes da classe XmlResolver.

A XmlUrlResolver classe o resolvedor padro para todas as classes no espao para nome System.Xml. Do file:// oferece suporte e http:// Protocolos e solicitaes a partir da WebRequest classe. Em muitos casos, se voc no especificar um XmlResolver objeto que seu aplicativo deve usar, um XmlUrlResolver objeto COM sem credenciais de usurio usado para acessar recursos XML. A XmlSecureResolver classe ajuda a proteger outro XmlResolver objeto, disposio o XmlResolver objeto e restringindo os recursos que base XmlResolver tem acesso ao. Por exemplo, a XmlSecureResolver classe pode proibir acesso a determinado sites ou zonas.

Resolvendo recursos usando o XmlResolver


A XmlValidatingReader classe usa XmlResolver para resolver externos DTDs, entidades, e esquemas. A fim de resolver esses recursos externos, a XmlResolver propriedade no XmlValidatingReader deve ser definida. O exemplo a seguir mostra como definir o resolvedor para resolver um recurso DTD externo utilizado pelo XmlValidatingReader. C#
XmlValidatingReader vreader = new XmlValidatingReader(new XmlTextReader("http://www.alpineskihouse.org/abc.xml")); vreader.XmlResolver = new XmlUrlResolver(); while(vreader.Read()) { . . . }

Para resolver um DTD, XmlValidatingReader chama o GetEntity mtodo para obter uma representao de fluxo da entidade. Se o URI do DTD for um URI relativo,, XmlValidatingReader chama o ResolveUri mtodo e retorna um URI absoluto para e baseUri. fornecido relativeUri a Se XmlResolver no sabe como resolver o Uri determinado, ento ele retornar uma null referncia. Alm disso, se as configuraes de segurana forem necessrios para acessar o recurso externo,, a Credentials propriedade pode ser definida de acordo. Essa propriedade permite ao usurio para definir configuraes de autenticao para URIs. Para obter mais informaes sobre fornecer credenciais, consulte Fornecer credenciais de autenticao para XmlResolver quando leitura de um arquivo. O GetEntity mtodo em usa XmlUrlResolver as informaes na Credentials propriedade como apropriado para obter acesso ao recurso. No h nenhum get acessador para esta propriedade por razes de segurana. Ao substituir XmlResolver, GetEntity o mtodo que utiliza as informaes de credenciais na Credentials propriedade.

Visual C# Consolidado

857

Se voc no fornecer a ser usado, em seguida um padro XmlUrlResolver criado e null credenciais so usados. para um XmlResolver o XmlValidatingReader Resolver todos os outros recursos XML muito semelhante a resolver DTDs. XmlResolver. precisa saber apenas como negociar a conexo com o recurso externo, e retornar uma representao de fluxo de contedo Ele o objeto que est fazendo a chamada para XmlResolver que tenha a tarefa de interpretar o fluxo.

Fornecer credenciais de autenticao para XmlResolver quando leitura de um arquivo


Ao resolver uma URL para um arquivo que contm os dados XML para leitura, o arquivo pode ter uma diretiva de acesso restrito. Se a autenticao for necessria para acessar um recurso de rede, use a Credentials propriedade para especificar as credenciais necessrias. Se a Credentials propriedade no est definida, ento credenciais sero configuradas para null. Por exemplo, suponha que as credenciais so necessrias ao solicitar dados a partir da Web para fins de autenticao. Se o diretrio virtual da Web permitir acesso annimo, ento a propriedade no precisa a ser definido para acesso annimo. No entanto, se a pasta no permitir acesso annimo, ento voc precisar fornecer credenciais. O exemplo a seguir cria um XmlReader que usa com credenciais padro para acessar o site http://localhost/bookstore/Inventory.xml. um XmlUrlResolver C#
// Create a resolver with default credentials. XmlUrlResolver resolver = new XmlUrlResolver(); resolver.Credentials = System.Net.CredentialCache.DefaultCredentials; // Set the reader settings object to use the resolver. settings.XmlResolver = resolver; // Create the XmlReader object. XmlReader reader = XmlReader.Create("http://ServerName/data/books.xml", settings);

Credenciais diferentes podem ser fornecidos para URIs diferentes e adicionados a um cache de credenciais. Essas credenciais so usados para verificar autenticao para o URIs independentemente da fonte original do XML diferentes. A seguir mostra exemplo adicionando credenciais a um cache. C#
// Create the credentials. NetworkCredential myCred = new NetworkCredential(UserName,SecurelyStoredPassword,Domain); CredentialCache myCache = new CredentialCache(); myCache.Add(new Uri("http://www.contoso.com/"), "Basic", myCred); myCache.Add(new Uri("http://app.contoso.com/"), "Basic", myCred); // Set the credentials on the XmlUrlResolver object. XmlUrlResolver resolver = new XmlUrlResolver(); resolver.Credentials = myCache; // Compile the style sheet. XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load("http://serverName/data/xsl/order.xsl",XsltSettings.Default, resolver);

Como usar a classe XmlSecureResolver:


A XmlSecureResolver classe ajuda a proteger outro XmlResolver objeto, disposio o XmlResolver objeto e restringindo os recursos que base XmlResolver tem acesso ao. Por exemplo, a XmlSecureResolver classe pode proibir acesso a determinado sites ou zonas. Para restringir o acesso usando uma URL

Visual C# Consolidado

858

Criar um XmlSecureResolver objeto somente que tem permisso para acessar o site da intranet local. C#
XmlSecureResolver myResolver = new XmlSecureResolver(new XmlUrlResolver(), "http://myLocalSite/");

Para restringir o acesso usando uma permisso defina 1. Criar um WebPermission objeto. C#
WebPermission myWebPermission = new WebPermission(PermissionState.None);

2.

Permitir acesso apenas s seguintes URLs dois. C#


myWebPermission.AddPermission(NetworkAccess.Connect,"http://www.contoso.com/"); myWebPermission.AddPermission(NetworkAccess.Connect,"http://litwareinc.com/data/");

3.

Adicionar as permisses da Web ao objeto PermissionSet. C#


PermissionSet myPermissions = new PermissionSet(PermissionState.None); myPermissions.AddPermission(myWebPermission);

4.

Crie um XmlSecureResolver objeto usando o conjunto de permisses. C#


XmlSecureResolver myResolver = new XmlSecureResolver(new XmlUrlResolver(), myPermissions);

Para restringir o acesso usando provas

Voc pode restringir o acesso usando Evidence. O Evidence aplicada a base XmlResolver. usado para criar o PermissionSet que As XmlSecureResolver chamadas PermitOnly No criado PermissionSet antes de abrir os recursos. A lista a seguir resume alguns cenrios possveis e o tipo de prova para fornecer para cada cenrio.

Voc estiver trabalhando em um ambiente totalmente confiveis: Use seu conjunto para criar as provas. C#
Evidence myEvidence = this.GetType().Assembly.Evidence; XmlSecureResolver myResolver; myResolver = new XmlSecureResolver(new XmlUrlResolver(), myEvidence);

Voc est trabalhando em um ambiente semiconfivel e voc tiver cdigo ou dados provenientes de uma fonte externa. Voc sabe a origem da fonte externa e tiver um URI que pode ser verificada: Use o URI para criar as provas. C#
Evidence myEvidence = XmlSecureResolver.CreateEvidenceForUrl(sourceURI); XmlSecureResolver myResolver = new XmlSecureResolver(new XmlUrlResolver(), myEvidence);

Voc esto trabalhando em um ambiente semiconfivel e voc tiver cdigo ou dados provenientes de uma fonte externa e voc no souber a origem da fonte externa: Definir o evidence Parmetro para null. Isso permite sem acesso aos recursos.

Visual C# Consolidado

859

OuSe seu aplicativo exigir alguns acesso aos recursos, solicitar evidncia do chamador. Use o XmlSecureResolver para resolver recursos XML A XmlUrlResolver classe o resolvedor padro para todas as classes no espao para nome System.Xml. usado para carregar documentos XML, e para resolver externos recursos, como entidades, DTDs ou esquemas, e importar ou incluir diretivas. Voc pode substitu-lo, especificando o XmlResolver objeto para utilizar. Especificando voc pode restringir os recursos que base XmlResolver pode acessar. an XmlSecureResolver, Para criar um objeto XmlReader que usa um XmlSecureResolver 1. 2. Criar Definir com a permisso correta. um XmlSecureResolver Criar um XmlReaderSettings objeto que usa o XmlSecureResolver objeto. C#
XmlReaderSettings settings = new XmlReaderSettings(); settings.XmlResolver = myResolver;

3.

Use o XmlReaderSettings objeto para criar o XmlReader objeto. C#


XmlReader reader = XmlReader.Create("books.xml", settings);

Para usar o XmlSecureResolver para carregar um folha de estilo XSLT


1. 2. Criar Definir com a permisso correta. um XmlSecureResolver Do XmlSecureResolver passar para o Load mtodo. C#
XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load("http://serverName/data/xsl/sort.xsl", null, myResolver);

Codificao de caracteres de nomes XML e converso de tipos de dados XML


O XmlConvert uma classe de suporte que codifica e decodifica nomes, bem como converte tipos de dados. A XmlConvert classe funcionalmente equivalente para o Classe System.Convert, mas com um partiality com os padres XML. O sistema tipo baseado no esquema XML tipo do esquema de idioma (XSD) de definio, e os valores retornados so sempre independente localidade.

Espaos para nomes em um documento XML


Espaos para nome XML associar nomes de elemento e atributo em um documento XML a URIs personalizados e predefinidos. Os prefixos definidos para espao para nome URIs so usados para qualificar nomes das elemento e atributo nos dados XML para implementar essa associao. Espaos para nomes impedir conflitos Nome de elemento e atributo, e permite elementos e atributos com o mesmo nome a ser tratada de forma diferente e validada de forma diferente.

Visual C# Consolidado

860

Suporte tipo nas classes System.Xml


No.NET Framework verso 2.0, as classes principais XML foram aprimoradas para incluir recursos de suporte tipo. O XmlWriterXmlReader,. e XPathNavigator Classes incluir recursos suporte tipo incluindo a capacidade para converter entre tipos de esquema XML e tipos Runtime (CLR) de idioma comum No.NET Framework verso 2.0, o XmlReader, XmlWriter., e XPathNavigator Classes foram aprimorados para incluir recursos de suporte tipo

O XmlReader e XPathNavigator Classes cada incluir uma SchemaInfo propriedade que retorna as informaes de esquema em um n. O ReadContentAs e mtodos na classe XmlReader ler um valor de texto e convert-la em um valor CLR em um nico chamada de mtodo. e ReadElementContentAs O WriteValue mtodo na classe XmlWriter converte um tipo Clr em um tipo de esquema XML ao escrever fora XML. O ValueAs e TypedValue propriedades na XPathNavigator classe retornar um valor de n e convert-la em um valor CLR em um nico chamada de mtodo. Observao

No.NET Framework verso 1.0 a XmlConvert classe era necessrio para converter entre tipos de esquema XML e CLR.

Mapear tipos de dados XML para tipos CLR


A tabela a seguir descreve o mapeamento padro entre os tipos de dados XML e os tipos Runtime (CLR) de idioma comuns. A tabela a seguir descreve os mapeamentos padro de um tipo de dados XML para um tipo Clr. Observao Prefixos e xs a xdt so mapeados para a http://www.w3.org/2001/XMLSchema e o espao para nome http://www.w3.org/2003/05/XPath-datatypes URIs respectivamente. Tipo XML xs:anyURI xs:base64Binary xs:boolean xs:byte xs:date xs:dateTime xs:decimal xs:double xs:duration xs:ENTITIES Tipo Clr Uri Byte[] Boolean SByte DateTime DateTime Decimal Double TimeSpan String[]

Visual C# Consolidado

861

xs:ENTITY xs:float xs:gDay xs:gMonthDay xs:gYear xs:gYearMonth xs:hexBinary xs:ID xs:IDREF xs:IDREFS xs:int xs:integer xs:language xs:long xs:gMmonth xs:Name xs:NCName xs:negativeInteger xs:NMTOKEN xs:NMTOKENS xs:nonNegativeInteger xs:nonPositiveInteger xs:normalizedString xs:NOTATION xs:positiveInteger xs:QName xs:short xs:string xs:time xs:token xs:unsignedByte xs:unsignedInt xs:unsignedLong xs:unsignedShort

String Single DateTime DateTime DateTime DateTime Byte[] String String String[] Int32 Decimal String Int64 DateTime String String Decimal String String[] Decimal Decimal String XmlQualifiedName Decimal XmlQualifiedName Int16 String DateTime String Byte UInt32 UInt64 UInt16

Visual C# Consolidado

862

xdt:dayTimeDuration xdt:yearMonthDuration xdt:untypedAtomic xdt:anyAtomicType xs:anySimpleType N de documento N de elemento N de Atributo N NameSpace N texto N comentrio N de instruo de processamento

TimeSpan TimeSpan String Object String XPathNavigator XPathNavigator XPathNavigator XPathNavigator XPathNavigator XPathNavigator XPathNavigator

Observaes de implementao de suporte tipo XML


Este tpico descreve alguns detalhes de implementao que voc deseja que esteja ciente das. Mapeamentos lista O IList, ICollection e String Tipos so usados para representar tipos Lista de idioma (XSD) de definio Esquema XML., IEnumerable, Type[] Mapeamentos de unio Do XmlAtomicValue Tipos UNION so representados usando ou String TIPO. O tipo de fonte ou tipo de destino, portanto, deve sempre ser String ou XmlAtomicValue. Se o XmlSchemaDatatype objeto representa um tipo de lista ao objeto converter o valor seqncia de entrada a uma lista de um ou mais objetos. Se a XmlSchemaDatatype representa uma unio Digite ento uma tentativa ser feita para analisar o valor de entrada como um tipo membro da unio. Se falhar a tentativa de Anlise depois a converso feita com o prximo membro da unio e assim por diante at que a converso seja bem-sucedida, ou existem outros tipos nenhum membro para tentar, nesse caso, uma exceo gerada. Diferenas entre CLR e tipos de dados XML A seguir descreve determinadas diferenas que podem ocorrer entre tipos CLR e tipos de dados XML e como eles so tratados. Observao O xs prefixo mapeado para o http://www.w3.org/2001/XMLSchema e espao para nome URI.

System.TimeSpan e xs:duration

Visual C# Consolidado

863

O xs:duration tipo parcialmente ordenado em que existem determinados valores de durao que so diferente, porm equivalente. Isso significa que para o xs:duration tipo valor como 1 ms (P1M) menor que dias 32 (P32D), maiores que (P27D) dias 27 e equivalente a 28, 29 ou 30 dias. A TimeSpan classe no oferece suporte parcial este pedido. Em vez disso, ele seleciona um nmero especfico de dias para 1 ano e ms 1; 365 dias e 30 dias respectivamente. Para obter mais informaes sobre o xs:duration tipo, consulte Part 2 do esquema XML do W3C: recomendao tipos de dados em http://www.w3.org/TR/XMLSCHEMA-2/.

XS:Time, tipos Data gregoriano, e System.DateTime


Quando um xs:time valor mapeado para um DateTime objeto, o MinValue campo usado para inicializar as Propriedades de Data do objeto DateTime (.,) com o menor valor possvel DateTime, como Year, Month e Day Da mesma forma, instncias de xs:gMonth, xs:gDay, xs:gYear, xs:gYearMonth e xs:gMonthDay so tambm mapeados para um DateTime objeto. Propriedades no utilizadas no objeto DateTime so inicializadas com os da MinValue. Observao Voc no pode contar com o System.DateTime.Year Valor quando o contedo for digitado como xs:gMonthDay. O System.DateTime.Year valor sempre definido como 1904, nesse caso.

XS:anyURI e System.URI
Quando uma instncia do xs:anyURI que representa um URI relativo mapeado para um Uri, o Uri objeto no tem um URI de base. Consulte tambm

Converso de tipos de dados XML


A maioria dos mtodos encontrado na classe XmlConvert so usados para converter dados entre seqncias e formatos digitada strongly-. Mtodos so localidade independente. Isso significa que que no faa levar em conta quaisquer configuraes de localidade ao fazer a converso. String de leitura como tipos O exemplo a seguir l uma seqncia e os converte para um DateTime tipo. Fornecido a entrada XML a seguir: Entrada
<Element>2001-02-27T11:13:23</Element>

Esse cdigo Converte a seqncia para o DateTime formato: C#

Visual C# Consolidado

864

reader.ReadStartElement(); DateTime vDateTime = XmlConvert.ToDateTime(reader.ReadString()); Console.WriteLine(vDateTime);

Seqncias de escrita como tipos O seguinte exemplo leituras e o converte em uma seqncia. um Int32 Fornecido a entrada XML a seguir: Entrada
<TestInt32>-2147483648</TestInt32>

Esse cdigo converte o Int32: em um String C#


Int32 vInt32=-2147483648; writer.WriteElementString("TestInt32",XmlConvert.ToString(vInt32));

Visual C# Consolidado

865

Servios da Web XML no cdigo gerenciado


XML Web services fornecem a habilidade para trocar mensagens em um ambiente frouxamente acoplado usando protocolos padres tais como HTTP, XML, XSD, SOAP, e WSDL. As mensagens podem ser estruturadas e digitadas ou vagamente definidas. Como protocolos padres servem como base para XML Web Services, seus aplicativos XML Web Services podem se comunicar com uma ampla variedade de implementaes, plataformas e dispositivos. Os tpicos nesta seo Focam sobre como criar e implantar XML Web Services e como acessar XML Web Services no cdigo gerenciado. Consulte a lista abaixo para obter links para outros tpicos que abordam XML Web Services.

Introduo programao servios XML da Web no cdigo gerenciado


XML Web Services tornam possvel a troca de dados na forma de mensagens XML entre sistemas heterogneos. Embora a lgica de acesso remoto a dados e aplicativos um novo conceito, moda fazer isso. tentativas anteriores, tais como DCOM, IIOP, e Java/RMI, exigiam uma forte integrao entre o cliente e o servidor e usavam formatos de dados binrios expecficos para a plataforma e a implementao. Enquanto esses protocolos exigem uma tecnologia de componentes particular ou conveno de chamada de objetos, XML Web Services no exigem. A nica suposio feita entre o cliente e o servidor que destinatrios iro entender as mensagens que recebem. Em outras palavras, o cliente e servidor concordam em um contrato, nesse caso descrito usando WSDL e XSD, e ento comunicam gerando mensagens que horam o contrato sobre um tranporte especfico como HTTP. Como resultado, programas gravados em qualquer linguagem, usando qualquer modelo de componente, e sendo executado em qualquer sistema operacional pode acessar XML Web Services. Alm disso, a flexibilidade de usar um formato de texto como XML possibilita que a troca de mensagens para evolver com tempo de uma maneira frouxamente acoplada. Estea coplamento frouxo obrigatrio em ambientes onde a atualizao simultnea de todas as partes na troca de mensagens no possvel. Voc cria XML Web Services usando a estrutura pgina ASP.NET, ativando esses XML Web Services para acessar os muitos recursos da .NET Framework, tais como autenticao, cache, e gerenciamento de estado. Como ASP.NET e o.NET Framework so a base para XML Web Services no cdigo gerenciado, os desenvolvedores podem se concentrar na criao ou acessar XML Web Services sem precisar escrever cdigo de infra-estrutura. No modelo aplicativo ASP.NET, pginas da Web destinam-se ao uso do navegador da extenso.aspx. Para diferenciar XML Web Services de pginas regulares ASP.NET, XML Web Services usam a extenso.asmx. H duas funes fundamentais ao trabalhar com XML Web Services:

Criar um XML Web Services Quando voc cria um XML Web Services, voc est criando um aplicativo que expe a funcionalidade para clientes XML Web Services. Acessar um XML Web Services Quando voc acessa um XML Web Services, seu aplicativo cliente localiza, referencia, e usa a funcionalidade contida em um XML Web Services separado. O cliente de um XML Web Services tipicamente um aplicativo que est apto a enviar, receber e processar mensagens para e oriundas de XML Web Services. Entretanto, o requisito mnimo que o cliente deve ser capaz de enviar mensagens para o XML Web Services. Isso inclui todos os aplicativos usando o .NET Framework.

Visual C# Consolidado

866

XML Web Services pode ser aplicativos autnomos ou subcomponentes de maior um aplicativo da Web. Por exemplo, suponha que voc estiver criando um aplicativo da Web que vende Livros online. Seu aplicativo da Web pode interagir com XML Web Services da seguinte forma:

Criando um XML Web Services Seu Aplicativo expe sua ordem processando a lgica como um XML Web Services, que seus Web sites afiliados podem usar em seus aplicativos da Web para vender livros atravs de seu armazenamento on-line sem exigir que seus clientes visitem seu site. Acessando um XML Web Service Seu Aplicativo acessa um XML Web Services fornecido por outra empresa on-line que especializada em escrever e fornecer revises de livros para vendedores de livros on-line. Quando um visitante da sua loja on-line v os detalhes de um livro especfico, eles tambm vem as revises desse livro na mesma pgina.

Lembre-se, XML Web Services podem ser acessados de praticamente qualquer outro tipo de aplicativo, incluindo outros XML Web Services, aplicativos de Web, aplicativos Windows, e aplicativos de console. O requisito mnimo que o cliente deve ser capaz de enviar mensagens para o XML Web Services.

Programao na Web com XML Web Services


XML Web Services permitem a troca de dados e a chamada remota da lgica de aplicativo usando mensagens XML para mover dados atravs de firewalls e entre sistemas heterogneos. O Visual Studio fornece ferramentas para criao XML Web Services em ambos os cdigos gerenciados e no gerenciados. Para cdigo gerenciado, Visual Studio torna possvel para desenvolvedores criar XML Web Services que totalmente aproveitem o poder do .NET Framework. Alm disso, Visual Studio tambm torna possvel para desenvolvedores criar XML Web Services usando Servidor ATL e C++ nativo. XML Web Services criados no cdigo gerenciado usam o modelo de aplicativo ASP.NET. O Visual Studio simplifica o processo de localizar e acessar XML Web Services usando a noo de referncias da Web. Adicionando uma referncia da Web a um aplicativo cliente resulta na gerao de uma classe proxy que serve como uma representao local do XML Web Services com a qual o cliente pode interagir. Este recurso est disponvel a aplicativos escritos no cdigo gerenciado ou no gerenciado. Ao adicionar uma referncia da Web, o Visual Studio gera a classe proxy no mesmo idioma de programao assim como o aplicativo cliente. Aplicativos cliente XML Web Services criados no cdigo gerenciado usam o modelo de aplicativo ASP.NET.

Criando XML Web Services em cdigo gerenciado


Voc cria XML Web Services no cdigo gerenciado usando a estrutura pgina ASP.NET Framework. Voc inicia criando um arquivo.asmx. Esse arquivo contm a diretiva WebService, que identifica a classe pblica que implementa a lgica XML Web Services. O classe de XML Web Service contm um ou mais mtodos pblicos para exposio em um XML Web Services. Esses mtodos XML Web Services so prefaceados com o atributo WebMethod. ASP.NET trata infraestrutura para expor esses mtodos como um XML Web Services. Para obter mais informaes, consulte Modelo de cdigo para servios Web XML no cdigo gerenciado. Para criar XML Web Services no cdigo gerenciado usando o Visual Studio, voc precisa acessar um servidor Web configurado para desenvolver aplicativos ASP.NET. Voc desenvolve XML Web Services em cdigo gerenciado em um servidor de desenvolvimento. Por padro, o servidor de desenvolvimento o computador no qual voc instalou o Visual Studio. Normalmente, voc

Visual C# Consolidado

867

desenvolve e contri o projeto num servidor de desenvolvimento, para em seguida implant-lo em outro servidor (o servidor de implantao) que ir hospedar o XML Web Services. Entretanto, se ocorrer desenvolvimento diretamente no servidor que hospedar o XML Web Services, o servidor de desenvolvimento e implantao sero os mesmos. Nesta seo Modelo de cdigo para XML Web Services no cdigo gerenciado Descreve o modelo de cdigo usado pelos servios da Web no cdigo gerenciado. Explorando contedo Servio da Web XML Descreve o contedo de um servio da Web que voc pode exibir em um navegador da Web. Criando projetos servio da Web ASP.NET Fornece instrues sobre como criar um XML Web Services usando o modelo de projeto servio da Web ASP.NET. Adicionar um XML Web Service a um projeto da Web existente no cdigo gerenciado Fornece instrues sobre como adicionar um servio da Web para um projeto da Web existente. Usando o atributo WebService Fornece instrues sobre como aplicar o atributo System.Web.Services.WebServiceAttribute. Herana da classe WebService Fornece instrues sobre como fazer herana da classe System.Web.Services.WebService. Criar um mtodo servio XML da Web Fornece instrues sobre como criar um mtodo exposto por um servio da Web. Usando o atributo WebMethod Fornece instrues sobre como aplicar o atributo System.Web.Services.WebMethodAttribute. Depurando XML Web Services no cdigo gerenciado Fornece instrues sobre como depurar um servio da Web usando mtodos mltiplos. Implantando XML Web Services em cdigo gerenciado Fornece instrues sobre como implantar um servio da Web usando mtodos variados. Sees relacionadas Programao na Web com XML Web Services

Visual C# Consolidado

868

Fornece links para vrios tpicos XML Web Services. Introduo programao XML Web Services no cdigo gerenciado Descreve o paradigma de programao de servios da Web. Acessando XML Web Services no cdigo gerenciado Descreve o processo e fornece instrues sobre como acessar servios da Web no cdigo gerenciado. Personalizando mensagens SOAP Descreve como personalizar mensagens SOAP, incluindo como trabalhar com vrios mtodos de codificao XML. Usando cabealhos SOAP Descreve como utilizar cabealhos SOAP em XML Web Services criados usando ASP.NET e como incluir informaes adicionais com mensagens SOAP. Criando XML Web Services usando ASP.NET Fornece informaes do .NET Framework SDK sobre criao de XML Web Services usando ASP.NET. Tratamento e incluso de excees nos XML Web Services Descreve como tratar e incluir excesses em XML Web Services criados usando ASP.NET. XML Web Services criados com Servidor ATL Descreve como criar, distribuir e consumir XML Web Services usando Servidor ATL e C++.

Acessando XML Web Services no cdigo gerenciado


Um cliente XML Web Services qualquer componente ou aplicativo que faz referncia e usa um XML Web Services. No necessariamente isso precisar ser um aplicativo baseadas no cliente; na verdade, em muitos casos seus clientes XML Web Services podem ser outros aplicativos da Web, como formulrios da Web ou mesmo outros XML Web Services. Nesta seo Modelo de cdigo para acessar XML Web Services no cdigo gerenciado Descreve o processo de acesso a servios da Web em cdigo gerenciado. Localizando XML Web Services Fornece instrues sobre como localizar servios da Web para acessar. Gerando um proxy XML Web Service Fornece instrues sobre como gerar uma classe proxy para um servio da Web.

Visual C# Consolidado

869

Acessando um servio da Web XML no cdigo gerenciado Fornece instrues sobre como acessar um servio da Web de um aplicativo cliente escrito em cdigo gerenciado. Acessando assincronamente um XML Web Service em cdigo gerenciado Fornece instrues sobre como acessar de forma assncrona um servio da Web de um aplicativo cliente escrito em cdigo gerenciado. Sees relacionadas Programao na Web com XML Web Services Fornece um portal para toda documentao de servios da Web. Introduo programao de XML Web Services em cdigo gerenciado Descreve o paradigma da programao de servios da Web. Criando XML Web Services em cdigo gerenciado Descreve o processo e fornece instrues sobre como criar servios da Web em cdigo gerenciado. Criando clientes XML Web Services Descreve o processo e fornece instrues sobre criao de clientes XML Web Services. Personalizando mensagens SOAP Descreve como personalizar mensagens SOAP, incluindo como trabalhar com vrios mtodos de codificao XML. Usando cabealhos SOAP Descreve como utilizar cabealhos SOAP nos servios da Web criados usando ASP.NET e como incluir informaes adicionais com mensagens SOAP. How to: Access XML Web Services from a Browser Fornece instrues sobre acessar servios da Web ASP.NET em um navegador da Web usando HTTP-GET, HTTP-POST e HTTP-SOAP. XML Web Services criados com servidor ATL Descreve o processo e provm instrues sobre como criar e acessar servios da Web usando um servido ATL e C++.

Criado usando clientes do servio XML da Web ASP.NET e Servios XML da Web
Irrevocably nos ltimos anos, uma fora tem restyled a paisagem de desenvolvimento de aplicativos mais de qualquer outro na Internet. Organizaes tornaram progressivamente

Visual C# Consolidado

870

dependem dos recursos digital e canais de comunicao que so fornecidos pela Internet e tecnologias relacionadas. Como resultado, muito poucos aplicativos so criados e desenvolvidos que atualmente no fazer considerar como melhor para incorporar e aproveitar tecnologias da Internet para totalmente dinamizar os benefcios da computao conectado. Quando no pursuing totalmente novo desenvolvimento de aplicativos, as organizaes podem ser encontradas tentativa de criar aplicativos que agregar vrios aplicativos tradicionais, orientado tarefas-em um aplicativo simples, composto. Isso s vezes inclui integrar aplicativos que existe dentro dos limites de uma entidade separada, como outra empresa ou um provedor de servios. No entanto, um dilema ainda maior surge quando tentam integrar aplicativos legados criado usando uma variedade de tecnologias, modelos de objeto, sistemas operacionais, e linguagens de programao. Como voc tornar todos eles funcionam juntos? A resposta a Internet programvel. Extensible linguagem de marcao (XML) como um formato Descrio dados abertas tem fornecidos aumento para a realidade de um Internet programvel. Da mesma forma TCP / IP fornecido conectividade universal para a Internet, e HTML fornecido um idioma padronizada para exibir informaes em uma grande variedade de plataformas para consumo humano, XML fornece um idioma padronizada para trocar dados para consumo automatizado. Ele fornece a capacidade para representar dados em um formato que permite que computadores para enviar e receber dados em um estilo previsvel, habilitando programabilidade que ultrapassa sistemas fechados, controlado amplamente aceitos. XML liberating porque sua simplicidade e extensibilidade permite que voc para definir quase tudo, permitindo sala para expanso. Uma dos blocos construo fundamental da Internet programvel servios XML da Web. O Microsoft oferece suporte para criar servios XML da Web, usando tecnologias projetado para atender s necessidades de diferentes audincias. Especificamente, o Microsoft oferece aos desenvolvedores a opo de criar os Servios XML da Web usando ASP.NET, ATL Server, sistema de interao remota.NET, e o 2.0 Toolkit SOAP. Remotos ASP.NET e.NET fazer Criando Servios XML da Web mais fcil, conforme eles so criados na parte superior do.NET Framework. O 2.0 Toolkit SOAP fornece suporte servios XML da Web compatvel com a Microsoft Visual Studio 6.0 e aplicativos herdados, permitindo que eles para fins de interoperabilidade com servios da Web XML construdo sobre o .NET Framework. Nesta seo Viso geral do XML Web Services Fornece uma viso geral neutra da plataforma dos XML Web Services. XML Web Services Usando ASP.NET Detalhes como criar servios XML da Web, usando o ASP.NET. Criando clientes XML Web Services Detalhes como criar um cliente para um servio XML da Web, independentemente da plataforma ou tecnologia usada para criar do XML Web Service. Tratamento e incluso de excees nos XML Web Services Descreve como para lidar com excees de um servio XML da Web criados com clientes servio XML da Web ASP.NET e criados com o.NET Framework. Usando cabealhos SOAP

Visual C# Consolidado

871

Detalhes como cabealhos SOAP pode ser definido, processada, e manipulados para clientes chamar servios XML da Web criados com ASP.NET. Personalizando SOAP Message formatao Descreve como para controlar o SOAP enviados para e do Servios XML da Web criados com ASP.NET. Modificao de mensagens SOAP usando extenses SOAP Explica como criar extenses Modifique a mensagem SOAP enviada atravs da rede para servios XML da Web criados com ASP.NET e seus clientes. Passo-a-passo: Personalizando a Gerao de Descries de Servios e Classes Proxy Descreve as etapas para criar um extenso do formato da descrio do servio (SDFE). Como personalizar a gerao de descries de servio e classes proxy: Fornece cdigo de exemplo que define um extenso do formato da descrio do servio. Tipos de dados com suporte pelos servios XML da Web criados usando ASP.NET Lista os tipos de dados suporte para servios XML da Web criados com ASP.NET. Atributos para criados usando clientes do servio XML da Web ASP.NET e Servios da Web XML Lista os atributos que podem ser aplicadas aos criados com clientes servio XML da Web ASP.NET e Servios XML da Web. Sees relacionadas Programao de rede Mostra como usar classes de acesso a Internet para implementar ambos os aplicativos baseados na Web e na Internet.

COMO: Acessar um Servio da Web XML no Cdigo Gerenciado


Acessando um XML Web Services a partir de cdigo gerenciado um processo simples. Primeiro, voc adiciona uma referncia da Web no seu projeto para o XML Web Services que voc deseja acessar. A referncia da Web cria uma classe proxy com mtodos que servem como proxies para cada mtodo exposto do XML Web Services. Em seguida, voc adiciona o namespace para a referncia da Web. Finalmente, voc criar uma instncia de classe proxy e acessar os mtodos de classe assim como acessaria os mtodos de uma outra classe qualquer. Para obter mais informaes, consulte Modelo de Cdigo para Acessar XML Web Services em Cdigo Gerenciado. Por padro, adicionar uma referncia da Web adiciona tambm mtodos para a classe proxy para acessar o XML Web Services de forma assncrona. Para obter mais informaes, consulte Acessar um XML Web Services de forma assncrona em cdigo gerenciado. Para acessar um XML Web Services no cdigo gerenciado 1. Crie o aplicativo a partir do qual voc deseja acessar um XML Web Services. Este aplicativo pode at ser outro XML Web Services.

Visual C# Consolidado

872

2. 3. 4.

Adicionar uma referncia da Web para o XML Web Services com o qual seu aplicativo ir interagir. Para obter instrues, consulte Adicionando e Removendo Referncias da Web. Crie uma instncia do objeto do proxy em seu cdigo cliente onde voc deseja acessar o XML Web Services. Acesse os mtodos do XML Web Services como voc faria com qualquer outro componente. No cdigo de exemplo abaixo, o aplicativo cliente (Application1) est acessando um XML Web Services para o qual ele tem uma referncia da Web (Converter) que contm uma classe proxy (Service1), que possui um mtodo (ConvertTemperature) para chamar o XML Web Services. As duas linhas de cdigo em negrito representam o cdigo que necessrio para acessar o XML Web Services. C#
using System; namespace Application1 { class Class1 { static void Main() { Converter.Service1 cService = new Converter.Service1(); Console.WriteLine("Temperature in degrees Fahrenheit: "); double dFahrenheit = Convert.ToDouble(Console.ReadLine()); double dCelsius = cService.ConvertTemperature(dFahrenheit); Console.Write("Temperature in degrees Celsius: "); Console.WriteLine(dCelsius.ToString()); } } }

COMO: Acessar um Servio da Web XML Assincronamente no Cdigo Gerenciado


Cada mtodo Web em uma classe proxy de servio da Web possui uma cpia assncrona. A classe proxy gera automaticamente mtodos assncronos e um evento correspondente para cada mtodo Web. Quando o mtodo assncrono chamado, ele executado em outro segmento e dispara o evento correspondente quando ele retorna. Voc pode executar cdigo quando um mtodo assncrono retorna, atravs da criao de um manipulador para seus eventos correspondentes. Chamar um mtodo Web de forma assncrona com o Visual Basic 1. Declare uma instncia da classe proxy de servio da Web usando a palavra-chave WithEvents, conforme mostrado abaixo:
Dim WithEvents myWebService As New Service1

Observao O seu projeto deve conter uma referncia da Web para o servio da Web. 2. No editor de cdigo, use a palavra-chave Handles para criar um manipulador de eventos para o evento MethodCompleted, que corresponde ao mtodo que voc deseja chamar. Por exemplo, se voc estivesse chamando um mtodo chamado HelloWorld assincronamente, voc deveria criar um mtodo semelhante ao seguinte:
Private Sub HelloWorldComplete(ByVal sender As Object, _ ByVal completed As localhost.HellowWorldCompletedEventArgs) _ Handles myWebService.HelloWorldCompleted ' Insert code to implement the method here End Sub

Observe que o mtodo que manipula o evento MethodCompleted deve corresponder a assinatura do evento. Isso comumente exige um argumento Object para representar o remetente, e uma instncia do EventArgs do mtodo, a qual consiste no mesmo namespace que a classe proxy de servio da Web. Voc tambm pode usar o Code Editor para criar automaticamente manipuladores de eventos para voc. Para obter mais informaes, consulte How to: Create Event Handlers in the Visual Basic Code Editor.

Visual C# Consolidado

873

3.

Chame o mtodo Web usando o formulrio MethodAsync do mtodo. Por exemplo, se voc estivesse chamando um mtodo Web chamado HelloWorld assincronamente, ele deveria ser da seguinte forma:
HelloWorldAsync

Observe que o valor de retorno do mtodo est disponvel na propriedade Result do EventArgs. Chamar um mtodo Web de forma assncrona com C# 1. Declare uma instncia da classe proxy de servio da Web, conforme mostrado abaixo:
private localhost.Service1 myWebService = new localhost.Service1 ();

Observao O seu projeto deve conter uma referncia da Web para o servio da Web. 2. No Code Editor, adicione um manipulador para o evento MethodCompleted que corresponde ao mtodo que voc deseja chamar. Por exemplo, se voc estivesse chamando um mtodo chamado HelloWorld assincronamente, voc deveria criar um mtodo semelhante ao seguinte:
private void HelloWorldCompleted(Object sender, localhost.HelloWorldCompletedEventArgs Completed) { // Insert code to implement the method here }

Observe que o mtodo que manipula o evento MethodCompleted deve corresponder a assinatura do evento. Isso comumente exige um argumento Object para representar o remetente e uma instncia do EventArgs do mtodo, a qual consiste no mesmo namespace que a classe proxy de servio da Web. Voc tambm pode usar o Code Editor para criar automaticamente manipuladores de eventos para voc. Para obter mais informaes, consulte Como criar manipuladores de eventos no Editor de Cdigo Visual C# (guia de programao C#):. 3. No Construtor para a classe, adicione o manipulador de evento do MethodCompleted lista de manipuladores para tal evento, como mostrado abaixo:
private void Form1_Load(object sender, EventArgs e) { myWebService.HelloWorldCompleted += new localhost.HelloWorldCompletedEventHandler(HelloWorldCompleted); }

4.

Chame o mtodo Web usando o formulrio MethodAsync do mtodo. Por exemplo, se voc estivesse chamando um mtodo Web chamado HelloWorld assincronamente, ele deveria ser da seguinte forma:
HelloWorldAsync();

Observe que o valor de retorno do mtodo est disponvel na propriedade Result do EventArgs.

Como: Acessar XML Web Services de um navegador


Depois que voc publicar um servio da Web criados com ASP.NET, voc pode testar sua funcionalidade usando um navegador para chamar ele via o HTTP-GET ou HTTP-POST. Acessar o arquivo.asmx em um navegador e clique em hiperlinks para os mtodos Servio da Web, ou acessar mtodos individuais diretamente, acrescentando uma seqncia de consulta a URL.asmx. Observao

Visual C# Consolidado

874

Por padro, um servio da Web criados com ASP.NET capaz de oferecem suporte a vrios protocolos, incluindo SOAP sobre HTTP e implementaes de HTTP-GET e HTTP-POST onde SOAP XML no- retornado em resposta. Para testar um servio da Web em um navegador usando HTTP-GET 1. 2. Implantar o servio da Web em um servidor Web. Para obter mais informaes, consulte Publicao servio XML da Web e implantao. Acessar um navegador da Web e digite a URL para o servio da Web no endereo barra, usando o seguinte formato:
http://servername/apppath/webservicename.asmx

Parte caminho servername Apppath

Value (Valor) O nome do servidor no qual o servio da Web foi implantado. O nome do seu diretrio virtual e o restante do caminho do aplicativo da Web.

webservicename.asmx O nome do arquivo.asmx Servio da Web. Por exemplo, suponha que voc ter publicado um servio da Web chamada StockServices. When published, the base URL for this service is http://<servername>/apppath/StockServices.asmx. You could test this service by entering this HTTP-GET request in the browser's address bar:
http://<servername>/apppath/StockServices.asmx

O servidor, em resposta a essa solicitao, exibe pgina Descrio HTML o servio da Web na. 3. Pgina Descrio HTML a servios da Web mostra todos os mtodos Servio da Web aos quais um servio da Web especfico. Vincular ao mtodo servio Web desejado e insira os parmetros necessrios para testar o mtodo e receber a resposta XML. Implantar o servio da Web em um servidor Web. Para obter mais informaes, consulte Publicao servio XML da Web e implantao. Acessar um navegador da Web e digite o URL para o mtodo de servio da Web no endereo barra, usando este formato:
http://servername/vdir/webservicename.asmx/Methodname?parameter=value

Para diretamente teste um mtodo de servio da Web em um navegador usando HTTP-GET 1. 2.

Parmetro servername Apppath

Value (Valor) O nome do servidor no qual o servio da Web for implantado. O nome do seu diretrio virtual e o restante do caminho do aplicativo da Web.

webservicename.asmx O nome do arquivo.asmx Servio da Web.

Visual C# Consolidado

875

Methodname

O nome de um mtodo pblico que seja exposto pelo seu servio Web. Se deixar em branco, a Web pgina Descrio do servio no mostrada, listando cada mtodo pblico no arquivo.asmx disponveis. (Opcional) O parmetro apropriado nome e valor para qualquer parmetro exigido pelo seu mtodo. Se deixar em branco, a Web pgina Descrio do servio no mostrada, listando cada mtodo pblico no arquivo.asmx disponveis. (Opcional)

Parmetro

Observao O nome do mtodo Servio da Web nessa sintaxe diferencia maisculas e minsculas, mas no so o servidor, projeto, e nomes de servio da Web. Por exemplo, suponha que o StockServices Servio da Web do procedimento anterior contm um mtodo de servio da Web chamado GetQuote; o mtodo servio Web aceita um smbolo de aes como um parmetro, retornando o preo como um nmero de ponto flutuante de preciso dupla. Insira a solicitao HTTP-GET a seguir na barra Endereos do navegador para testar esse mtodo: http://<servername>/apppath/StockServices.asmx/GetStockQuote?tickerName=MSFT 3. O servidor envia uma resposta contendo um documento XML, que exibida no navegador. Por exemplo GetQuote, o XML tem o preo atual de aes voc solicitar. O resultado pode aspecto como o seguinte:
<?xml version="1.0" ?> <double>74.5</double>

Para testar um servio da Web em um navegador usando HTTP-POST 1. Implantar o servio da Web em um servidor Web. Para obter mais informaes, consulte Publicao servio XML da Web e implantao. Este procedimento usa o seguinte servio da Web implantado como um math.asmx arquivo que seja acessvel a partir da raiz virtual de um http://www.contoso.com Site, como um exemplo: C#
<%@ WebService Language="C#" Class="Math" %> using System.Web.Services; public class Math : WebService { [ WebMethod ] public int Add(int num1, int num2) { return num1+num2; } [ WebMethod ] public int Subtract(int num1, int num2) { return num1-num2; } }

Visual Basic
<%@ WebService Language="VB" Class="Math" %> Imports System.Web.Services Public Class Math Inherits WebService <WebMethod> _ Public Function Add(num1 As Integer, num2 As Integer) As Integer Return num1 + num2 End Function <WebMethod> _ Public Function Subtract(num1 As Integer, num2 As Integer) As Integer Return num1 - num2 End Function End Class

2.

Crie uma pgina HTML com um formulrio que tenha o method atributo definido como POST. Use o seguinte formato:
<form method=POST action='http://www.contoso.com/math.asmx/Subtract'> <input type="text" size="5" name='num1'\"></td> - <input type="text" size="5" name='num2'\"></td> = <input type=submit value="Subtract"> </td> </form>

Visual C# Consolidado

876

Parmetro Mtodo

Value (Valor) POST Se voc desejar para testar seu servio da Web usando HTTP-POST, use POST. URL para o mtodo de servio da Web. No exemplo anterior, math.asmx o servio da Web e Subtract o mtodo Servio da Web.

AO

Tipo ="text" Para cada parmetro do mtodo Servio da Web, criar input marcas com o atributo Tipo definido como "text". Isso permite que voc para digitar um valor de parmetro em Controle de entrada de texto. Nome ='num1' O nome do parmetro mtodo Servio da Web. Adicionar quantos controles de entrada de texto no formulrio pois h parmetros no mtodo de servio da Web. Por exemplo, se um mtodo de servio da Web tiver trs parmetros, trs controles de entrada de texto so necessrias que cada ter seu name atributo definido como o nome do parmetro. Adicionar um boto Enviar para voc pode enviar os dados de volta para o mtodo servio Web.

Tipo = enviar 3.

Acessar um navegador da Web e digite o URL para o documento HTML criado na etapa anterior. O documento HTML criado na etapa anterior exibido. Insira os valores apropriados para o mtodo de servio da Web nas caixas de texto e clique no submit boto. Por exemplo, e 3 se voc inseriu 6 para as caixas dois texto para mtodo Servio da Web o exemplo na Subtract, o seguinte resultado retornado:
<?xml version="1.0" ?> <int xmlns="http://tempuri.org/">3</int>

4.

Consulte tambm

COMO: Explorar contedo de Servios da Web XML


O arquivo.asmx representa o ponto enderevel de entrada de XML Web Services criados com cdigo gerenciado. A maneira como voc acessa esse arquivo via HTTP determina o tipo de resposta recebida. Pgina de Ajuda de Servio Quando chamado em um navegador da Web sem fornecimento de uma seqncia de caracteres de consulta reconhecido, o arquivo.asmx retorna uma pgina de ajuda de servio, gerada automaticamente, para o XML Web Service. Isso o equivalente a fazer um HTTP-GET no arquivo.asmx. Este mtodo de Servio ajuda a pgina a fornecer uma lista dos mtodos fornecidos pelo XML Web Service e que voc pode acessar programaticamente. Esta pgina contm links para cada mtodo que levar voc a informaes adicionais sobre esse mtodo. Alm disso, esta pgina contm um link para o documento de descrio do XML Web Service.

Visual C# Consolidado

877

Acessar a Pgina de Ajuda de Servio

Na campo Endereo do navegador, digite o URL bsico para o XML Web Service usando este formato:
http://servername/projectname/xmlwebservicename.asmx

Parmetro servername projectname

Valor O servidor no qual o XML Web Service est instalado. Nome do projeto do seu XML Web Service e quaisquer informaes adicionais de diretrio necessrias para acessar o arquivo.asmx para seu XML Web Service.

webservicename.asmx O nome do arquivo.asmx para o XML Web Service. Por exemplo, para acessar um XML Web Service chamado Service1.asmx, que faz parte de um projeto chamado WebService1 em sua mquina local, voc deve digitar o seguinte:
http://localhost/XmlWebService1/Service1.asmx

A pgina de ajuda de servio do mtodo fornece informaes adicionais relacionadas quele mtodo de XML Web Service especfico. A pgina fornece a possibilidade de chamar o mtodo usando o protocolo HTTP-POST. O mtodo XML Web Service, no entanto, deve suportar o protocolo HTTP-POST para ativar essa funcionalidade. Na parte inferior da pgina, a pgina de ajuda de servio do mtodo fornece exemplos de mensagens de solicitao e resposta para os protocolos que o mtodo XML Web Service suporta. Descrio do Servio A pgina de ajuda de servio tambm fornece um link para a descrio de servio do XML Web Service, que uma definio formal dos recursos do XML Web Service. A descrio de servio um documento que usa a gramtica WSDL (Web Services Description Language) (WSDL). A descrio de servio define o contrato para os formatos das mensagens que os clientes precisam seguir para trocar mensagens com o XML Web Service. Para obter mais informaes, consulte Descrio do XML Web Service. Acessar a descrio de servio

No campo Endereo do navegador, digite o URL bsico para o XML Web Service e fornea a seqncia de caracteres de consulta WSDL utilizando este formato:
http://servername/projectname/xmlwebservicename.asmx?WSDL

Parmetro servername projectname

Valor O servidor no qual o XML Web Service est instalado. Nome do projeto do seu XML Web Service e quaisquer informaes adicionais de diretrio necessrias para acessar o arquivo.asmx para seu XML Web Service.

Visual C# Consolidado

878

webservicename.asmx O nome do arquivo.asmx para o XML Web Service. Por exemplo, para acessar a descrio de servio de um XML Web Service chamado Service1.asmx, que faz parte de um projeto chamado WebService1 em sua mquina local, voc deve digitar o seguinte:
http://localhost/XmlWebService1/Service1.asmx?WSDL

Acessando XML Web Services de um navegador da Web Voc pode acessar um XML Web Service que oferea suporte ao protocolo HTTP-GET em um navegador da Web. Por padro, os XML Web Services que voc cria no Visual Studio, usando o modelo de projeto de Web Service ASP.NET, suportam HTTP-GET, HTTP-POST, e HTTP-SOAP. Nem todos os protocolos podem oferecer suporte a todos os mtodos. Em geral, os protocolos HTTP-GET e HTTP-POST so mais restritos que o HTTP-SOAP, em relao aos tipos de dados que eles suportam.

Acessar um XML Web Service de um navegador da Web

Na campo Endereo do navegador, digite o URL bsico para o XML Web Service com o nome e parmetros do mtodo na seqncia de caracteres de consulta, usando o seguinte formato:
http://servername/projectname/xmlwebservicename.asmx/methodname?parametername0=value0&par ametername1=value1&...&parameternamen=valuen

Parmetro servername projectname

Valor O servidor no qual o XML Web Service est instalado Nome do projeto do seu XML Web Service e quaisquer informaes adicionais de diretrio necessrias para acessar o arquivo.asmx para seu XML Web Service.

webservicename.asmx O nome do arquivo.asmx para o XML Web Service. methodname O nome do mtodo Web com diferenciao de letras maisculas de minsculas. Os nomes dos parmetros do mtodo da Web. Os valores codificados da URL de cada um dos parmetros do mtodo da Web.

parametername Valor

Por exemplo, para acessar o mtodo ReturnThisString de um XML Web Service chamado Service1.asmx, com um parmetro chamado MyString definido com o valor de "This is my test String", e que parte de um projeto chamado WebService1 na sua mquina local, voc deve digitar o seguinte:
http://localhost/XmlWebService1/Service1.asmx/ReturnThisString?MyString=This+is+my+test+string

Consulte tambm

Visual C# Consolidado

879

COMO: Criar Projetos de Servio da Web ASP.NET


Voc pode iniciar um projeto que inclui os arquivos necessrios para criar um XML Web Services em Visual Basic ou Visual C#, usando os modelos de projeto fornecidos pelo Visual Studio. Para criar um projeto XML Web Services 1. 2. 3. No menu File, aponte para New, e clique Web Site. Na caixa de dilogo New Web Site, selecione o cone ASP.NET Web Service. Digite o endereo do servidor Web no qual voc ir desenvolver o XML Web Services. Por exemplo, usar " http://MyServer/Application " ou " http://MyServer " simplesmente para desenvolver o diretrio raiz. Voc tambm pode criar seu site no sistema de arquivos, escolhendo um endereo arquivo, como " C:\Application " Clique OK para criar o projeto.

4.

O Visual Studio cria automaticamente os arquivos necessrios e referncias para suporte um XML Web Services . Quando concludo, a IDE exibe o arquivo cdigo de servio no modo de exibio de cdigo. Para obter mais informaes, consulte ASP.NET XML Web Service Basics. Consulte tambm

COMO: Usar o Atributo WebService


Voc pode usar o atributo WebService para especificar o namespace, que usa como padro " http://tempuri.org. " e o texto de descrio para o XML Web Services. Por padro o modelo do projeto de servio da Web ASP.NET no gera uma classe que inclui este atributo. Separe mltiplas propriedades com uma vrgula. Aplicar o atributo WebService

Insira o atributo WebService antes da declarao de classe e defina as propriedades Namespace e Description como mostrado abaixo: C#
[System.Web.Services.WebService( Namespace="http://servername/xmlwebservices/", Description="Some descriptive text could go here.")] public class Service1 : System.Web.Services.WebService { // Implementation code. }

COMO: Herdar da Classe WebService


Por padro, XML Web Services criados usando o modelo de projeto servio da Web ASP.NET herdam da classe System.Web.Services.WebService. Herana dessa classe torna possvel para o XML Web Services acessar os objetos intrnsecos do ASP.NET, como Application e Sesso. Para obter mais informaes, consulte Inheritance in Visual Basic ou Herana (guia de programao C#). Observao Se sua classe no herdar a partir da classe WebService, o criador de componente para o XML Web Services no estar disponvel.

Visual C# Consolidado

880

Se o XML Web Services no herdar desta classe, ele pode acessar os objetos intrnsecos ASP.NET a partir da propriedade System.Web.HttpContext.Current. Isso pode ser o caso quando seu XML Web Services necessitar herdar de uma classe base personalizada. A classe que implementar o XML Web Services deve ser pblica e deve ter um construtor pblico padro (um construtor sem parmetros). Isso torna possvel para o ASP.NET criar uma instncia da classe de XML Web Service para processar solicitaes XML Web Services de entrada. Para herdar a partir da classe System.Web.Services.WebService

Voc pode herdar da classe System.Web.Services.WebService como mostra o exemplo abaixo: C#


public class Service1 : System.Web.Services.WebService { [System.Web.Services.WebMethod( Description="Get SessionID", EnableSession=true)] public string GetSessionID() { return this.Session.SessionID; } }

COMO: Criar um Mtodo de Servio da Web XML


Quando voc cria um XML Web Services em cdigo gerenciado, voc indica os mtodos que esto disponveis atravs daquele XML Web Services, colocando o atributo WebMethod antes da declarao de mtodo de um mtodo Public. Mtodos Private no podem servir como o ponto de entrada para um XML Web Services, embora eles possam ser da mesma classe e o cdigo do XML Web Services poder cham-los. O atributo WebMethod deve ser aplicado a cada mtodo pblico que estiver disponvel como parte XML Web Services. Para obter mais informaes, consulte COMO: Usar o Atributo WebMethod. Os procedimentos abaixo supem que voc est trabalhando com mtodos pblicos de uma classe que a implementao de um servio XML Web. Para obter mais informaes, consulte Modelo de cdigo para XML Web Services no cdigo gerenciado. Para criar um mtodo de XML Web Services 1. 2. Clique duas vezes no seu arquivo .vb ou .cs (por exemplo, Service1.vb ou Service1.cs) no Solution Explorer para abrir o Editor de Cdigo. Adicionar um mtodo pblico para a classe especificada na propriedade Class de diretiva de processamento do arquivo WebService.asmx como mostrado abaixo: C#
public class Service1 : System.Web.Services.WebService { [System.Web.Services.WebMethod()] public double ConvertTemperature(double dFahrenheit) { return ((dFahrenheit - 32) * 5) / 9; } }

Anexar o atributo WebMethod a um mtodo Public indica que voc deseja o mtodo exposto como parte do XML Web Services. Para obter mais informaes, consulte Modelo de cdigo para XML Web Services no cdigo gerenciado.

COMO: Usar o Atributo WebMethod


Anexando o atributo WebMethod a um mtodo Public indica que voc deseja o mtodo exposto como parte do XML Web Service. Voc tambm pode usar as propriedades deste atributo para configurar o comportamento do mtodo do XML Web Service. Para obter mais informaes, consulte Modelo de cdigo para XML Web Services no cdigo gerenciado. O atributo WebMethod fornece as seguintes propriedades:

BufferResponse

Visual C# Consolidado

881

CacheDuration Description EnableSession MessageName TransactionOption

BufferResponse A propriedade BufferResponse do atributo WebMethod habilita o buffer de respostas para um mtodo do XML Web Service. Quando definida como true, a configurao padro, o ASP.NET faz um buffer inteiro da resposta antes de envi-la para para o cliente. O buffer muito eficiente e ajuda a melhorar o desempenho, minimizando a comunicao entre o processo ativo e o processo do IIS. Quando definida como false, o ASP.NET faz buffers da resposta em blocos de 16 KB. Normalmente, voc deve definir essa propriedade para false somente se voc no quiser todo o contedo da resposta na memria de uma s vez. Por exemplo, voc est mandando de volta uma coleo que est transmitindo seus itens a partir de um banco de dados. A menos que seja especificado em contrrio, o valor padro true. Para obter mais informaes, consulte Propriedade WebMethodAttribute.BufferResponse.

Fazendo um buffer da resposta de um mtodo de XML Web Service

Use a propriedade BufferResponse do atributo WebMethod, como mostrado abaixo: C#


public class Service1 : System.Web.Services.WebService { [System.Web.Services.WebMethod(BufferResponse=false)] public DataSet GetBigData() { //implementation code } }

CacheDuration A propriedadeCacheDuration do atributo WebMethod permite fazer um cache dos resultados para um mtodo de XML Web Service. O ASP.NET far cache dos resultados para cada conjunto nico de parmetros. O valor desta propriedade especifica o nmero de segundos que o ASP.NET deve manter o cache dos resultados. Um valor de zero desativa o cache de resultados. A menos que seja especificado em contrrio, o valor padro zero. Para obter mais informaes, consulte Propriedade WebMethodAttribute.CacheDuration.

Armazenando em cache os resultados de um mtodo de XML Web Service

Use a propriedade CacheDuration do atributo WebMethod , como mostrado abaixo: C#


public class Service1 : System.Web.Services.WebService { [System.Web.Services.WebMethod(CacheDuration=60)] public double ConvertTemperature(double dFahrenheit) { return ((dFahrenheit - 32) * 5) / 9; } }

Description A propriedade Description do atributo WebMethod fornece uma descrio para um mtodo de XML Web Service que ser exibido na pgina de ajuda do servio. A menos que seja especificado em contrrio, o valor padro uma string vazia. Para obter mais informaes, consulte Propriedade WebMethodAttribute.Description.

Fornecendo uma descrio para um mtodo de XML Web Service Visual C# Consolidado 882

Use a propriedade Description do atributo WebMethod , como mostrado abaixo:


' Visual Basic Public Class Service1 Inherits System.Web.Services.WebService <System.Web.Services.WebMethod( _ Description:="This method converts a temperature " & _ "in degrees Fahrenheit to a temperature in degrees Celsius.")> _ Public Function ConvertTemperature(ByVal dFahrenheit As Double) _ As Double ConvertTemperature = ((dFahrenheit - 32) * 5) / 9 End Function End Class // C# public class Service1 : System.Web.Services.WebService { [System.Web.Services.WebMethod( Description="Converts F to C a temperature in " + "degrees Fahrenheit to a temperature in degrees Celsius.")] public double ConvertTemperature(double dFahrenheit) { return ((dFahrenheit - 32) * 5) / 9; } }

EnableSession A propriedade EnableSession do atributo WebMethod habilita o estado da sesso para um mtodo de XML Web Service. Uma vez ativada, o XML Web Service pode acessar a coleo de estado da sesso diretamente do HttpContext.Current.Session ou com a propriedade WebService.Session, se ela herda a partir da classe base WebService. A menos que seja especificado em contrrio, o valor padro false. Para obter mais informaes, consulte Propriedade WebMethodAttribute.EnableSession.

Ativando o estado da sesso em um mtodo de XML Web Service

Use a propriedade EnableSession do atributo WebMethod , como mostrado abaixo: C#


public class Service1 : System.Web.Services.WebService { [System.Web.Services.WebMethod(EnableSession=true)] public double ConvertTemperature(double dFahrenheit) { Session["Conversions"] = (int) Session["Conversions"] + 1; return ((dFahrenheit - 32) * 5) / 9; } [System.Web.Services.WebMethod(EnableSession=true)] public int GetNumberOfConversions() { return (int) Session["Conversions"]; } }

MessageName A propriedade MessageName do atributo WebMethod permite o XML Web Service identificar cada mtodo sobrecarregado usando um alias. A menos que seja especificado em contrrio, o valor padro o nome do mtodo. Ao especificar a propriedade MessageName, as mensagens SOAP resultantes refletiro esse nome em vez do nome original do mtodo. Para obter mais informaes, consulte Propriedade WebMethodAttribute.MessageName. Fornecendo um nome de mensagem para um mtodo de XML Web Service

Use a propriedade MessageName do atributo WebMethod , como mostrado abaixo: C#


public class Service1 : System.Web.Services.WebService { [System.Web.Services.WebMethod(MessageName="AddDoubles")] public double Add(double dValueOne, double dValueTwo) { return dValueOne + dValueTwo; } [System.Web.Services.WebMethod(MessageName="AddIntegers")] public int Add(int iValueOne, int iValueTwo) { return iValueOne + iValueTwo; } }

A mensagem de solicitao SOAP para o mtodo que adiciona doubles, AddDoubles, ser semelhante a seguir:
POST /myWebService/Service1.asmx HTTP/1.1 Host: localhost Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://tempuri.org/AddDoubles" <?xml version="1.0"

Visual C# Consolidado

883

encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <AddDoubles xmlns="http://tempuri.org/"> <dValueOne>double</dValueOne> <dValueTwo>double</dValueTwo> </AddDoubles> </soap:Body> </soap:Envelope> HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length

A mensagem de resposta SOAP para o mtodo que adiciona doubles, AddDoubles, ser semelhante a seguir:
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <AddDoublesResponse xmlns="http://tempuri.org/"> <AddDoublesResult>double</AddDoublesResult> </AddDoublesResponse> </soap:Body> </soap:Envelope>

TransactionOption A propriedade TransactionOption do atributo WebMethod permite o mtodo de XML Web Service participar como o objeto raiz de uma transao. Apesar de voc poder definir a propriedade TransactionOption para qualquer valor da enumerao TransactionOption, um mtodo de XML Web service s possui dois comportamentos possveis; ele no participa de uma transao (Disabled, NotSupported, Supported), ou ele cria uma nova transao (Required, RequiresNew). A menos que seja especificado em contrrio, o valor padro TransactionOption.Disabled. Para obter mais informaes, consulte Propriedade WebMethodAttribute.TransactionOption. Alm dos pr-requisitos para qualquer mtodo de XML Web Service, voc tem de adicionar uma referncia para System.EnterpriseServices.dll. Este namespace contm mtodos e propriedades que expem o modelo de transao distribuda encontrado no servios COM+ . A classe System.EnterpriseServices.ContextUtil permite voc votar na transao usando os mtodos SetComplete ou SetAbort. Para obter mais informaes, consulte Participando de transaes nos XML Web Services criados com ASP.NET e Transaes automticas e XML Web Services. Criando uma nova transao com um mtodo de XML Web Service 1. 2. Adicione uma referncia para System.EnterpriseServices.dll. Para obter mais informaes, consulte Adicionando e removendo referncias. Adicione o namespace System.EnterpriseServices ao XML Web Service, como mostrado abaixo: C#
using System.EnterpriseServices;

3.

Use a propriedade TransactionOption do atributo WebMethod, como mostrado abaixo: C#


public class Service1 : System.Web.Services.WebService { [System.Web.Services.WebMethod( TransactionOption=TransactionOption.RequiresNew)] public string DoSomethingTransactional() { // The transaction was successful... ContextUtil.SetComplete(); return ContextUtil.TransactionId.ToString(); } }

Visual C# Consolidado

884

Como Depurar XML Web Services em Cdigo No Gerenciado


Quando voc estiver pronto para compilar e executar seu XML Web Service, voc deve primeiramente compilar o projeto de servio da Web ASP.NET. Depois de compilado, voc pode executar o XML Web Service. Para obter mais informaes, consulte Preparao para Depurao: Projetos de Servio da Web ASP.NET. Voc pode escolher entre trs mtodos para compilar e executar seu XML Web Service: Mtodo Com o depurador Descrio Este mtodo inicia o navegador padro e carrega a pgina inicial especificada. Executar uma pgina no depurador possibilita que voc navegue no cdigo linha por linha, e use ferramentas adicionais de anlise e informao em tempo de execuo. Caso o Visual Studio detecte que os arquivos chave foram alterados, ele tambm compilar o projeto antes iniciar o navegador com a pgina inicial especificada. Esse mtodo possibilita que voc possa executar seu cdigo como ele normalmente seria executado fora do contexto das ferramentas de desenvolvimento, e, portanto, nenhuma informao em tempo de execuo estar disponvel atravs dessas ferramentas. Caso o Visual Studio detecte que os arquivos chave foram alterados, ele compilar o projeto antes de iniciar o navegador com a pgina inicial especificada. Entretanto, voc pode anexar o depurador para o processo conforme necessrio. Este mtodo compila o projeto e abre uma pgina da Web escolhida no Solution Explorer. O Visual Studio compila e executa o projeto em um navegador padro dentro do Visual Studio.

Sem o depurador

Exibir no navegador

Compilar e executar um XML Web Service com o depurador 1. 2. 3. No Solution Explorer, clique com o boto direito do mouse no arquivo .asmx do XML Web Service que voc deseja executar, e clique Set As Start Page no menu de atalho. No menu Debug, clique em Start. Este comando instrui o Visual Studio a executar o XML Web Service no depurador. Para interromper a execuo do formulrio e retornar ao Code Editor, feche o navegador, ou clique em Stop Debugging no menuDebug. No Solution Explorer, clique com o boto direito do mouse no arquivo.asmx do XML Web Service que voc deseja executar, e clique Set As Start Page no menu de atalho. No menu Debug, clique em Start Without Debugging. O Visual Studio salva todos os arquivos no projeto e os compila. Uma vez compilados, o Visual Studio inicia o navegador padro e navega para a pgina inicial do projeto. 3. Para interromper a execuo do XML Web Service e retornar ao Code Editor, feche o navegador. No Solution Explorer, clique com o boto direito do mouse no arquivo.asmx do XML Web Service que voc deseja executar, e clique em View in Browser no menu de atalho.

Compilar e executar um XML Web Service sem o depurador 1. 2.

Compilar e executar um XML Web Service usando a opo View in Browser 1.

Visual C# Consolidado

885

O Visual Studio compila o XML Web Service e inicia a pgina inicial especificada dentro do IDE. 2. Para interromper a execuo do XML Web Service e retornar para o Code Editor, feche o navegador.

COMO: Implantar Servios da Web XML no Cdigo Gerenciado


Quando se usa o Visual Studio .NET para criar XML Web Services no cdigo gerenciado, voc usa um modelo de implantao padro: voc compila seu projeto e depois voc implanta os arquivos resultantes para um servidor de produo. O arquivo .dll do projeto contm o arquivo de classe code-behind dos XML Web Services (.asmx.vb ou .asmx.cs) juntamente com todos os outros arquivos de classe includos em seu projeto, mas no o prprio arquivo .asmx. Voc ento implanta este arquivo .dll nico do projeto para o servidor de produo sem qualquer cdigo-fonte. Quando o XML Web Services recebe uma solicitao, o arquivo .dll do projeto carregado e executado. Compilando e implantando um XML Web Services no cdigo gerenciado Suponha que voc tenha um simples projeto de servio da Web ASP.NET chamado WebService1 que contm o seguinte:

Uma pgina de entrada de XML Web Services denominada Service.asmx. Um arquivo de cdigo nomeado Service.vb (ou .cs).

Quando voc compila o projeto, ocorre o seguinte:


O Visual Studio salva todos os arquivos no projeto que voc modificou desde a ltima compilao. O Visual Studio copia o arquivo Service1.asmx e os arquivos de projeto padro para o servidor Web de desenvolvimento. O arquivo de classe Service.vb (ou .cs) e o arquivo de classe Global.asax so compilados no arquivo .dll do projeto, que ento copiado para o servidor no diretrio padro \bin do diretrio virtual de destino. Se o projeto for definido para compilar uma verso de depurao, o Visual Studio cria um arquivo .pdb do projeto no diretrio \bin. Observao Se ocorrerem erros de compilao, a implantao no ter xito. Para obter mais informaes, consulte Como Depurar XML Web Services em Cdigo No Gerenciado.

Para implantar o XML Web Services em um servidor que no seja o servidor de desenvolvimento, voc pode adicionar um Web Setup project ou voc pode copiar os arquivos necessrios para o servidor de destino. Para tornar seu XML Web Services disponvel para outros, voc precisar implant-lo em um servidor da Web que acessvel para os clientes que voc deseja dar suporte. Para obter mais informaes, consulte Implantando aplicativos e componentes e COMO: Copiar um projeto.

Implantar o XML Web Services atravs da cpia do projeto


1. 2. No Solution Explorer, selecione o projeto que voc deseja copiar. No menu Website, clique em Copy Web Site.

Visual C# Consolidado

886

3. 4. 5. 6.

Clique no cone ao lado da caixa suspensa Connect to: para abrir a caixa de dilogo Open Web Site. Na caixa Open Web Site, selecione a localidade para a qual voc deseja copiar o projeto. Usando os cones de seta, selecione arquivos do site da Web de origem para copi-los para o site da Web remoto. Clique em Copy Web Site para copiar o site da Web.

Aps implantar seu XML Web Services, voc precisa levar em considerao como tornar possvel que desenvolvedores o localizem, caso voc pretenda que outras pessoas o usem. Para obter mais informaes, consulte How to: Enable Discovery for XML Web Services.

COMO: Gerar um Proxy de Servio da Web XML


Para acessar um XML Web Service de um aplicativo cliente, voc primeiro adiciona uma referncia da Web, que uma referncia a um XML Web Service. Quando voc cria uma referncia da Web, o Visual Studio cria uma classe proxy XML Web Service automaticamente e o adiciona ao seu projeto. Esta classe do proxy expe os mtodos do XML Web Service e organiza a transferncia dos argumentos apropriados entre o XML Web service e o seu aplicativo. O Visual Studio usa o WSDL (Web Services Description Language) (WSDL) para criar o proxy. Para obter mais informaes, consulte Infra-estrutura servios XML da Web. Voc pode usar a propriedade URL da referncia da Web para especificar a URL para o XML Web Service. Ao adicionar uma referncia da Web, essa propriedade definida por padro para o URL do XML Web Service que voc selecionou, que um URL esttico. Uma referncia da Web pode usar um URL esttico ou um URL dinmico. Se voc definir a propriedade de comportamento URL da referncia da Web para dinmico, o aplicativo obtm o URL em tempo de execuo a partir da seo AppSettings elemento (esquema configuraes gerais) do arquivo de configurao do seu aplicativo. Para obter mais informaes, consulte Referncias da Web. Aps adicionar uma referncia da Web a um aplicativo cliente, voc pode chamar os mtodos expostos do XML Web Services e acessar os resultados exatamente como voc faria como qualquer outro mtodo de um componente. Para obter mais informaes, consulte Como: Chamar um servio da Web. Se voc no conseguir adicionar uma referncia da Web, quando por exemplo o XML Web service no est acessvel a partir da mquina em que voc est usando o Visual Studio, voc pode usar a ferramenta XML Web Services Description Language Tool (Wsdl.exe) para gerar uma classe de um proxy XML Web service cliente. Para obter mais informaes, consulte Criando um proxy XML Web service.

Como gerar uma classe de um proxy XML Web service

Adicione uma referncia da Web no seu projeto. Para obter mais informaes, consulte Como: Adicionar e remover referncias da Web. Uma classe de um proxy automaticamente gerada e adicionada sua soluo, que ento pode ser instanciada como uma outra classe qualquer.

COMO: Criar um Cliente de Aplicativo de Console


Exemplo do cdigo Criar um aplicativo de console que atua como um cliente de servios da Web bem simples. Depois que uma classe proxy for criada, uma nova instncia da classe proxy pode ser criada, contanto que ele seja acessvel pelo aplicativo de console. A maneira mais fcil para torn-lo

Visual C# Consolidado

887

acessvel para compilar a classe proxy em montagem para o aplicativo Console. Como alternativa, a classe proxy podem ser compilado em um conjunto e implantado onde o aplicativo Console possam acess-lo. Para criar um aplicativo cliente console Servio da Web 1. Criar um proxy para o servio da Web. C#
Wsdl http://www.contoso.com/Counter.asmx?WSDL

Para obter mais informaes, consulte Criando um proxy de servio da Web XML. 2. 3. Criar um aplicativo de console. Criar uma instncia da classe proxy em seu cdigo do cliente. C#
Counter myCounter = new Counter();

4.

Chame o mtodo da classe proxy que se comunica com o mtodo de servio da Web. C#
UsageCount = counter.ServiceUsage();

5.

Compilar o aplicativo Console em um executvel. No exemplo a seguir, o aplicativo Console foi salvo como UsageMonitor. C#
csc /t:exe /r:System.Web.dll,System.XML.dll,System.Web.Services.dll UsageMonitor.cs Counter.cs

Exemplo C#
using System; class UsageMonitor { public static void Main(string[] args) { int UsageCount; // Create an instance of the Web service class. Counter myCounter = new Counter(); // Call the Web service method ServiceUsage. UsageCount = myCounter.ServiceUsage(); // Output the results to the console. if (UsageCount == 1) Console.WriteLine("Web service has been utilized >" + UsageCount.ToString() + "< time."); else Console.WriteLine("Web service has been utilized >" + UsageCount.ToString() + "< times."); } }

COMO: Manipular Excees Lanadas por um Mtodo de Servio da Web


O exemplo de cdigo a seguir de um cliente chamar um mtodo de servio da Web captura um SoapException acionada pelo mtodo servio Web. O cliente depois preenche uma Tabela HTML com as propriedades do.For caught SoapException mais no tratamento falhas SOAP recebidas por clientes de servios da Web, consulte Tratamento e excees Throwing nos Servios XML da Web. Exemplo C#
<%@ Import Namespace="System.Web.Services.Protocols" %> <%@ Import Namespace="System.Xml" %> <%@ Page Language="C#" %> <html> <head> <script runat=server language=c#> void Page_Load(Object o, EventArgs e){ // Create a new instance of the Web service proxy class. ThrowSoapException throwSoapException = new ThrowSoapException(); // Make a call to the Web service method, which throws an // exception. try { throwSoapException.myThrow(); } catch (SoapException error) { // Populate the table

Visual C# Consolidado

888

with the exception details. ErrorTable.Rows.Add(BuildNewRow("Fault Code Namespace", error.Code.Namespace)); ErrorTable.Rows.Add(BuildNewRow("Fault Code Name", error.Code.Name)); ErrorTable.Rows.Add(BuildNewRow( "SOAP Actor that threw Exception", error.Actor)); ErrorTable.Rows.Add(BuildNewRow("Error Message", error.Message)); ErrorTable.Rows.Add(BuildNewRow("Detail", HttpUtility.HtmlEncode(error.Detail.OuterXml))); return; } } // This populates a row in an HtmlTable. HtmlTableRow BuildNewRow(string Cell1Text, string Cell2Text) { HtmlTableRow row = new HtmlTableRow(); HtmlTableCell cell1 = new HtmlTableCell(); HtmlTableCell cell2 = new HtmlTableCell(); //Set the contents of the two cells. cell1.Controls.Add(new LiteralControl(Cell1Text)); //Add a cell to the row. row.Cells.Add(cell1); cell2.Controls.Add(new LiteralControl(Cell2Text)); //Add a cell to the row. row.Cells.Add(cell2); return row; } </script> <head> <body> <table id="ErrorTable" CellPadding=5 CellSpacing=0 Border="1" BorderColor="black" runat="server" /> </body>

COMO: Implementar um Cliente Servio da Web Assncrono Usando a Tcnica de Callback


A tcnica de retorno de chamada uma maneira para implementar um cliente do servio da Web para se comunicar com um mtodo de servio da Web de forma assncrona, mesmo que o mtodo pode ser destinado a acesso assncrono. A tcnica explicado no tpico comunicao com Asynchronously servios XML da Web. Este exemplo for baseada em uma classe PrimeFactorizer de servio da Web com um mtodo Factorize, para o qual a ferramenta WSDL.exe gerou dois mtodos proxy cliente assncrona, BeginFactorize e EndFactorize. Para implementar a tcnica de retorno de chamada 1. Definir um funo callback que implementa o delegado AsyncCallback. C#
public static void FactorizeCallback(IAsyncResult ar)

2.

Criar uma instncia do AsyncCallback delegado. C#


AsyncCallback cb = new AsyncCallback(TestCallback.FactorizeCallback);

3.

Chamar o mtodo Begin, passando o funo callback como o segundo argumento e um objeto fornecendo estado (no neste exemplo, a implementao do cliente do PrimeFactorizer) como o terceiro argumento. C#
IAsyncResult ar = pf.BeginFactorize(factorizableNum, cb, pf);

4. 5.

Verifique a propriedade IsCompleted em retornado pelo mtodo Begin. o IAsyncResult O valor definido como true Depois o cliente tem recebeu uma resposta de um servidor. Dentro do funo callback, acessar o objeto estado. O IAsyncState parmetro na propriedade AsyncState possui o objeto passado como o terceiro parmetro para o Begin mtodo. C#
PrimeFactorizer pf = (PrimeFactorizer) ar.AsyncState;

6.

Dentro do funo callback, chame o mtodo final sobre o objeto estado obtidos na etapa anterior.

Visual C# Consolidado

889

C#
long[] results = pf.EndFactorize(ar);

Exemplo C#
using System; using System.Runtime.Remoting.Messaging; using MyFactorize; class TestCallback { public static void Main(){ long factorizableNum = 12345; PrimeFactorizer pf = new PrimeFactorizer(); //Instantiate an AsyncCallback delegate to use as a parameter //in the BeginFactorize method. AsyncCallback cb = new AsyncCallback(TestCallback.FactorizeCallback); // Begin the Async call to Factorize, passing in our // AsyncCalback delegate and a reference // to our instance of PrimeFactorizer. IAsyncResult ar = pf.BeginFactorize(factorizableNum, cb, pf); // Keep track of the time it takes to complete the async call // as the call proceeds. int start = DateTime.Now.Second; int currentSecond = start; while (!ar.IsCompleted){ if (currentSecond < DateTime.Now.Second) { currentSecond = DateTime.Now.Second; Console.WriteLine("Seconds Elapsed..." + (currentSecond - start).ToString() ); } } // Once the call has completed, you need a method to ensure the // thread executing this Main function // doesn't complete prior to the call-back function completing. Console.Write("Press Enter to quit"); int quitchar = Console.Read(); } // Set up a call-back function that is invoked by the proxy class // when the asynchronous operation completes. public static void FactorizeCallback(IAsyncResult ar) { // You passed in our instance of PrimeFactorizer in the third // parameter to BeginFactorize, which is accessible in the // AsyncState property. PrimeFactorizer pf = (PrimeFactorizer) ar.AsyncState; long[] results; // Get the completed results. results = pf.EndFactorize(ar); //Output the results. Console.Write("12345 factors into: "); int j; for (j = 0; j<results.Length;j++){ if (j == results.Length - 1) Console.WriteLine(results[j]); else Console.Write(results[j] + ", "); } } }

COMO: Implementar um Cliente Servio da Web Assncrono Usando a Tcnica de Espera


A tcnica de espera uma maneira para implementar um cliente do servio da Web para se comunicar com um mtodo de servio da Web de forma assncrona, mesmo que o mtodo pode ser destinado a acesso assncrono. A tcnica explicado no tpico comunicao com Asynchronously servios XML da Web. Este exemplo for baseada em uma classe PrimeFactorizer de servio da Web com um mtodo Factorize, para o qual a ferramenta WSDL.exe gerou dois mtodos proxy cliente assncrona, BeginFactorize e EndFactorize. Para implementar a tcnica de espera 1. O cliente de servios da Web chama o Begin mtodo da classe proxy gerado. C#
IAsyncResult ar = pf.BeginFactorize(factorizableNum, null, null);

2.

O cliente de servios da Web acessa um WaitHandle objeto atravs da AsyncWaitHandle propriedade do retornado IAsyncResult. O cliente chama um dos mtodos de espera, a WaitHandle classe e espera para um ou mais objetos de sincronizao a ser sinalizado. Se um cliente usa essa tcnica para assincronamente chamar apenas um mtodo de servio da Web, ele poder chamar WaitOne para aguardar o processamento desse mtodo para concluir. Outros mtodos espera so WaitAny e WaitAll. C#

Visual C# Consolidado

890

ar.AsyncWaitHandle.WaitOne();

3.

Quando o mtodo de espera retorna, o cliente chama o End mtodo para obter os resultados. C#
results = pf.EndFactorize(ar);

Exemplo C#
// -----------------------------------------------------------------------// Async Variation 2. // Asynchronously invoke the Factorize method, //without specifying a call back. using System; using System.Runtime.Remoting.Messaging; // MyFactorize, is the name of the namespace in which the proxy class is // a member of for this sample. using MyFactorize; class TestCallback { public static void Main(){ long factorizableNum = 12345; PrimeFactorizer pf = new PrimeFactorizer(); // Begin the Async call to Factorize. IAsyncResult ar = pf.BeginFactorize(factorizableNum, null, null); // Wait for the asynchronous operation to complete. ar.AsyncWaitHandle.WaitOne(); // Get the completed results. long[] results; results = pf.EndFactorize(ar); //Output the results. Console.Write("12345 factors into: "); int j; for (j = 0; j<results.Length;j++){ if (j == results.Length - 1) Console.WriteLine(results[j]); else Console.Write(results[j] + ", "); } } }

Passo-a-passo: Redirecionando um Aplicativo para Apontar para um Servio da Web XML Diferente na Instalao
Esta explicao passo a passo demonstra como criar um aplicativo da Web que pode ser redirecionado para alcanar um XML Web Services diferente usando a propriedade URL Behavior, uma classe Installer, e um projeto de instalao da Web. Isso til quando voc precisa alcanar um XML Web Services localmente durante o desenvolvimento e deseja usar uma verso de produo do XML Web Services quando seu aplicativo for implantado. Observao As caixas de dilogo e comandos de menu voc v pode diferir das descritas na Ajuda dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para mais informaes, consulte Configuraes do Visual Studio. Criando o projeto de aplicativos da Web A primeira etapa criar um projeto de aplicativos da Web ASP.NET que contm uma referncia da Web para um XML Web Services.

Para criar o projeto

Crie um aplicativo da Web que tenha uma referncia da Web para um XML Web Services. Uma referncia da Web para qualquer XML Web Services vlido bastar para esta explicao passo a passo. Por exemplo, voc pode usar o aplicativo da Web descrito em Passo-a-Passo: acessando um XML Web Services utilizando Visual Basic ou Visual C# Adicionando uma classe Installer

Visual C# Consolidado

891

Classes Installer, tambm conhecidas como componentes de instalao, so classes .NET Framework chamadas como aes personalizadas durante a instalao. Nesse caso, voc adicionar um projeto de biblioteca de classes soluo. Nesse projeto de biblioteca de classes, voc ir criar uma classe Installer e substituir seu mtodo Install, adicionando cdigo para modificar o aplicativo da Web do arquivo .config. Para obter mais informaes sobre classes Installer, consulte Introduo aos componentes de instalao.

Para criar o projeto de biblioteca de classes


1. 2. 3. Clique com o boto direito do mouse no n soluo no Solution Explorer e clique em Add, em seguida clique em New Project. Na caixa de dilogo Add New Project, no n Visual Basic, selecione Class Library. Nomeie o projeto InstallerClassLibrary.

Para adicionar e implementar uma classe Installer


1. 2. Clique com o boto direito do mouse no n de projeto InstallerClassLibrary no Solution Explorer, e em seguida, clique em Add, e depois Class. Na caixa de dilogo Add New Item, selecione Installer Class e altere o Name para WebServiceInstaller.vb. Quando voc clicar em Add, a classe ser adicionado ao projeto, e o designer para a classe Installer abrir. 3. 4. Clique duas vezes no designer para abrir o editor de cdigos. No WebServiceInstaller.vb, adicione o seguinte cdigo na parte inferior do mdulo de classe Installer (logo acima da declarao End Class); esse cdigo implementa o mtodo Install: Visual Basic
Public Overrides Sub Install(ByVal stateSaver As _ System.Collections.IDictionary) ' Gets the parameter passed across in the CustomActionData. Dim installlog As New System.IO.StreamWriter("Installation.log") installlog.AutoFlush = True Try Dim ProvidedName As String = Me.Context.Parameters.Item("ServerName") Dim SvcName As String = Me.Context.Parameters.Item("ServiceName") installlog.WriteLine("Starting Edit of the config file") If ProvidedName = "" Or SvcName = "" Then Throw New InstallException("No arguments specified") End If ' Uses reflection to find the location of the config file. Dim Asm As System.Reflection.Assembly = _ System.Reflection.Assembly.GetExecutingAssembly Dim strConfigLoc As String strConfigLoc = Asm.Location Dim strTemp As String strTemp = strConfigLoc strTemp = strTemp.Remove(strTemp.LastIndexOf("\"), Len(strTemp) - _ strTemp.LastIndexOf("\")) strTemp = strTemp.Remove(strTemp.LastIndexOf("\"), Len(strTemp) - _ strTemp.LastIndexOf("\")) Dim FileInfo As System.IO.FileInfo = New System.IO.FileInfo( _ strTemp & "\web.config") installlog.WriteLine("File info: " & strTemp) If Not FileInfo.Exists Then Throw New InstallException("Missing config file") End If ' Loads the config file into the XML DOM. Dim XmlDocument As New System.Xml.XmlDocument() XmlDocument.Load(FileInfo.FullName) ' Finds the right node and change it to the new value. Dim Node As System.Xml.XmlNode Dim FoundIt As Boolean = False For Each Node In _ XmlDocument.Item("configuration").Item("appSettings") ' Skips any comments. If Node.Name = "add" Then If Node.Attributes.GetNamedItem("key").Value = _ "servername.service" Then ' Note that "Service1.asmx" should be replaced with the ' actual name of the XML Web service file. Node.Attributes.GetNamedItem("value").Value = "http://" _ & ProvidedName

Visual C# Consolidado

892

& "/" & SvcName & "/Service1.asmx" FoundIt = True End If End If Next Node If Not FoundIt Then Throw New InstallException("Config file did not contain a ServerName section") End If ' Writes out the new config file. XmlDocument.Save(FileInfo.FullName) Finally installlog.WriteLine("Ending edit of config file") installlog.Close() End Try End Sub

O cdigo acima primeiro cria um arquivo de log de instalao que ir gravar o andamento de uma ao personalizada. O namespace System.Reflection usado para localizar o assembly que est sendo instalado e para localizar o arquivo .config associado. O modelo de documento do XML usado para fazer uma iterao atravs do arquivo .config at a seo appSettings ser localizada. Quando a chave servername.service for encontrada, seu valor associado alterado para incluir os parmetros que foram passados, redirecionando o aplicativo para usar o novo XML Web Services. 5. 6. No Solution Explorer, clique duas vezes no arquivo Web.config para abr-lo. Copie o valor da chave para seu XML Web Services na seo appSettings . A chave assume a forma servername.service onde servername o servidor onde o XML Web Services est localizado, e service o nome do XML Web Services. Abra o mdulo de classe Installer no editor de cdigos e substitua o texto "ServerName.Service" com o valor que voc copiou na etapa anterior. Adicione um projeto de instalao da Web Projetos de instalao so usados para criar um instalador para o aplicativo. Baseados na tecnologia do Windows Installer, projetos de instalao incluem recursos como a capacidade para executar aes personalizadas durante a instalao e para personalizar a interface do usurio de instalao. Para obter mais informaes sobre projetos de instalao, consulte Implantando aplicativos e componentes.

7.

Para adicionar um projeto de instalao da Web


1. 2. Clique com o boto direito do mouse no n soluo em Solution Explorer e clique em Add, em seguida clique em New Project. Na caixa de dilogo Add New Project, no painel Project Types, expanda o n Other Project Types, e selecione o n Setup and Deployment Projects. No painel Templates, selecione Web Setup Project. Na caixa Name, nomeie o projeto WebAppSetup. Quando voc clicar em OK, o projeto ser adicionado a soluo e o File System Editor ser aberto. 3. 4. 5. 6. Na janela Properties, selecione Propriedade ProductName e defina-a para o nome do seu aplicativo da Web. No File System Editor, marque Web Application Folder. No menu Action, aponte para Add, e clique em Project Output. Na caixa de dilogo Add Project Output Group, selecione InstallerClassLibrary da lista suspensa Project; em seguida, selecione Primary Output. Quando voc clicar em OK, a sada principal da InstallerClassLibrary ser adicionada ao projeto de instalao da Web. Adicionando uma ao personalizada Aes personalizadas so usadas para executar cdigo no final de uma instalao para executar aes que no podem ser tratadas durante a instalao. O cdigo para uma ao personalizada pode estar contido em um arquivo .dll, .exe, script, ou assembly. Para mais informaes sobre aes personalizadas, consulte Gerenciamento aes na implantao personalizada.

Visual C# Consolidado

893

Para adicionar a classe installer como uma ao personalizada


1. 2. 3. 4. 5. 6. 7. No Solution Explorer, selecione o projeto WebAppSetup. No menu View, clique em Editor, e depois em Custom Actions. O Custom Actions Editor abre. No Custom Actions Editor, selecione o n Install. No menu Action, escolha Add Custom Action. Clique duas vezes no Web Application Folder, e selecione Primary output from InstallerClassLibrary (Active). Na janela Properties, verifique se a propriedade InstallerClass est definida como True. Selecione a propriedade CustomActionData e digite o texto a seguir: /ServerName=[EDITA1] /ServiceName=[EDITA2] A propriedade CustomActionData fornece os dois parmetros que so passados para a ao personalizada, separados por um espao. Adicionando uma caixa de dilogo Caixas de dilogo de interface de usurio so exibidas durante a instalao para coletar informaes do usurio. Para obter mais informaes sobre caixas de dilogo de interface de usurio, consulte Gerenciamento de interface de usurio na implantao.

Para adicionar uma caixa de dilogo de interface de usurio personalizada


1. 2. 3. 4. 5. 6. 7. No Solution Explorer, selecione o projeto a instalao. No menu View, aponte para Editor, e em seguida, clique em User Interface. No User Interface Editor, selecione o n Start em Install. No menu Action, escolha Add Dialog. Na caixa de dilogo Add Dialog, escolha a caixa de dilogo Textboxes (A) e clique em OK. No menu Action, escolha Move Up, e repita at o dilogo Textboxes (A) estar localizado acima do dilogo Installation Address. Na janela Properties, defina as seguintes propriedades: Propriedade Valor BannerText Edit1Label Edit1Value Digite o nome do servidor e o nome do servio Nome do servidor: LocalHost Observao Isso especifica um servidor padro. Voc pode inserir seu prprio nome de servidor padro aqui.

Visual C# Consolidado

894

Edit2Label Edit2Value

Nome do servio: <nome do servio>

Edit3Visible False Edit4Visible False 8. Observe que a propriedade Edit1Property est definida como "EDITA1" e a propriedade Edit2Property est definida como "EDITA2". Isso corresponde aos valores que voc inseriu na propriedade CustomActionData no Custom Actions Editor. Quando o usurio insere texto nesses controles de edio durante a instalao, os valores so passados automaticamente por meio da propriedade CustomActionData. Criando e implantando o aplicativo A etapa final criar o projeto de instalao para criar o instalador, e para instalar o aplicativo no servidor de destino.

Para criar o projeto de instalao

No menu Build, escolha Build Projectname, onde Projectname o nome do seu projeto de instalao.

Para implantar o aplicativo em um servidor Web no seu computador de desenvolvimento


1. 2. No Solution Explorer, selecione o projeto a instalao. No menu Project, clique em Install.

Para implantar o aplicativo em um servidor Web em outro computador


1. No Windows Explorer, navegue at o diretrio de projeto e localize o instalador criado. O caminho padro ser \documents and settings\ yourloginname\My Documents\Visual Studio Projects\setupprojectname\project configuration\productname.msi O project configuration padro Debug. Copie o arquivo .msi e todos os outros arquivos e subpastas no diretrio para o computador do servidor Web. No computador do servidor Web, clique duas vezes no arquivo Setup.exe para executar o instalador.

2. 3.

Protegendo Servios da Web XML Criados Usando ASP.NET


Decidir qual implementao de segurana melhor para um servio da Web comea com olhando para dois princpios de segurana de chave: Autenticao e autorizao. Autenticao o processo de validar uma identidade com base nas credenciais, como um nome de usurio e senha, contra uma autoridade. Quando uma identidade tiver sido autenticado, autorizao determina se a identidade est autorizado a acessar um recurso. Servios da Web criados com ASP.NET pode escolher as opes de segurana da autenticao e autorizao opes oferecidas pelo ASP.NET ou personalizado de segurana baseada em SOAP. ASP.NET funciona em conjunto com Internet Information Services (IIS) para fornecer autenticao e autorizao vrias opes. Tambm possvel para criar opes de autenticao

Visual C# Consolidado

895

personalizado, como o uso de cabealhos SOAP. Alm disso, o ASP.NET oferece a capacidade, conhecida como representao, para executar uma solicitao usando as credenciais do cliente. Para obter mais informaes sobre como usar a representao, consulte Representao ASP.NET. Este tpico resume as opes disponveis para servios da Web criados com ASP.NET autenticao e autorizao. Para obter mais informaes sobre opes de segurana disponveis para aplicativos da Web ASP.NET, consulte Proteger Aplicativos da Web ASP.NET Como Criando aplicativos ASP.NET seguros: autenticao, autorizao e comunicao seguraSegurana de aplicativos da Web ASP.NET. Para obter mais informaes sobre como acessar recursos remotos de aplicativos-baseado em ASP.NET, consulte os tpicos " modelo Impersonation / Delegation " e confiveis modelo subsistema " " no captulo 3 de Criando aplicativos ASP.NET Seguros. Opes de autenticao para servios XML da Web Servios da Web criados com ASP.NET tem vrias opes para autenticar clientes, portanto, a pergunta grande: qual um for da direita para um servio da Web especfico? Para escolher a opo Segurana direita, uma das coisas para escolher entre um desenvolvedor tem o nvel de segurana e desempenho. Para alguns servios da Web, essencial que credenciais cliente so enviados atravs da rede usando criptografia, portanto, um algoritmo que criptografa as credenciais do cliente essencial. Por exemplo, um desenvolvedor gravar um servio da Web que processa cartes de crdito provavelmente worries mais sobre as credenciais do cliente seja roubado que a sobrecarga extra de criptografar os dados de carto de crdito. A tabela a seguir um resumo das opes de autenticao disponveis para servios da Web criado com o ASP.NET. Opes prefixo com o Windows so uma parte das opes de autenticao Windows disponveis para servios da Web criados com ASP.NET. Resumo das opes de autenticao Opo de autenticao Windows-Basic

Descrio Use para identificao no seguros de clientes, como o nome de usurio e senha so enviados em Base seqncias codificado 64-em texto sem formatao. Senhas e nomes de usurio so codificado, mas no criptografados, neste tipo de autenticao. Um usurio determinado, malintencionado equipado com uma ferramenta monitoramento de rede-pode interceptar nomes de usurio e senhas.

Windows-Basic via Use para identificao dos clientes em cenrios de Internet seguros. O nome SSL de usurio e senha so enviados atravs da rede usando criptografia Layer (SSL) soquetes Segurana, em vez de texto sem formatao. Este relativamente fcil para configurar e funciona para cenrios de Internet. No entanto, usando SSL diminui o desempenho. Windows-Digest Use para identificao dos clientes em cenrios de Internet seguros. Desmarque usa hash para transmitir credenciais cliente de uma maneira criptografado para a senha no so transmitidos em texto. Alm disso, autenticao Digest pode trabalhar atravs de servidores proxy. No entanto, ele suporte em outras plataformas no amplamente.

Visual C# Consolidado

896

WindowsIntegrada do Windows Windowscertificados de cliente

Usa NTLM ou Kerberos. Usa uma troca criptogrfica com navegador da Web Microsoft Internet Explorer do usurio.

Usar para identificao dos clientes na Internet e intranet seguras cenrios. Requer cada cliente para obter um certificado de um autoridade de certificao mutuamente confivel. Certificados opcionalmente so mapeados para contas de usurio, que so usadas pelo IIS para autorizar acesso ao servio da Web. No suporte para servios da Web. Isso um sistema pelo qual as solicitaes no autenticadas so redirecionadas para um formulrio HTML utilizando o redirecionamento do lado do cliente HTTP. A maioria dos clientes de servios da Web no ser deseja fornecer credenciais usando uma interface; voc deve resolver isso se voc desejar usar a autenticao de formulrios. til para cenrios de Internet seguros e no seguras. Credenciais de usurio so passados no cabealho SOAP da mensagem SOAP. O servidor Web, independentemente da plataforma que hospeda o servio da Web, fornece uma implementao de autenticao personalizado.

Formulrios

SOAP cabealhos personalizados

Para todas as opes listadas acima, exceto o uso de cabealhos SOAP, as configuraes de segurana so especificadas usando uma combinao de arquivos de configurao e o IIS. Para obter mais informaes sobre arquivos de configurao, consulte ASP.NET Configuration. A opo cabealhos SOAP personalizados detalhado seguinte na seo Autorizao como essa soluo envolve a autenticao e autorizao.

A autenticao do Windows
O IIS e ASP.NET fornecem suporte para autenticar aplicativos da Web, incluindo servios da Web, usando segurana criado na para Windows. Windows fornece trs opes para autenticao: BASIC, Digest e integrada do Windows. Alm disso, cada opo pode ser usada com SSL. Como todos os Windows autenticao opes exceto Basic criptografar os dados em algum formulrio, o nvel de criptografia oferecidos pelo SSL adicionais normalmente somente usada em juntamente com Basic ou certificados de cliente. Independentemente do que opo autenticao Windows usada, os procedimentos para configurar o servio da Web e cliente servio Web so semelhantes. Para obter mais informaes, consulte Como configurar um servio da Web XML para a autenticao do Windows:. Nenhum cdigo precisa para ser adicionado ao um servio da Web para usar a autenticao do Windows, como as opes de autenticao so definidas em um arquivo de configurao e do IIS. Cdigo para passar o cliente credenciais para o servio da Web deve ser adicionado a um cliente de servios da Web. Se SSL for escolhido como parte do mecanismo de autenticao usado por um servio da Web, SSL precisar ser configurado para o aplicativo da Web que hospeda o servio da Web ou para o servio da Web propriamente dito, usando o IIS. O descrio do servio e, conseqentemente, proxy classes gerado a partir do descrio do servio refletir que o servio da Web usa SSL (se o descrio do servio e pgina Ajuda servio so acessados usando SSL). Ser a URL para o servio da Web dentro do descrio do servio ser prefixados com HTTPS. Para obter mais informaes sobre como configurar a SSL, consulte a documentao do IIS.

Visual C# Consolidado

897

Autenticao de certificado de cliente


Certificados de cliente ajudam a fornecer um mecanismo seguro para autenticao, como clientes so necessrios para enviar um documento eletrnico, chamado um certificado de cliente, que identifica um cliente usando uma conexo SSL para o servidor Web. A conexo SSL criptografa as credenciais do cliente contido o certificado de cliente como eles so enviados atravs da rede. Comunicao entre o cliente e o servidor Web criptografada usando uma combinao das chaves de criptografia enviadas pelo cliente e teclas fornecidos pelo servidor Web. Assim que a comunicao for estabelecida, somente os computadores cliente e servidor podero se comunicar uns aos outros usando essa conexo SSL. Um certificado de cliente pode ser obtido de um autoridade de certificao, que pode ser o servidor Web prprio ou um intermedirio confivel entre o cliente e servidor. Depois que um certificado tenha sido obtido, e o servidor Web foi configurado para aceitar certificados de cliente, um cliente pode enviar o certificado de cliente para o servidor Web atravs de uma conexo SSL, quando um servio da Web chamado. Para obter mais informaes sobre certificados de cliente, consulte a documentao do IIS. Para obter mais informaes sobre como configurar autenticao de Certificado de Cliente para um servio da Web, consulte Como configurar um servio da Web XML para a autenticao do Windows:. Opes de autorizao para servios XML da Web O objetivo de autorizao para determinar se uma identidade deve ser concedido o tipo de acesso a determinado recurso solicitado. Existem duas maneiras fundamentais para autorizar acesso a um determinado recurso: arquivo autorizao e a autorizao de URLs. Autorizao arquivo pode ser usado sempre que a autenticao do Windows for utilizado, como as permisses so definidas no IIS em uma base por arquivo. A autorizao de URL pode ser usado com qualquer dos mecanismos autenticao interna Suporte ao ASP.NET Com a autorizao de URLs, configurao feito atravs de um arquivo de configurao, onde os usurios podem ser seletivamente concedidas ou acesso negado a quaisquer arquivos associados ao ASP.NET, inclusive arquivos.asmx. Para obter mais informaes sobre como configurar autorizao em uma base por arquivos, consulte a documentao do IIS. Para obter mais informaes sobre como configurar autorizao usando um arquivo de configurao, consulte Autorizao ASP.NET.

Autenticao usando cabealhos SOAP personalizados


Os mecanismos de autenticao do Windows, incluindo certificados de cliente, contam com o transporte HTTP, enquanto SOAP independente de transporte-. Servios da Web criados com ASP.NET usam SOAP sobre HTTP,, bem como HTTP-POST e implementaes HTTP-GET que retornam documentos XML SOAP no-. Portanto, um motivo para criar um mecanismo de autenticao personalizado para decouple a autenticao a partir do transporte. Isso pode ser feito, passando as credenciais de autenticao no cabealho SOAP. Cabealhos SOAP so uma tima maneira de passar fora de banda ou informaes no relacionado semntica de um servio da Web. Diferentemente o Body elemento de um SOAP mensagem, que inclui a em e sem parmetros para a Web operao de servio que so processados pelo mtodo Servio da Web, o Header elemento opcional e pode assim ser processada pelo infra-estrutura. Isto , processados pelo infra-estrutura desenvolvido para fornecer um mecanismo de autenticao personalizada. Para obter uma descrio de um mtodo de usando cabealhos SOAP para autenticao, consulte Como executar autenticao personalizada usando cabealhos SOAP:.

Visual C# Consolidado

898

Um cliente de servios da Web para usar cabealhos SOAP para autenticao, deseja enviar suas credenciais para o servio da Web, adicionando o cabealho SOAP esperado solicitao SOAP e preenchendo-lo com as credenciais do cliente. Para usar autenticao cabealho SOAP, um servio da Web deve seguir duas coisas: especificar que espera o cabealho SOAP que contm as credenciais de autenticao e autorizar o acesso do cliente para o servio da Web.

Visual C# Consolidado

899

Acesso a Dados (Como fazer em C#)


Os links desta pgina ajudam nas tarefas de acesso a dados amplamente usadas. Para ver outras categorias de tarefas comuns abordadas na Ajuda, consulte Como fazer em C#.

COMO: Instalar Bancos de Dados de Exemplo


Muitos tpicos do Visual Studio e exemplos de cdigo requerem a capacidade de se conectar a um banco de dados, como o banco de dados de exemplo Northwind. Se voc estiver executando o SQL Server e o banco de dados Northwind no estiver disponvel, ento consulte o SQL Books Online para obter informaes sobre como instal-lo. Se voc no tem uma cpia do SQL Server, ento voc pode acessar os bancos de dados de exemplo instalando o SQL Server Express (SSE), ou uma verso Access do Northwind. Observao As caixas de dilogo e comandos de menu que voc ver, podem diferir daquelas descritas no Help dependendo da sua configurao ativa ou edio. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Visual Studio Settings. Para instalar o banco de dados de exemplo Northwind do Microsoft Access 1. 2. No Windows, abra o Internet Explorer. Navegue at a seguinte URL: http://www.microsoft.com/downloads/details.aspx?familyid=c6661372-8dbe-422b-8676c632d66c529c&displaylang=en(Access 2000 Tutorial: Northwind Traders Sample Database) Clique no boto Download. Na caixa File Download, escolha Save This File Now e clique em OK. Depois de descarregar o arquivo, clique duas vezes no arquivo Nwind.exe para instalar o banco de dados. No Windows, abra o Internet Explorer. Navegue at a seguinte URL: http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46a0-8da2eebc53a68034&amp;DisplayLang=en (Northwind and Pubs Sample Databases) Clique no boto Download. Na caixa File Download, escolha Save This File Now e clique em OK. Depois de descarregar o arquivo, clique duas vezes no arquivo Nwind.exe para instalar o banco de dados. No Windows, abra o Internet Explorer. Navegue at a seguinte URL: http://www.microsoft.com/downloads/details.aspx?familyid=487C9C23-2356-436E-94A82BFB66F0ABDC&amp;displaylang=en (Adventure Works Cycles Database 2000) Clique no boto Download. Na caixa File Download, escolha Save This File Now e clique em OK.

3. 4. 5.

Para instalar os bancos de dados de exemplo Northwind e Pubs para o SQL Server 1. 2.

3. 4. 5.

Para instalar os bancos de dados de exemplo Adventure Works para o SQL Server 2000 1. 2.

3. 4.

Visual C# Consolidado

900

5.

Depois de descarregar o arquivo, clique duas vezes no arquivo Nwind.exe para instalar o banco de dados. No Windows, abra o Internet Explorer. Navegue at a seguinte URL: http://www.microsoft.com/downloads (Microsoft Download Center) No campo Keywords, digite SQL Server Express. Clique em Go. Na pgina de resultados, siga o link para a pgina de download do SQL Server Express e siga as instrues.

Para baixar e instalar o SQL Server Express 1. 2. 3. 4. 5.

Segurana Sempre verifique se h atualizaes do produto ao instalar um software adicional.

Passo a passo: Criando um aplicativo de dados simples


Uma dos cenrios mais comuns no desenvolvimento de aplicativos exibir dados de um banco de dados em um Windows Form. Voc pode exibir dados em formulrios em aplicativos Windows, arrastando itens da Janela de fontes de dados em seu formulrio. Esta explicao passo a passo demonstra como criar um aplicativo que exiba dados de duas tabelas relacionadas em um banco de dados. Observao As caixas de dilogo e comandos de menu que voc v podem diferir das descritas na Ajuda dependendo de suas configuraes ativas. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Visual Studio Settings. As tarefas ilustradas nesta explicao passo a passo incluem:

Criando um aplicativo Windows. Criando e configurando um dataset em seu aplicativo baseado nas tabelas Customers e Orders do banco de dados Northwind usando o Assistente para Configurao da Fonte de Dados Adicionando controles para exibir dados da tabela Customers. Adicione os controles para exibir os Orders baseado na seleo dos Customer Testando o aplicativo, selecione diferentes clientes e verifique se os pedidos corretos so exibidos para o cliente selecionado. Pr-requisitos

A fim de concluir esta explicao passo a passo, ser necessrio:

Acesso ao banco de dados de exemplo Northwind. Para configurar bancos de dados de exemplo, consulte COMO: Instalar Bancos de Dados de Exemplo. Criando o Projeto

A primeira etapa para criar um projeto Windows Application.

Visual C# Consolidado

901

Para criar o projeto


1. 2. 3. No menu File, criar um novo projeto. Selecione Windows Application e nomeie com DataWalkthrough. Para obter mais informaes, consulte Creating Windows-based Applications. Clique em OK. O projeto DataWalkthrough criado e adicionado Solution Explorer. Criando a fonte de dados Esta etapa cria um dataset com base nas tabelas Customers e Orders do banco de dados de exemplo Northwind.

Para criar a fonte de dados


1. 2. 3. 4.
o

No menu Data, clique em Show Data Sources. Na janela Data Sources, clique em Add New Data Source para iniciar o assistente Data Source Configuration. Selecione Database na pgina Choose a Data Source Type, e clique Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind estiver disponvel na lista suspensa, selecione-a. OuSelecione New Connection para iniciar a caixa Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais, e clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione as tabelas Customers e Orders, e clique Finish O NorthwindDataSet adicionado ao seu projeto e as tabelas Customers e Orders aparecem na janela Data Sources. Criando controles para exibir dados da tabela de Clientes

5. 6. 7. 8.

Para criar os controles para exibir os dados do cliente (registros pai)


1. 2. 3. Na janela Data Sources, selecione a tabela Customers, e clique na seta suspensa. Selecione Details na lista de controle da tabela Customer. Arraste o n principal Customers da janela Data Sources no Form1. Os controles com dados vinculados com rtulos descritivos aparecem no formulrio, juntamente com uma faixa da ferramenta. (BindingNavigator) para navegar pelos registros. O NorthwindDataSet, CustomersTableAdapter, BindingSource, e BindingNavigator aparecem na bandeja de componentes. Criando controles para exibir dados da tabela Pedidos Criando os controles para exibir os pedidos para cada cliente (registros filho)

Na janela Data Sources, expanda o n Customers e selecione a ltima coluna na tabela Customers, que um n expansvel Orders sob a coluna Fax, e arraste-o para a parte inferior

Visual C# Consolidado

902

do Form1. (Este n na hierarquia da tabela Customers representa os pedidos relacionados para um cliente, como contrrio para o n principal Orders, que representa todos os registros da tabela Orders e no os pedidos para um cliente individual.) O DataGridView adicionado ao formulrio, e um novo componente BindingSource (OrdersBindingSource) e um TableAdapter (OrdersTableAdapter) so adicionados bandeja de componentes. Observao Abra a janela Properties e selecione o componente OrdersBindingSource. Inspecione o DataSource e as propriedades DataMember para ver como a vinculao de dados est configurada para exibir os registros relacionados. O DataSource definida como CustomersBindingSource (a tabela pai BindingSource), em oposio a tabela Orders. A propriedade DataMember definida como FK_Orders_Customers, que o nome do objeto DataRelation que relaciona as tabelas uma com a outra. Testando o aplicativo

Para testar o aplicativo


1. 2. Pressione F5. Selecione diferentes clientes para verificar se os pedidos corretos so exibidos na grade do formulrio. Prximas etapas Dependendo dos seus requisitos para o aplicativo, existem vrias etapas que voc pode desejar executar aps criar um formulrio de detalhes mestre. Voc pode fazer nesta explicao passo a passo alguns aprimoramentos, que incluem:

Editar a consulta que carrega os dados para o aplicativo com os assistentes TableAdapter. Para obter mais informaes, e Como editar TableAdapters:. ver Como: Editar consultas do TableAdapter, Adicionar a validao para verificar se os dados corretos esto sendo inseridos, antes de enviar as alteraes para o banco de dados. Para obter mais informaes, consulte Validando dados.

Viso geral sobre como conectar-se a dados no Visual Studio


O Visual Studio fornece ferramentas para conectar seu aplicativo a dados de vrias fontes diferentes, como bancos de dados, servios da Web, e objetos. Se voc estiver usando ferramentas de design de dados no Visual Studio, voc freqentemente no precisa criar explicitamente um objeto de conexo para o seu formulrio ou componente. O objeto conexo normalmente criado como resultado da concluso de um dos assistentes de dados ou do arraste de objetos de dados em seu formulrio. Para conectar seu aplicativo a dados de um banco de dados, servio da Web, ou objeto, execute o Assistente para Configurao da Fonte de Dados., selecionando Add New Data Source no Janela de fontes de dados O diagrama a seguir mostra o fluxo padro de operaes ao se conectar a dados atravs da execuo de uma consulta TableAdapter para buscar dados e exibi-los em um formulrio de um aplicativo do Windows.

Visual C# Consolidado

903

Em algumas situaes, talvez seja conveniente criar um objeto de conexo sem a assistncia de qualquer ferramentas de design de dados. Para informaes sobre como criar conexes programaticamente, consulte Connecting to Data Sources. Observao Para obter informaes sobre como conectar aplicativos da Web a dados, consulte Acessando dados com o ASP.NET. Criando conexes Ao usar Visual Studio, conexes so configuradas usando o Add/Modify Connection Dialog Box (General). A caixa de dilogoAdd Connection aparece quando voc est editando ou criando conexes dentro de um dos assistentes de dados ou doServer Explorer / Database Explorer ou quando voc estiver editando propriedades de conexo na janela Properties Conexes de dados so automaticamente configuradas quando voc executa uma das seguintes aes: Ao Descrio

Execuo do Assistente para Conexes so configuradas quando o caminho do banco de dados Configurao da Fonte de escolhido no Data Source Configuration Wizard. Para obter Dados. mais informaes, consulte Como: Conectar-se a Dados em um Banco de Dados.

Visual C# Consolidado

904

Execuo do Assistente de Configurao para o TableAdapter. Execuo do Assistente de configurao da consulta TableAdapter. Arraste de itens da Janela de fontes de dados para um formulrio ou o Component Designer

Conexes so criadas dentro do TableAdapter Configuration Wizard. Para obter mais informaes, consulte Como: Criar TableAdapters. Conexes so criadas dentro do TableAdapter Query Configuration Wizard. Para obter mais informaes, consulte Como: Criar Consultas TableAdapter:. Objetos de conexo so criados quando voc arrasta itens da janela Data Sources para o Windows Forms Designer ou para o Component Designer. Para obter mais informaes, consulte Exibir dados em formulrios em aplicativos do Windows.

Adio de novas conexes Conexes de dados no Server Explorer/Database Explorer de dados para oServer aparecem na lista de conexes disponveis dentro dos assistentes Explorer / Database Explorer. de dados. Para obter mais informaes, consulte Como: adicionar novas conexes de dados no Server Explorer/Database Explorer. Seqncias de Caracteres de Conexo Todos os objetos de conexo expoem aproximadamente os mesmos participantes. Entretanto, os membros especficos disponveis em um determinado objeto OleDbConnection dependem de qual fonte de dados ele est conectado a; nem todas as fontes de dados suportam todos os membros da classe OleDbConnection. A propriedade Primria associada a um objeto de conexo a propriedadeConnectionString. Esta propriedade consiste em uma seqncia de caracteres com pares de informaes de atributo / valor necessrios para fazer logon em um servidor de banco de dados e apontam para um banco de dados especfico. Uma propriedade ConnectionStringtpica pode parecer com o seguinte:
Provider=SQLOLEDB.1;Data Source=MySQLServer;Initial Catalog=NORTHWIND;Integrated Security=SSPI

Essa seqncia de caracteres de conexo particular especifica que a conexo deve usar a segurana integrada do Windows. Em vez disso uma seqncia de caracteres de conexo pode incluir um nome de usurio e senha, mas isso no recomendvel, pois esses atributos depois sero compilados em seu aplicativo representando portanto uma possvel violao de segurana. Observao de segurana O armazenamento de detalhes em seqncias de caracteres de conexo (como uma senha) podem afetar a segurana do seu aplicativo. Utilizar a segurana integrada do Windows uma maneira mais segura para controlar o acesso a um banco de dados. Para obter mais informaes, consulte Securing Connection Strings. Os pares de atributo / valor mais comuns usados pelo OLE DB tambm so representados separadamente por uma propriedade individual, como DataSourcee Database. Ao trabalhar com um objeto de conexo, voc pode definir a propriedade ConnectionString como uma nica seqncia de caracteres, ou voc pode definir propriedades de conexo individuais. (Se sua fonte de dados exigir valores seqncia de caracteres de conexo que no so representados por propriedades individuais, ento voc deve definir a propriedade ConnectionString.)

Visual C# Consolidado

905

Salvando e Recuperando Seqncias de Caracteres de Conexo


Seqncias de caracteres de conexo podem ser armazenados dentro de seu aplicativo compilado ou no arquivo de configurao do aplicativo. Para obter mais informaes, consulte Como: salvar uma sequncia de conexo. Abrindo e Fechando Conexes Os dois mtodos primrios para conexes so Open e Close. O mtodoOpen usa as informaes da propriedade ConnectionString para entrar em contato com a fonte de dados e estabelecer uma conexo aberta. O mtodo Closedesliga a conexo. Fechar conexes essencial, pois a maioria das fontes de dados oferecem suporte somente um nmero limitado de conexes abertas, e conexes abertas ocupam valiosos recursos do sistema. Se voc estiver trabalhando com Adaptadores de Tabela, DataAdapter s, ou DataCommands, no necessrio abrir e fechar explicitamente uma conexo. Quando voc chamar um mtodo desses objetos (por exemplo, um mtodo Fill ou Update de um adaptador), o mtodo verifica se a conexo j est aberta. Caso contrrio, o adaptador abre a conexo, executa sua lgica, e fecha a conexo novamente. Mtodos, como Fill apenas abrem e fecham a conexo automaticamente se ela j no estiver aberta. Se a conexo estiver aberta, os mtodos as usam mas no as fecham. Isso lhe oferece a flexibilidade de voc mesmo abrir e fechar dados de comandos . Voc pode fazer isso se voc tiver vrios adaptadores que compartilham uma conexo. Neste caso, ineficiente que cada adaptador abra e feche a conexo quando voc chamar o mtodoFill . Em vez disso, voc pode abrir a conexo, chamar o mtodo Fillde cada adaptador, e fechar a conexo quando tiver terminado. Pooling em Conexes Aplicativos freqentemente tm diferentes usurios executando o mesmo tipo de acesso a banco de dados. Por exemplo, muitos usurios podem estar consultando um mesmo banco de dados para obter os mesmos dados. Nesses casos, o desempenho do aplicativo pode ser aprimorado atravs da realizao de compartilhamento, ou pool, de conexes com a fonte de dados. A sobrecarga refererente ao fato de cada usurio abrir e fechar uma conexo separada pode, caso contrrio, ter um efeito adverso no desempenho de aplicativos. Se voc estiver usando uma classe OleDbConnection, OdbcConnection, ou OracleConnection, pooling de conexes so tratados automaticamente pelo provedor, portanto voc no precisa para gerenci-las voc mesmo. Se voc estiver usando a classe SqlConnection , o pooling de conexes gerenciado implicitamente mas tambm fornece opes que permitem que voc gerencie o pooling voc mesmo. Para obter mais informaes, consulte Using Connection Pooling. Transaes Objetos de conexo suportam transaes com um mtodoBeginTransaction que cria um objeto de transao (por exemplo, um objeto SqlTransaction). O objeto transao sucessivamente suporta mtodos que permitem que voc confirme ou reverta as transaes. Transaes so gerenciados no cdigo. Para obter mais informaes, consulte Performing Transactions. O .NET Framework verso 2.0 inclui uma nova estrutura de transao acessvel pelo namespace System.Transactions. Esta estrutura expe transaes de uma forma totalmente integrada com o

Visual C# Consolidado

906

.NET Framework, incluindo ADO.NET. Para obter mais informaes, consulte Leveraging System.Transactions. Informaes e Segurana de Conexes Uma vez que abrir uma conexo envolve obter acesso a um recurso importante um banco de dados existem freqentemente questes de segurana envolvendo a configurao e o trabalho com uma conexo. Como voc protege o aplicativo e o seu acesso a fonte de dados depende da arquitetura do seu sistema. Em um aplicativo baseado na Web, por exemplo, os usurios geralmente obtm acessos annimos ao Servios de Informaes da Internet (IIS) e, portanto, no fornecem credenciais de segurana. Nesse caso, seu aplicativo mantm a seu prprio informao de logon e a utiliza (em vez de qualquer informao de usurio especfica) para abrir a conexo e acessar o banco de dados. Observao de segurana Armazenando detalhes de seqncias de caracteres de conexo (como uma senha) podem afetar a segurana do seu aplicativo. Usando segurana integrada do Windows uma maneira mais segura para controlar o acesso a um banco de dados. Para obter mais informaes, consulte Securing Connection Strings. Na intranet ou em aplicativos de vrias camadas, voc pode se aproveitar da opo de segurana integrada fornecida pelo Windows, pelo IIS, e pelo SQL Server. Neste modelo, credenciais de autenticao de um usurio para a rede local tambm so usadas para acessar recursos de banco de dados, e no so usados explicitamente nomes de usurio ou senhas na seqncia de caracteres de conexo. (Normalmente, as permisses so estabelecidas no computador servidor do banco de dados por meio de grupos, para que voc no precise estabelecer permisses individuais para cada usurio que pode acessar o banco de dados.) Neste modelo, voc no precisar armazenar, de modo algum, informaes de logon para a conexo, e no h etapas adicionais necessrias para proteger as informaes da seqncia de caracteres de conexo. Para obter mais informaes sobre segurana, consulte as seguintes pginas:

Securing ADO.NET Applications More Secure File and Data Access in Windows Forms

Conexes em Tempo de Design no Server Explorer / Database Explorer O Server Explorer/Database Explorerfornece uma maneira para voc para criar conexes em tempo de design para fontes de dados. Isto lhe permite pesquisar em fontes de dados disponveis; visualizar informaes sobre as tabelas, colunas, e outros elementos que elas contm; e editar e criar elementos do banco de dados. O seu aplicativo no usa diretamente as conexes disponveis no Server Explorer/Database Explorer. Essas conexes so usados pelo Visual Studio para trabalhar com seu banco de dados no tempo de design. Para obter mais informaes, consulte Visual Database Tools. Por exemplo, no tempo de design voc pode usar oServer Explorer/Database Explorer para criar uma conexo com um banco de dados. Mais tarde, quando estiver criando um formulrio, voc pode procurar o banco de dados, selecionar colunas de uma tabela, e arrast-las para o DataSet Designer. Isso cria um TableAdapter no seu DataSet. Um novo objeto de conexo tambm criado(que faz parte do TableAdapter recm-criado).

Visual C# Consolidado

907

Informaes sobre conexes em tempo de design so armazenadas em seu computador local independentemente de um projeto ou soluo especficos. Portanto, uma vez que voc tenha estabelecido uma conexo em tempo de design ao trabalhar em um aplicativo, ela aparece no Server Explorer/Database Explorer sempre que voc trabalhar no Visual Studio (a medida em que o o servidor para o qual a conexo aponta estiver disponvel). Para obter mais informaes sobre como usar oServer Explorer/Database Explorer e criar conexes em tempo de design, consulte Como: adicionar novas conexes de dados no Server Explorer/Database Explorer.

Passo a passo: Conectando-se a dados em um banco de dados


A conexo de seu aplicativo a dados no Visual Studio simplificada, usando o Assistente para Configurao da Fonte de Dados. Depois que voc conclui o assistente, os dados esto disponveis na Janela de fontes de dados para serem arrastados para seus formulrios. Observao As caixas de dilogo e comandos de menu que voc vir podem diferir daquelas descritas na Ajuda, dependendo das suas configuraes ativas ou da sua edio. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Visual Studio Settings. As tarefas ilustradas nesta explicao passo a passo incluem:

A criao um novo projeto Windows Application. A criao e configurao de um dataset em seu aplicativo baseadas em objetos de banco de dados usando o Data Source Configuration Wizard. Pr-requisitos

Para seguir esta explicao passo a passo, voc precisa de:

Acesso ao banco de dados de exemplo Northwind. Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Criando o Projeto

Para criar o novo projeto


1. 2. No menu File, crie um novo projeto. Selecione Windows Application e clique em OK. Para obter mais informaes, consulte Creating Windows-based Applications. O projeto criado e adicionado ao Solution Explorer. Conectando-se ao Banco de Dados Northwind Voc pode se conectar verso SQL Server do banco de dados Northwind ou verso Microsot Access do banco de dados. Cada processo est descrito em seguida nos dois procedimentos a seguir.

Para criar uma conexo para a verso SQL Server do Northwind


1. 2. No menu Data, clique em Show Data Sources. Na janela Data Sources, selecione Add New Data Source.

Visual C# Consolidado

908

3. 4. 5.
o

Clique em Next na pgina bem-vindo Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type. Na pgina Choose your Data Connection, siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind estiver disponvel na lista suspensa, selecione-a. -ouSelecione New Connection para configurar uma nova conexo de dados. Para obter mais informaes, consulte Como: Criar Conexes com Bancos de Dados do Access, ou Como: Criar conexes com bancos de dados SQL Server. Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais (include sensitive data), e clique em Next. Clique em Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione as tabelas Customers e Orders, e clique em Finish. O NorthwindDataSet adicionado ao seu projeto e as tabelas Customers e Orders aparecem na janela Data Sources.

6. 7. 8. 9.

Para criar uma conexo para a verso Access do Northwind


1. Na caixa de dilogo Choose Data Source, selecione Microsoft Access Database File, e clique em OK. Se a caixa de dilogo Add Connection abrir, e o Data source no for Microsoft Access Database File, clique em Change para abrir a caixa de dilogo Choose/Change Data Source. Para obter mais informaes, consulte Choose/Change Data Source Dialog Box. 2. Digite o caminho para o arquivo de banco de dados Northwind.mdb, ou clique no boto Browse para localizar o arquivo de banco de dados Northwind.mdb. Para obter mais informaes, consulte Add/Modify Connection (Microsoft Access). Clique em OK. Clique em Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione as tabelas Customers e Orders, e clique em Finish. O NorthwindDataSet adicionado ao seu projeto e as tabelas Customers e Orders aparecem na janela Data Sources. Adicionando Controles ao Formulrio Voc pode criar controles ligados a dados, arrastando itens da janela Data Sources para seu formulrio.

3. 4. 5. 6. 7.

Para criar controles ligados a dados no formulrio

Arraste o n principal Customers da janela Data Sources para o formulrio. Controles ligados a dados com rtulos descritivos aparecem no formulrio, juntamente com uma faixa de ferramentas (BindingNavigator) para registros de navegao. Um NorthwindDataSet, CustomersTableAdapter, BindingSource, e BindingNavigator aparecem na bandeja de componentes. Executando o aplicativo

Visual C# Consolidado

909

Para executar o aplicativo

Pressione F5. Form1 aberto, mostrando os dados da tabela Customers. Segurana

Armazenar detalhes da seqncia de conexo (como uma senha) podem afetar a segurana do seu aplicativo. Usar a Autenticao do Windows uma maneira mais segura de controlar o acesso a um banco de dados. Para obter mais informaes, consulte Securing Connection Strings. Prximas etapas O DataSet que voc acabou de criar agora est disponvel na janela Data Sources.

Para adicionar funcionalidade a seu aplicativo


Selecione outros itens na janela Data Sources e arraste-os para um formulrio. Para obter mais informaes, consulte Viso Geral da Exibio dados. Abra a fonte de dados noDataset Designer para adicionar ou editar os objetos que formam o dataset. Adicione lgica de validao para o evento ColumnChanging ou RowChanging das tabelas de dados no dataset. Para obter mais informaes, consulte Viso geral sobre validao de dados.

Passo a passo: Conectando-se a dados em um Web Service


Conectar seu aplicativo a dados no Visual Studio fica mais simples, usando o Assistente para Configurao da Fonte de Dados. Depois que voc concluir o assistente, os dados estaro disponveis no Janela de fontes de dados para serem arrastados para Windows Forms. As tarefas ilustradas nesta explicao passo a passo incluem:

A criao um novo projeto Windows Application. A criao e configurao de um dataset em seu aplicativo com base em objetos retornados pelo servio da Web. Pr-requisitos

Para seguir esta explicao passo a passo, voc precisa:

Acesso ao servio da Web Google (http://api.google.com/GoogleSearch.wsdl) Criando o Projeto

Para criar o novo projeto


1. 2. No menu File, crie um novo projeto. Selecione Windows Application e clique em OK. Para obter mais informaes, consulte Creating Windows-based Applications. O projeto criado e adicionado ao Solution Explorer. Criando o Dataset

Visual C# Consolidado

910

O dataset criado atravs da execuo do Data Source Configuration Wizard.

Para criar o dataset


1. 2. 3. 4. 5. 6. 7. No menu Data, clique em Show Data Sources. Na janela Data Sources, selecione Add New Data Source. Clique em Next na pgina bem-vindo Data Source Configuration Wizard. Selecione Web Service na pgina Choose a Data Source Type. Digite http://api.google.com/GoogleSearch.wsdl na caixa URL da caixa de dilogo Add Web Reference. Clique em Go. Aps o servio da Web ser encontrado, clique em Add Reference para adicionar uma referncia ao seu projeto. Para obter mais informaes, consulte Add Web Reference Dialog Box. Clique em Finish. A referncia da Web adicionado ao Solution Explorer. Prximas etapas O DataSet que voc acabou de criar agora est disponvel na janela Data Sources. Observao Os itens que aparecem na janela Data Sources so dependentes das informaes que o servio da Web retorna. Alguns servios da Web podem no fornecer informaes suficientes para o Data Source Configuration Wizard criar objetos ligveis. Por exemplo, se o servio da Web retornar um dataset no digitado, nenhum item aparecer na janela Data Sources aps a concluso do assistente. Isso ocorre porque datasets no digitados no fornecem esquema, ento o assistente no tem informaes suficientes para criar a fonte de dados.

8. 9.

Para adicionar funcionalidade a seu aplicativo

Selecione itens na janela Data Sources e arraste-os para um formulrio. Para obter mais informaes, consulte Viso Geral da Exibio dados.

Passo a passo: Conectando-se a dados em um banco de dados do Access


A conexo de seu aplicativo do Visual Studio a dados em um banco de dados do Access simplificada com o Assistente para Configurao da Fonte de Dados. Depois que voc concluir o assistente, dados ficam disponveis no Janela de fontes de dados para arrastar para seus formulrios. Para obter mais informaes, consulte Viso Geral de Dados Local. Ao conectar-se a dados em arquivos de dados locais importante compreender como o sistema do projeto no Visual Studio gerencia esses arquivos. Para obter mais informaes, consulte How to: Manage Local Data Files in Your Project. Observao As caixas de dilogo e comandos de menu que voc v podem diferir dos descritos na Ajuda (Help), dependendo de suas configuraes ativas ou edio. Para alterar as configuraes,

Visual C# Consolidado

911

escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Visual Studio Settings. As tarefas ilustradas nesta explicao passo-a-passo incluem:

Criando um novo projeto Windows Application. Criando e configurando um dataset em seu aplicativo baseado nas tabelas Customers e Orders, no banco de dados Northwind usando o Data Source Configuration Wizard. Pr-requisitos

Para concluir esta explicao passo-a-passo, voc precisa:

Acesso ao exemplo Northwind (Northwind.mdb), um arquivo Access de banco de dados. Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Criando o Projeto

Para criar o novo projeto Windows Application


1. 2. No menu File, crie um novo projeto. Selecione Windows Application e clique em OK. Para obter mais informaes, consulte Creating Windows-based Applications. O projeto criado e adicionado ao Solution Explorer. Criando o Dataset Voc cria o dataset executando o Data Source Configuration Wizard.

Para criar o dataset


1. 2. 3. 4. No menu Data, clique em Show Data Sources. Na janela Data Sources, clique em Add New Data Source. Selecione Database na pgina Choose a Data Source Type. Na pgina Choose your Data Connection, selecione New Connection para configurar uma nova conexo de dados. Observao Se o Data source no for Microsoft Access Database File, ento selecione Change para abrir a caixa de dilogo Choose/Change Data Source. 5. 6. Na caixa de dilogo Choose Data Source, selecione Microsoft Access Database File. Digite o caminho para o arquivo de banco de dados Northwind.mdb, ou clique no boto Browse para localizar o arquivo Northwind.mdb. Para obter informaes sobre como adquirir uma cpia do arquivo Northwind.mdb, consulte COMO: Instalar Bancos de Dados de Exemplo. Clique em OK. Clique em Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects.

7. 8. 9.

Visual C# Consolidado

912

10. Selecione as tabelas Customers e Orders, e clique em Finish. O NorthwindDataSet adicionado ao seu projeto e as tabelas Customers e Orders aparecem na janela Data Sources. Segurana Armazenar informaes confidenciais (como uma senha) pode afetar a segurana do seu aplicativo. Usar a Windows Authentication (tambm conhecida como segurana integrada) uma maneira mais segura para controlar o acesso a um banco de dados. Para obter mais informaes, consulte Securing Connection Strings. Prximas etapas O dataset que voc acabou de criar agora est disponvel na janela Data Sources.

Para adicionar funcionalidade a seu aplicativo


Selecione itens na janela Data Sources e arraste-os para seu formulrio. Para obter mais informaes, consulte Viso Geral da Exibio dados. Abra a fonte de dados no Dataset Designer para adicionar ou editar os objetos que formam o dataset. Adicione lgica de validao para os eventos ColumnChanging ou RowChanging das tabelas de dados no dataset. Para obter mais informaes, consulte Viso geral sobre validao de dados.

COMO: Criar um DataSet Digitado


Cria-se um DataSet tipado usando o Data Source Configuration Wizard ou o Dataset Designer. Observao Para informaes sobre como criar DataSets programaticamente, consulte Creating a DataSet. Criando DataSets tipados com o Data Source Configuration Wizard ou com o DataSet Designer

Para criar um DataSet com o Data Source Configuration Wizard


1. 2. 3. No menu Data, clique Add New Data Source para iniciar o Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type. Conclua o assistente e um DataSet tipado adicionado ao seu projeto. Para obter mais informaes, consulte Assistente para Configurao da Fonte de Dados.

Para criar um DataSet com o DataSet Designer


1. 2. 3. 4. No menu Project, clique em Add New Item. Selecione DataSet na caixa de dilogo Add New Item. Digite um nome para o DataSet. Clique em Add. O DataSet adicionado ao projeto e abre no Dataset Designer.

Visual C# Consolidado

913

5.

Arraste itens da guia DataSet da Toolbox no designer. Para obter mais informaes, consulte Como editar um DataSet:. -ouArraste itens de uma conexo ativa em Server Explorer / Database Explorer para o Dataset Designer.

Passo a passo: Criando um DataSet com o DataSet Designer


Nesta explicao passo a passo voc criar uma DataSet usando o Dataset Designer. Ela levar voc atravs do processo de criar um novo projeto e adicionar um novo item DataSet a ele. Voc aprender como criar tabelas com base em tabelas em um banco de dados sem utilizar um assistente. As tarefas ilustradas nesta explicao passo a passo incluem:

Criar um novo projeto Windows Application. Adicionar um item DataSet vazio para o projeto. Criar e configurar uma fonte de dados em seu aplicativo, criando um dataset com o Dataset Designer. Criar uma conexo para o banco de dados Northwind no Server Explorer. Criar tabelas com TableAdapters no dataset baseadas em tabelas no banco de dados. Observao

As caixas de dilogo e comandos de menu que voc v podem diferir dos descritos na Ajuda (Help) dependendo de suas configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Visual Studio Settings. Pr-requisitos Para concluir esta explicao passo a passo, voc precisa:

Acesso ao banco de dados de exemplo Northwind (verso do SQL Server ou do Access). Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Criando um Novo Projeto Windows Application

Para criar um novo projeto Windows Application


1. 2. 3. 4. No menu File, crie um novo projeto. Escolha uma linguagem de programao no painel Project Types. Clique em Windows Application no painel Templates. Nomeie o projeto como DatasetDesignerWalkthrough, e clique OK. O Visual Studio adicionar o projeto ao Solution Explorer e exibir um novo formulrio no designer. Adicionando Um Novo Dataset ao Aplicativo

Para adicionar um novo item dataset ao projeto Visual C# Consolidado 914

1. 2. 3.

No menu Project, clique em Add New Item. A caixa de dilogo Add New Item aparece. Na caixa Templates da caixa de dilogo Add New Item, clique em DataSet. Nomeie o dataset como NorthwindDataset, e clique Add. O Visual Studio adicionar um arquivo chamado NorthwindDataset.xsd ao projeto e ir abri-lo no Dataset Designer. Criando uma Conexo de Dados no Server Explorer

Para criar uma conexo para o banco de dados Northwind


1. 2. 3. No menu View, clique em Server Explorer. No Server Explorer, clique no boto Connect to Database. Crie uma conexo com o banco de dados de exemplo Northwind. Observao Para esta explicao passo a passo, voc pode conectar-se ao Northwind na verso do SQL Server ou do Access. 4. 5. Para informaes sobre como criar uma conexo com o SQL Server, consulte Como: Criar conexes com bancos de dados SQL Server. Para informaes sobre como criar uma conexo com Access, consulte Como: Criar Conexes com Bancos de Dados do Access. Criando Tabelas no Dataset Esta seo explicar como adicionar tabelas ao dataset.

Para criar a tabela Customers


1. 2. Expanda a conexo de dados que voc criou no Server Explorer, e em seguida, expanda o n Tables. Arraste a tabela Customers do Server Explorer para o Dataset Designer. Uma tabela de dados Customers e CustomersTableAdapter so adicionadas ao dataset.

Para criar a tabela Orders

Arraste a tabela Orders do Server Explorer para o Dataset Designer. Uma tabela de dados Orders, OrdersTableAdapter, e a relao de dados entre as tabelas Customers e Orders so adicionadas ao dataset.

Para criar a tabela OrderDetails

Arraste a tabela Order Details do Server Explorer para o Dataset Designer. Uma tabela de dados Order Details, Order DetailsTableAdapter, e a relao de dados entre as tabelas Orders e Order Details so adicionadas ao dataset. Prximas etapas

Para adicionar funcionalidade a seu aplicativo Visual C# Consolidado 915

O dataset que voc acabou de criar agora est disponvel na janela Data Sources. Voc pode selecionar itens na janela Data Sources e arrast-los para um formulrio. Para obter mais informaes, consulte Viso Geral da Exibio dados. Adicione mais consultas aos TableAdapters. Para obter mais informaes, consulte Como: Criar Consultas TableAdapter:. Adicione lgica de validao para os eventos ColumnChanging ou RowChanging das tabelas de dados no dataset. Para obter mais informaes, consulte Viso geral sobre validao de dados.

Passo a passo: Criando uma tabela de dados no DataSet Designer


Esta explicao passo a passo explica como criar uma DataTable (sem um TableAdapter) usando o Dataset Designer. Para informaes sobre como criar tabelas de dados que incluem TableAdapters, consulte Como: Criar TableAdapters. As tarefas ilustradas nesta explicao passo a passo incluem:

Criar um novo projeto de Windows Application Adicionar um novo dataset ao aplicativo Adicionar uma nova tabela de dados para o dataset Adicionar colunas tabela de dados Definir a chave primria para a tabela Criando um novo aplicativo Windows

Para criar um novo projeto de Windows Application


1. 2. 3. 4. No menu File, crie um novo projeto. Escolha uma linguagem de programao no painel Project Types. Clique em Windows Application no painel Templates. Nomeie o projeto DataTableWalkthrough, e clique OK. O Visual Studio adiciona o projeto ao Solution Explorer e exibe o Form1 no designer. Adicionando um novo dataset ao aplicativo

Para adicionar um novo item dataset para o projeto


1. 2. 3. No menu Project, clique em Add New Item. A caixa de dilogo Add New Item Dialog Box aparece. Na caixa Templates, selecione DataSet. Clique em Add. O Visual Studio ir adicionar um arquivo chamado DataSet1.xsd ao projeto e o abrir no Dataset Designer. Adicionando um DataTable novo ao Dataset

Para adicionar uma nova tabela de dados ao dataset


1. Arraste uma DataTable da guia DataSet do Toolbox para o Dataset Designer Uma tabela denominada DataTable1 adicionada ao dataset.

Visual C# Consolidado

916

Observao Para criar uma tabela de dados que inclui um TableAdapter, consulte Explicao passo a passo: Criando um Adaptador de Tabela com Mltiplas Consultas. 2. Clique na barra de ttulo do DataTable1 e renomeie para Music. Adicionando colunas tabela de dados

Para adicionar colunas tabela de dados


1. 2. 3. 4. Clique com o boto direito do mouse na tabela Music. Aponte para Add, e clique Column. Nome da coluna SongID. Na janela Properties, defina a propriedade DataType como System.Int16. Repita este processo e adicione as seguintes colunas: SongTitle: System.String Artist: System.String Genre: System.String Definindo a chave primria para a tabela Todas as tabelas de dados devem ter uma chave primria. Uma chave primria identifica exclusivamente um registro especfico em uma tabela de dados.

Para definir a chave primria da tabela de dados

Clique com o boto direito do mouse na coluna SongID, e clique Set Primary Key. Um cone de chave aparece prxima coluna SongID. Salvando seu projeto

Para salvar o projeto DataTableWalkthrough

No menu File, clique em Save All. Prximas etapas

Agora que voc criou a tabela, voc pode desejar executar uma das seguintes aes: Para Criar um formulrio para entrada de dados Adicionar dados tabela Visualizar dados em uma tabela Editar dados Consulte Passo-a-passo: Exibindo dados em um formulrio em um aplicativo do Windows. Adding Data to a Table. Viewing Data in a Table. Editing Data in a Table

Visual C# Consolidado

917

Excluir uma linha de uma tabela

Deleting a Row from a Table

Passo a passo: Criando um relacionamento entre tabelas de dados


Esta explicao passo a passo explica como criar duas tabelas de dados sem TableAdapters usando o Dataset Designer e criando um relacionamento entre elas. Para informaes sobre como criar tabelas de dados que incluem TableAdapters, consulte Como: Criar TableAdapters. Para obter mais informaes sobre TableAdapters, consulte Viso Geral do Adaptador de Tabela. Esta explicao passo a passo inclui as seguintes tarefas ilustradas:

Criando um novo aplicativo do Windows Adicionando um novo dataset ao aplicativo Adicionando duas novas tabelas de dados ao dataset Adicionando colunas para as tabelas de dados Definindo a chave primria para as tabelas Criando um relacionamento entre as tabelas Observao

As caixas de dilogo e comandos de menu que voc v podem diferir dos descritos na Ajuda (Help) dependendo de suas configuraes ativas ou de sua edio. Para alterar suas configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Visual Studio Settings. Criando um novo aplicativo do Windows

Para criar um novo projeto do Aplicativo do Windows


1. 2. 3. No menu File, crie um novo projeto. Selecione uma linguagem de programao no painel Project Types e crie um Windows Application (Aplicativo do Windows). Nomeie o projeto como RelationshipWalkthrough e depois clique em OK. O Visual Studio ir adicionar o projeto ao Solution Explorer e exibir Form1 no Windows Forms Designer. Adicionando um novo dataset ao aplicativo

Para adicionar um novo item dataset ao projeto


1. 2. 3. Do menu Project, escolha Add New Item. A Add New Item Dialog Box aparece. Da rea Templates selecione DataSet. Clique em Add. O Visual Studio ir adicionar um arquivo chamado Dataset1.xsd ao projeto e abri-lo no Dataset Designer. Adicionando duas novas tabelas de dados ao dataset

Visual C# Consolidado

918

Para adicionar uma nova tabela de dados ao dataset


1. 2. 3. 4. Arraste um DataTable da guia DataSet da Toolbox para o Dataset Designer. Uma tabela denominada DataTable1 adicionada ao dataset. Clique na barra de ttulo de DataTable1 e renomei-a como Customers. Arraste um segundo DataTable da guia DataSet da Toolbox para o Dataset Designer. Uma tabela denominada DataTable1 adicionada ao dataset. Clique na barra de ttulo de DataTable1 e renomei-a como Orders. Adicionando colunas tabela de dados Customers

Para adicionar colunas tabela Customers


1. 2. 3. 4. 5. Clique com o boto direito do mouse na tabela Customers. Aponte para Add e depois clique em Column. Nomeie a coluna como CustomerID. Na janela Properties, defina a propriedade DataType como Int16. Repita este processo para adicionar as seguintes colunas: Coluna CompanyName Contact ContactTitle Propriedade DataType String String String

Adicionando colunas tabela de dados Orders

Para adicionar colunas tabela Orders


1. 2. 3. 4. 5. Clique com o boto direito do mouse na tabela Orders. Aponte para Add e depois clique em Column. Nomeie a coluna como OrderID. Na janela Properties, defina a propriedade DataType como Int16. Repita este processo para adicionar as seguintes colunas: Coluna CustomerID OrderDate ShippedDate Propriedade DataType Int16 DateTime DateTime

Definindo a chave primria para a tabela Customers

Visual C# Consolidado

919

A coluna de identificao exclusiva para a tabela Customers a coluna CustomerID.

Para definir a chave primria da tabela Customers


1. 2. Clique na tabela Customers para selecion-la. Clique com o boto direito do mouse na coluna CustomerID e depois clique em Set Primary Key no menu de atalho. Definindo a chave primria para a tabela Orders A coluna de identificao exclusiva para a tabela Orders a coluna OrderID.

Para definir a chave primria da tabela Orders


1. 2. Clique na tabela Orders para selecion-la. Clique com o boto direito do mouse na coluna OrderID e depois clique em Set Primary Key no menu de atalho. Criando o relacionamento entre as tabelas O relacionamento criado entre a coluna comum de cada tabela neste caso, a coluna CustomerID.

Para configurar um novo relacionamento entre as tabelas Customers e Orders


1. 2. 3. 4. 5. 6. 7. Arraste um objeto Relation da guia DataSet da Toolbox para a tabela Orders. A Caixa de dilogo Relation abre. Na caixa Parent Table, selecione Customers. Na caixa Child Table, selecione Orders. Na caixa Columns, designe Key Columns para CustomerID. Na caixa Columns, designe Foreign Key Columns para CustomerID. Clique em OK para criar o relacionamento; uma linha de relao aparece no designer entre as duas tabelas. No menu Data, escolha Show Relation Labels. Salvando seu projeto

Para salvar o projeto

No menu File, clique em Save All. Prximas etapas

Agora que voc criou as tabelas relacionadas, voc pode desejar executar uma das seguintes aes: Para Adicionar dados tabela Consulte Adding Data to a Table

Visual C# Consolidado

920

Visualizar dados em uma tabela Editar dados Excluir uma linha de uma tabela

Viewing Data in a Table Editing Data in a Table Deleting a Row from a Table

Viso Geral do Adaptador de Tabela


Os TableAdapters fornecem a comunicao entre o seu aplicativo e um banco de dados. Mais especificamente, um TableAdapter se conecta a um banco de dados, executa consultas ou procedimentos armazenados, e retorna uma nova tabela de dados preenchida com os dados retornados ou preenche uma DataTable existente com os dados retornados. TableAdapters tambm so usados para enviar dados atualizados do seu aplicativo de volta para o banco de dados. Usurios de verses anteriores do Visual Studio podem imaginar um TableAdapter como um DataAdapter com um objeto de conexo interno e a capacidade de conter vrias consultas. Cada consulta adicionada a um TableAdapter exposta como um mtodo pblico que simplesmente chamado como todos os outros mtodos ou funes em um objeto. Alm da funcionalidade padro de um DataAdapter, TableAdapters fornecem mtodos tipados adicionais que encapsulam consultas que compartilham um esquema comum com a DataTable tipada associada. Em outras palavras, voc pode ter tantas consultas quanto voc deseja em um TableAdapter, desde que elas retornem dados de acordo com o mesmo esquema. Na verso anterior do Visual Studio, Os Adaptadores de Dados do ADO.NET eram usados para comunicao entre um aplicativo e um banco de dados. Apesar de os adaptadores de dados ainda serem componentes principais do .NET Framework Data Providers, TableAdapters so componentes gerados pelo designer que melhoram a funcionalidade dos DataAdapters. TableAdapters normalmente contm mtodos Fill e Update para buscar e atualizar dados em um banco de dados. TableAdapters so criados com o Dataset Designer no interior de datasets fortemente tipados. Voc pode criar TableAdapters durante a criao de um novo dataset com o Assistente para Configurao da Fonte de Dados. Voc tambm pode criar TableAdapters em datasets existentes com o Assistente de Configurao para o TableAdapter ou arrastando objetos de banco de dados do Server Explorer para o Dataset Designer. Para obter mais informaes, consulte Como: Criar TableAdapters. Apesar de os TableAdapters serem criados com o Dataset Designer, as classes geradas do TableAdapter no so classes aninhadas do DataSet. Elas esto localizadas em um namespace separado especfico para cada dataset. Por exemplo, se voc tiver um dataset nomeado NorthwindDataSet, os TableAdapters associados s DataTables no NorthwindDataSet estariam no namespace NorthwindDataSetTableAdapters. Para acessar um determinado TableAdapter por cdigo, voc deve declarar uma nova instncia do TableAdapter. Por exemplo: C#
NorthwindDataSet northwindDataSet = new NorthwindDataSet(); NorthwindDataSetTableAdapters.CustomersTableAdapter customersTableAdapter = new NorthwindDataSetTableAdapters.CustomersTableAdapter(); customersTableAdapter.Fill(northwindDataSet.Customers);

Visual C# Consolidado

921

Esquema associado a DataTable Ao criar um TableAdapter, a consulta inicial ou o procedimento armazenado usado para definir o esquema da DataTable associada ao TableAdapter. Voc executa essa consulta inicial ou procedimento armazenado chamando o mtodo principal Fill do TableAdapter (que preenche a DataTable associada ao TableAdapter). Quaisquer alteraes feitas consulta principal do TableAdapter so refletidas no esquema da tabela de dados associada. Por exemplo, remover uma coluna da consulta principal remove a coluna da tabela de dados associada. Se quaisquer consultas adicionais do TableAdapter usarem instrues SQL retornando colunas que no esto na consulta principal, ento o designer tentar sincronizar as alteraes de coluna da consulta principal e quaisquer consultas adicionais. Para obter mais informaes, consulte Como editar TableAdapters:. Comandos UPDATE do TableAdapter A funcionalidade de atualizao de um TableAdapter depende de quanta informao est disponvel com base na consulta principal fornecida no TableAdapter Wizard. Por exemplo, TableAdapters que estejam configurados para buscar valores de vrias tabelas (JOINs), valores escalares, ou de resultados de funes agregadas, no so criados inicialmente com a capacidade de enviar atualizaes de volta para o banco de dados subjacente. Entretanto, voc pode configurar os comandos INSERT, UPDATE e DELETE manualmente na janela Properties. Consultas do TableAdapter

Diferentemente dos adaptadores de dados padro, os TableAdapters podem conter consultas mltiplas para preencher suas tabelas de dados associadas. Voc pode definir tantas consultas para um TableAdapter quanto seu aplicativo precisar, desde que cada consulta retorne os dados de acordo com o mesmo esquema da sua tabela de dados associada. Isso permite o carregamento de dados que satisfaam critrios diferentes. Por exemplo, se seu aplicativo

Visual C# Consolidado

922

contiver uma tabela de clientes, voc pode criar uma consulta que preenche a tabela com cada cliente cujo nome comea com uma certa letra, e outra consulta que preenche a tabela com todos os clientes localizados no mesmo estado. Para preencher uma tabela Customers com clientes em um estado determinado voc pode criar uma consulta FillByState que leva um parmetro para o valor de estado: SELECT * FROM Customers WHERE State = @State. Voc executa a consulta chamando o mtodo FillByState e passando o valor do parmetro como este: CustomerTableAdapter.FillByState("WA"). Para obter mais informaes, consulte Como: Criar Consultas TableAdapter:. Alm das consultas que retornam dados no mesmo esquema da tabela de dados do TableAdapter, voc pode adicionar consultas que retornam valores escalares. Por exemplo, criar uma consulta que retorna uma contagem de clientes de um CustomersTableAdapter. (SELECT Count(*) From Customers) vlido, apesar de os dados retornados no estarem de acordo com esquema da tabela. Propriedade ClearBeforeFill O TableAdapter adiciona uma propriedade no disponvel na classe base DataAdapter. Por padro, sempre que voc executar uma consulta para preencher uma tabela de dados do TableAdapter, os dados sero limpos e somente os resultados da consulta so carregados na tabela. Defina a propriedade ClearBeforeFill do TableAdapter como false se voc deseja adicionar ou mesclar os dados retornados de uma consulta com os dados existentes na tabela de dados. Independentemente de voc limpar os dados, voc precisar explicitamente enviar as atualizaes de volta ao banco de dados, se desejar. Portanto lembre-se de salvar quaisquer alteraes feitas nos dados da tabela antes de executar outra consulta que preencha a tabela. Para obter mais informaes, consulte Como: atualizar dados usando um TableAdapter. Herana do TableAdapter Os TableAdapters estendem a funcionalidade dos adaptadores padro de dados, encapsulando um DataAdapter configurado. Por padro, o TableAdapter herda de Component e no pode ser convertido (casting) para a classe DataAdapter. Converter um TableAdapter para um DataAdapter resulta em uma InvalidCastException. Para alterar a classe base de um TableAdapter, voc pode digitar uma classe que deriva do Component na propriedade Base Class do TableAdapter no Dataset Designer. Mtodos e propriedades do TableAdapter A classe TableAdapter no parte do .NET Framework, assim voc no pode pesquisar ele na documentao ou no Object Browser. Ele criado no tempo de design quando voc usa um dos assistentes mencionados acima. O nome atribudo a um TableAdapter quando voc o cria baseado no nome da tabela com a qual voc estiver trabalhando. Por exemplo, ao criar um TableAdapter baseado em uma tabela de um banco de dados chamada Orders, o TableAdapter seria nomeado OrdersTableAdapter. O nome de classe do TableAdapter pode ser alterado usando a propriedade Name no Dataset Designer. Estes so os mtodos e propriedades mais usados de TableAdapters: Membro
TableAdapter.Fill

Descrio Preenche a tabela de dados associada ao TableAdapter com os resultados do comando SELECT. Para obter mais informaes, consulte Como: preencher uma DataSet com dados.

Visual C# Consolidado

923

TableAdapter.Update

Envia alteraes de volta ao banco de dados. Para obter mais informaes, consulte Como: atualizar dados usando um TableAdapter. Retorna uma nova DataTable preenchida com dados. Cria uma nova linha na tabela de dados. Para obter mais informaes, consulte Como adicionar linhas ao um DataTable.

TableAdapter.GetData TableAdapter.Insert

TableAdapter.ClearBeforeFill Determina se uma tabela de dados esvaziada antes de chamar um dos mtodos Fill.

Mtodo Update do TableAdapter Os TableAdapters usam comandos de dados para leitura e gravao no banco de dados. A consulta Fill inicial do TableAdapter usada como base para criar o esquema da tabela de dados associada, bem como os comandos InsertCommand, UpdateCommand, e DeleteCommand associados ao mtodo TableAdapter.Update. Isso significa que chamar um mtodo Update de um TableAdapter executa as instrues criadas quando o TableAdapter foi originalmente configurado, e no uma das consultas adicionais adicionadas com o TableAdapter Query Configuration Wizard. Quando voc usar um TableAdapter, ele efetivamente executa as mesmas operaes com os comandos que voc geralmente deseja executar. Por exemplo, quando voc chamar o mtodo Fill do adaptador, o adaptador executa o comando de dados na sua propriedade SelectCommand e usa uma leitora de dados (por exemplo, SqlDataReader) para carregar o resultado na tabela de dados. Da mesma forma, quando voc chamar o mtodo Update do adaptador, ele executa o comando apropriado (nas propriedades DeleteCommand, UpdateCommand, e InsertCommand) para cada mudana na tabela de dados. Observao Se no houver informaes suficientes na consulta principal, os comandos InsertCommand, UpdateCommand, e DeleteCommand so criados por padro quando o TableAdapter gerado. Se a consulta principal do TableAdapter uma declarao SELECT de mais de uma tabela , possvel que o designer no consiga gerar os comandos InsertCommand, UpdateCommand, e DeleteCommand. Se esses comandos no so gerados, voc poder receber um erro ao executar o mtodo TableAdapter.Update. GenerateDbDirectMethods do TableAdapter Alm dos comandos InsertCommand, UpdateCommand, e DeleteCommand, TableAdapters so criados com mtodos que podem ser executados diretamente no banco de dados. Estes mtodos (TableAdapter.Insert, TableAdapter.Update, e TableAdapter.Delete) podem ser chamados diretamente para manipular dados no banco de dados. Se voc no deseja criar esses mtodos diretos, defina a propriedade GenerateDbDirectMethods do TableAdapter como false (na janela Properties). Consultas adicionais do TableAdapter so consultas autnomas que no geram esses mtodos. Suporte do TableAdapter para tipos Nullable

Visual C# Consolidado

924

Os TableAdapters oferecem suporte a tipos anulveis Nullable(Of T) e T?. Para obter mais informaes sobre tipos nullable no Visual Basic, consulte Value Types that Might Not Have a Defined Value. Para obter mais informaes sobre tipos anulveis em C#, consulte Usando Nullable tipos (C# programao guia).

Explicao passo a passo: Criando um Adaptador de Tabela com Mltiplas Consultas


Neste explicao passo a passo, voc criar um TableAdapter em um DataSet usando o Assistente para Configurao da Fonte de Dados. A explicao passo a passo leva voc atravs do processo de criar uma segunda consulta no TableAdapter usando o Assistente de configurao da consulta TableAdapter juntamente com o Dataset Designer. Tarefas ilustradas nesta explicao passo a passo incluem:

Criando um novo projeto Windows Application. Criando e configurando uma fonte de dados em seu aplicativo, criando um DataSet com o Data Source Configuration Wizard. Abrindo o novo DataSet no Dataset Designer. Adicionando consultas ao TableAdapter com o TableAdapter Query Configuration Wizard. Pr-requisitos

Para concluir esta explicao passo a passo, voc precisa:

Acesso ao banco de dados de exemplos Northwind (verso do SQL Server ou do Access). Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Criando um novo aplicativo Windows

A primeira etapa consiste em criar um aplicativo do Windows.

Para criar um novo projeto de Aplicativo do Windows


1. 2. 3. 4. No Visual Studio, no menu File, crie um novo projeto. Escolha uma linguagem de programao no painel Project Types. Clique em Windows Application no painel Templates. Nomeie o projeto TableAdapterQueriesWalkthrough, e clique OK. O Visual Studio adiciona o projeto ao Solution Explorer e exibe um novo formulrio no designer. Criar uma fonte de dados de banco de dados com um TableAdapter Essa etapa cria uma fonte de dados usando o Data Source Configuration Wizard baseado na tabela Customers no banco de dados de exemplos Northwind. Voc deve ter acesso ao banco de dados de exemplos Northwind para criar a conexo. Para informaes sobre como configurar dados de exemplo Northwind, consulte COMO: Instalar Bancos de Dados de Exemplo.

Para criar a fonte de dados


1. 2. No menu Data, clique em Show Data Sources. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source Configuration Wizard.

Visual C# Consolidado

925

3. 4.
o

Selecione Database na pgina Choose a Data Source Type, e clique Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind est disponvel na lista drop-down, selecione-o. -ouSelecione New Connection para abrir a caixa Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais, e clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione a tabela Customers, e clique Finish. A NorthwindDataSet adicionada ao seu projeto e a tabela Customers aparece na janela Data Sources. Abrindo o DataSet no Dataset Designer

5. 6. 7. 8.

Para abrir o DataSet no Dataset Designer


1. 2. Clique com o boto direito do mouse NorthwindDataset na janela Data Sources. No menu de atalho, escolha Edit DataSet with Designer. O NorthwindDataset abre no Dataset Designer. Adicionando uma segunda consulta ao CustomersTableAdapter O assistente criou o DataSet com uma tabela de dados Customers e CustomersTableAdapter. Essa seo da explicao passo a passo adiciona uma segunda consulta para o CustomersTableAdapter.

Para adicionar uma consulta para o CustomersTableAdapter


1. 2. 3. 4. Arraste um Query da guia DataSet da tabela Toolbox para a tabela Customers. O Assistente de configurao da consulta TableAdapter abre. Selecione Use SQL statements, e clique Next. Selecione SELECT which returns rows, e clique Next. Adicione uma clusula WHERE consulta para que ela seja lida:
SELECT CustomerID, CompanyName, ContactName, ContactTitle, Address, City, Region, PostalCode, Country, Phone, Fax FROM Customers WHERE City = @City

Observao Se voc estiver usando a verso Access do Northwind, substitua o parmetro @City com um ponto de interrogao. (SELECT CustomerID, CompanyName, ContactName, ContactTitle, Address, City, Region, PostalCode, Country, Phone, Fax FROM Customers WHERE City = ?) 5. Na pgina Choose Methods to Generate, nomeie o mtodo Fill a DataTable FillByCity.

Visual C# Consolidado

926

Observao O mtodo Return a DataTable no usado neste explicao passo a passo, ento voc possa desmarcar a caixa de seleo ou deixar o nome padro. 6. Clique em Next e conclua o assistente. A consulta FillByCity adicionada ao CustomersTableAdapter. Adicionando cdigo para executar a consulta adicional no formulrio

Para executar a consulta


1. 2. 3. 4. Selecione Form1 no Solution Explorer, e clique em View Designer. Arraste o n Customers da janela Data Sources para Form1. Altere para modo de exibio de cdigo, selecionando Code a partir do menu View. Substitua o cdigo no manipulador de eventos Form1_Load pelo seguinte, para executar a consulta FillByCity. C#
string cityValue = "Seattle"; customersTableAdapter.FillByCity(northwindDataSet.Customers, cityValue);

Executando o aplicativo

Para executar o aplicativo


Pressione F5. A grade preenchida com clientes com um valor City de Seattle. Prximas etapas

Para adicionar funcionalidade a seu aplicativo


Adicione um controle TextBox e um controle Button e passar o valor na caixa de texto para a consulta. (CustomersTableAdapter.FillByCity(NorthwindDataSet.Customers, TextBox1.Text)). Adicione validao lgica para o evento ColumnChanging. ou RowChanging das tabelas de dados no DataSet. Para obter mais informaes, consulte Viso geral sobre validao de dados. Consulte tambm

Viso Geral do Preenchimento de DataSets e Consultas de Dados


O tpico mecanismo do Visual Studio para executar consultas Transact-SQL e para preencher DataSets o TableAdapter. Voc pode executar instrues SQL ou procedimentos armazenados contra uma fonte de dados usando TableAdapters ou objetos de comando (por exemplo, SqlCommand). Para carregar dados nos DataSets criados usando ferramentas de design no Visual Studio, use TableAdapters. Para carregar dados nos DataSets criados por programao, use adaptadores de dados. Se seu

Visual C# Consolidado

927

aplicativo no usar DataSets, use objetos de comando para executar instrues SQL ou procedimentos armazenados diretamente em um banco de dados. Para obter mais informaes Preenchendo um DataSet usando um TableAdapter TableAdapters Preencher um DataSet com um adaptador de dados Preenchendo DataSets Se voc criar um DataSet com uma ferramenta de design de em tempo de execuo Visual Studio (tais como o Dataset Designer ou o Assistente para Configurao da Fonte de Dados), ento voc usar um TableAdapter para preench-lo. TableAdapters executam procedimentos armazenados ou instrues SQL. Se voc criar um DataSet sem ferramentas em tempo de design, voc deve utilizar adaptadores de dados para preencher e atualizar os dados. (TableAdapters no so realmente classes no .NET Framework, ento no so adequados para trabalhar com DataSets que tenham sido criados sem o uso de ferramentas em tempo de execuo. Para obter mais informaes sobre carregar dados em DataSets com TableAdapters ou adaptadores de dados, consulte Como: preencher uma DataSet com dados. Consultas TableAdapter Voc pode executar consultas TableAdapter para preencher dados em DataSets (Mais especificamente, para carregar dados para o DataTables que compem um DataSet). Voc pode criar consultas TableAdapter usando o Assistente de configurao da consulta TableAdapter no Dataset Designer. Consultas TableAdapter aparecem como mtodos nomeados num TableAdapter e so executados chamando o mtodo TableAdapter. Para obter mais informaes sobre como criar e executar consultas TableAdapter, consulte as seguintes pginas:

Consulte Como: preencher uma DataSet com dados Viso Geral do Adaptador de Tabela Populating a DataSet from a DataAdapter

Como criar e executar uma instruo SQL que retorna linhas: Como criar e executar uma instruo SQL que retorna um nico valor: Como: criar e executar uma instruo SQL que no retorna nenhum valor Como: Executar um Procedimento Armazenado que Retorna Linhas: Como: executar um procedimento armazenado que retorna um nico valor Como executar um procedimento armazenado que no retorna valor:

Objetos Command Objetos de comando (command) lhe do a capacidade de executar instrues SQL e procedimentos armazenados diretamente em um banco de dados, sem precisar de um DataSet, TableAdapter, ou DataAdapter. (O termo objeto de comando refere-se ao comando especfico .NET Framework Data Provider que o aplicativo est usando. Por exemplo, se seu aplicativo estiver usando o .NET Framework Data Provider para SQL Server, o objeto de comando poderia ser SqlCommand.)

Visual C# Consolidado

928

Voc configura comandos para consultar dados usando instrues SQL ou procedimentos armazenados, configurando a propriedade CommandType do comando de dados para um dos valores na enumerao CommandType. Defina o CommandType. para Text para executar instrues SQL, ou defina-o para StoredProcedure para executar procedimentos armazenados. Em seguida, defina a propriedade CommandText como um instruo SQL ou como o nome do procedimento armazenado. Seguida, voc pode executar o comando de dados chamando um dos mtodos de execuo (ExecuteReader, ExecuteScalar, ExecuteNonQuery). Cada um dos .NET Framework Data Providers oferece um objeto comando otimizado para bancos de dados especficos. Usando comandos de dados, voc pode fazer o seguinte em seu aplicativo:

Executar comandos Select (selecionar) que retornam um resultado que voc pode ler diretamente, em vez de carreg-lo no DataSet. Para ler os resultados, use uma leitora de dados (objeto OleDbDataReader, SqlDataReader, OdbcDataReader ou OracleDataReader), que funciona como um cursor somente para leitura, somente encaminhamento ao qual voc pode vincular controles.. Esta uma estratgia til para reduzindo uso de memria e carregar dados somente para leitura muito rapidamente. Executar comandos de definio de banco de dados (DDL) para criar, editar e remover tabelas, procedimentos armazenados e outras estruturas de banco de dados. (Voc deve ter permisses para executar essas aes, claro.) Executar comandos para obter informaes de catlogo do banco de dados. Executar comandos SQL dinmicos para atualizar, inserir ou excluir registros em vez de atualizar tabelas DataSet e depois copiar alteraes para o banco de dados. Executar comandos que retornam um valor escalar (isto , um valor nico), como os resultados de uma funo agregada (SUM, COUNT, AVG, e assim por diante). Executar comandos que retornam dados de um banco de dados do SQL Server (verso 7.0 ou posterior) no formato XML. Um uso tpico executar uma consulta e obter novamente dados em formato XML, aplicar um transformao XSLT a ele (para converter os dados em HTML), e enviar os resultados para um navegador.

Propriedades de comando contm todas as informaes necessrias para executar um comando em um banco de dados. Isso inclui:

Uma conexo o banco de dados.

O comando referencia uma conexo que ele usa para se comunicar com

O nome ou texto de um comando O comando inclui o texto real de uma intruo SQL ou o nome de um procedimento armazenado para executar. Parmetros Um comando pode exigir que voc passe valores de parmetro junto com ele (parmetros de entrada). O comando tambm pode retornar valores sob a forma de um valor de retorno ou valores de parmetro de sada. Cada comando tem um conjunto de parmetros que voc pode definir ou ler individualmente para passar ou receber valores. Para obter mais informaes, consulte Como: Definir e Obter Parmetros para Objetos de Comando.

Voc executa um comando usando um mtodo apropriado para os resultados que voc espera que sejam retornados. Por exemplo, se voc espera linhas, voc chama o comando do mtodo ExecuteReader, que retorna registros em uma leitora de dados. Se voc estiver executando um comando UPDATE, INSERT, ou Delete, voc chama o mtodo do comando ExecuteNonQuery, que retorna um valor indicando o nmero de linhas afetadas. Se voc estiver executando uma funo agregada, como retornar a contagem de pedidos para um cliente, voc chamar o mtodo ExecuteScalar.

Visual C# Consolidado

929

Vrios conjuntos de resultados


Um uso tpico de um objeto de comando retornar uma nica tabela de dados (um conjunto de linhas). Entretanto, comandos podem executar procedimentos que retornem vrios conjuntos de resultados. Isso pode acontecer de maneiras diferentes. Um maneira que o comando referencie um procedimento armazenado que retorne vrios conjuntos de resultados. Como alternativa, o comando pode conter duas (ou mais) instrues ou nomes de procedimentos armazenados. Nesse caso, as instrues ou procedimentos so executados seqencialmente e retornam vrios conjuntos de resultados com uma nica chamada. Se voc especificar vrias instrues ou procedimentos para um comando, elas devem todas ser do mesmo tipo. Por exemplo, voc pode executar sucessivas instrues SQL ou sucessivos procedimentos armazenados. Entretanto, voc no pode misturar chamadas de procedimentos armazenados e instrues SQL no mesmo comando. Para obter mais informaes, consulte Retrieving Data Using a DataReader. Observao Para Oracle, o .NET Framework Data Provider for Oracle no oferece suporte a instrues agrupadas SQL. Entretanto, ele no permite que voc use vrios parmetros de sada REF CURSOR para preencher um DataSet, cada em sua prpria tabela de dados. Voc deve definir os parmetros, marc-los como parmetros de sada, e indicar que eles so tipos de dados REF CURSOR. Observe que voc poder usar o mtodo Update quando o objeto OracleDataAdapter est preenchido dos parmetros REF CURSOR em um procedimento armazenado, pois Oracle no fornece as informaes necessrias para determinar quais os nomes da tabela e nomes de coluna quando a instruo SQL executada. Segurana Quando usando comandos de dados com uma propriedade CommandType definida como Text, cuidadosamente verifique informaes que so enviadas de um cliente antes passando-a para seu banco de dados. Usurios mal-intencionados podem tentar enviar (inserir) instrues SQL modificadas ou adicionais em um esforo para obter acesso no autorizado ou danificar o banco de dados. Antes de voc transferir a entrada do usurio a um banco de dados, sempre dever verificar se as informaes so vlidas. Uma prtica recomendada consiste em sempre usar consultas parametrizadas ou procedimentos armazenados quando possvel. Para obter mais informaes, consulte Validating User Input.

Passo a passo: Preenchendo um DataSet com dados


Este explicao passo a passo cria um DataSet com uma tabela de dados e a preenche com dados da tabela Customers no banco de dados de exemplo Northwind. O DataSet preenchido com dados chamando o mtodo Fill de um TableAdapter. Durante este explicao passo a passo, voc aprender como:

Criar um novo Windows Application. Criar e configurar um dataset com o Assistente para Configurao da Fonte de Dados. Criar um DataGridView ligado a dados arrastando a partir da janela Data Sources para um formulrio. Pr-requisitos

A fim de concluir este explicao passo a passo, ser necessrio:

Visual C# Consolidado

930

Acesso ao banco de dados de exemplo Northwind. Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Criando um Aplicativo Windows

A primeira etapa criar um Windows Application.

Para criar o novo projeto do Windows


1. 2. 3. No Visual Studio, a partir do menu File, criar um novo Project. Nomeie o projeto como DatasetWalkthrough. Selecione Windows Application e clique em OK. Para obter mais informaes, consulte Creating Windows-based Applications. O projeto DatasetWalkthrough criado e adicionado ao Solution Explorer. Criando o NorthwindDataSet Esta etapa cria um dataset usando o Data Source Configuration Wizard baseado na tabela Customers no banco de dados de exemplo Northwind. Voc deve ter acesso ao banco de dados de exemplo Northwind para criar a conexo. Para informaes sobre como configurar o banco de dados de exemplo Northwind, consulte COMO: Instalar Bancos de Dados de Exemplo.

Para criar o dataset


1. 2. 3. 4.
o

No menu Data, clique em Show Data Sources. Na janela Data Sources, clique em Add New Data Source para iniciar o Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type, e em seguida clique em Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind est disponvel na lista suspensa, selecione-a. -ouSelecione New Connection para iniciar a caixa de dilogo Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais (sensitive data), e clique em Next. Clique em Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione a tabela Customers, e clique em Finish. O NorthwindDataSet adicionado ao seu projeto e a tabela Customers aparece na janela Data Sources. Adicionando Controles ao Formulrio

5. 6. 7. 8.

Voc pode criar controles com dados vinculados, arrastando itens da janela Data Sources para um formulrio no seu aplicativo do Windows.

Para criar um DataGridView acoplado tabela Customers Visual C# Consolidado 931

Arraste o n principal de Customers da janela Data Sources para o Form1. Um controle DataGridView e uma faixa-ferramenta (BindingNavigator) aparecem no formulrio para navegar pelos registros . Um NorthwindDataSet, CustomersTableAdapter, BindingSource, e BindingNavigator aparecem na bandeja do componente. Inspecionando o Cdigo Gerado que Preenche o Dataset com Dados

Arrastando itens da janela Data Sources para um formulrio adiciona automaticamente o cdigo correto para preencher o dataset no manipulador de eventos Form1_Load.

Para carregar dados em um dataset


1. 2. No Solution Explorer, selecione o Form1, e clique no boto View Code. Inspecione o manipulador de eventos Form1_Load. O mtodo Fill do TableAdapter preenche o dataset com dados. C#
private void Form1_Load(object sender, EventArgs e) { // TODO: This line of code loads data into the 'northwindDataSet1.Customers' table. // You can move, or remove it, as needed. this.customersTableAdapter1.Fill(this.northwindDataSet1.Customers); }

3.

Opcionalmente, voc pode copiar este cdigo para outras partes do seu aplicativo onde voc precisar preencher o dataset. Executando o Aplicativo

Para executar o aplicativo


Pressione F5 para executar o aplicativo. O dataset preenchido com dados e exibido no DataGridView. Prximas etapas

Dependendo dos seus requisitos de aplicativo, h vrias etapas que convm executar aps criar um formulrio vinculado a dados. Alguns aprimoramentos que voc pode fazer nesta explicao passo a passo incluem:

Adicionar funcionalida de pesquisa ao formulrio. Para obter mais informaes, consulte Como: Adicionar uma Consulta Parametrizada a um Formulrio em um Aplicativo do Windows. Adicionar funcionalidade para enviar atualizaes de volta para o banco de dados. Para obter mais informaes, consulte Passo-a-Passo: Salvando Dados para um Banco de Dados (Tabela Simples). Adicionar a tabela Orders ao dataset, selecionando Configure DataSet with Wizard de dentro da janela Data Sources. Ento adicione controles que exibem dados relacionados, arrastando o n Orders (aquele abaixo da coluna Fax dentro da tabela Customers) para o formulrio. Para obter mais informaes, consulte Como: exibir dados relacionados em um aplicativo Windows:.

Explicao passo a passo: Lendo dados XML no Dataset


ADO.NET fornece mtodos simples para trabalhar com dados XML. Nesta explicao passo a passo voc criar um aplicativo do Windows que ir carregar dados XML em um DataSet. Ento o DataSet ser exibido em uma DataGridView. Finalmente, um esquema XML com base no contedo do arquivo XML ser exibido em uma caixa de texto.

Visual C# Consolidado

932

Este explicao passo a passo consiste das cinco etapas principais: 1. 2. 3. 4. 5. Criando um novo projeto. Criar um arquivo XML a ser lido no DataSet. Criando a interface do usurio. Criando o DataSet, leia o arquivo XML, e o exiba em um controle DataGridView. Adicionando cdigo para exibir o esquema XML baseado no arquivo XML em um controle TextBox.

Observao As caixas de dilogo e comandos de menu que voc ve podem diferir das descritas na Ajuda dependendo das suas configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Visual Studio Settings. Criar um novo projeto Nesta etapa, voc criar um projeto Visual Basic, Visual C#, ou Visual J# que ir conter esta explicao passo a passo.

Para criar o novo projeto Windows


1. 2. 3. No menu File, crie um novo projeto. Nomeie o projeto ReadingXML. Selecione Windows Application e clique em OK. Para obter mais informaes, consulte Creating Windows-based Applications. O projeto ReadingXML criado e adicionado no Solution Explorer. Gere o arquivo XML a ser lido para o DataSet Porque esta explicao passo a passo enfoca leitura de dados XML em um DataSet, o contedo de um arquivo XML fornecido.

Para criar o arquivo XML que ser lido para o DataSet


1. 2. 3. No menu Project, escolha Add New Item. Selecione XML File, nomeie o arquivo authors.xml, e clique em Add. O arquivo XML carrega no designer e est pronto para edio. Cole o seguinte cdigo no editor abaixo da declarao XML:
<Authors_Table> <authors> <au_id>172-32-1176</au_id> <au_lname>White</au_lname> <au_fname>Johnson</au_fname> <phone>408 496-7223</phone> <address>10932 Bigge Rd.</address> <city>Menlo Park</city> <state>CA</state> <zip>94025</zip> <contract>true</contract> </authors> <authors> <au_id>213-46-8915</au_id> <au_lname>Green</au_lname> <au_fname>Margie</au_fname> <phone>415 9867020</phone> <address>309 63rd St. #411</address> <city>Oakland</city> <state>CA</state> <zip>94618</zip> <contract>true</contract> </authors> <authors> <au_id>238-957766</au_id> <au_lname>Carson</au_lname> <au_fname>Cheryl</au_fname> <phone>415

Visual C# Consolidado

933

548-7723</phone> <address>589 Darwin Ln.</address> <city>Berkeley</city> <state>CA</state> <zip>94705</zip> <contract>true</contract> </authors> <authors> <au_id>267-412394</au_id> <au_lname>Hunter</au_lname> <au_fname>Anne</au_fname> <phone>408 286-2428</phone> <address>22 Cleveland Av. #14</address> <city>San Jose</city> <state>CA</state> <zip>95128</zip> <contract>true</contract> </authors> <authors> <au_id>274-80-9391</au_id> <au_lname>Straight</au_lname> <au_fname>Dean</au_fname> <phone>415 834-2919</phone> <address>5420 College Av.</address> <city>Oakland</city> <state>CA</state> <zip>94609</zip> <contract>true</contract> </authors> </Authors_Table>

4.

No menu File, aponte para Save authors.xml. Crie a interface de usurio

A interface do usurio para este aplicativo consistir do seguinte:


o o

Um controle DataGridView que ir exibir o contedo do arquivo XML como dados. Um controle TextBox que exibir o esquema XML para o arquivo XML. Dois controles Button. Um boto l o arquivo XML para o DataSet e exibe-o no controle DataGridView. Um segundo boto extrai o esquema do DataSet, e por um StringWriter exibe-o no controle TextBox.

Para adicionar controles ao formulrio


1. 2.
o o o

Abra Form1 no modo Design. No Toolbox, arraste os seguintes controles no formulrio: Um controle DataGridView Um controle TextBox Dois controles Button Defina as seguintes propriedades: Controle
TextBox1

3.

Propriedade Multiline ScrollBars

Configurao true Vertical ReadXmlButton Read XML ShowSchemaButton Show Schema

Button1

Name Text

Button2

Name Text

Crie o DataSet que ir receber os dados XML

Visual C# Consolidado

934

No procedimento seguinte, voc cria um novo DataSet chamado authors. Para obter mais informaes sobre DataSets, consulte DataSets no Visual Studio Overview.

Para criar um novo DataSet que receber os dados XML


1. 2. 3. Com o arquivo fonte para Form1 selecionado em Solution Explorer, clique no boto View Designer na barra de ferramentas Solution Explorer. No Data Tab, Toolbox, arraste um DataSet. para Form1 Selecione Untyped dataset no Caixa de Dilogo Add Dataset, e, em seguida clique em OK. DataSet1 adicionado bandeja do componente. 4. Na janela Properties, defina as propriedades Name e DataSetName para AuthorsDataSet. Crie o manipulador de eventos para ler o XML para o DataSet O boto Read XML l o arquivo XML para o DataSet e define propriedades sobre o controle DataGridView que acopla-o ao DataSet.

Para adicionar cdigo ao manipulador de eventos ReadXmlButton_Click


1. 2. 3. No Solution Explorer, selecione Form1 e clique no View Designer boto da barra de ferramentas Solution Explorer. Clique duas vezes no boto Read XML. O Code Editor abre no manipulador de eventos ReadXmlButton_Click. Digite o seguinte cdigo para o manipulador de eventos ReadXmlButton_Click: C#
private void ReadXmlButton_Click(object sender, EventArgs e) { string filePath = "Complete path where you saved the XML file"; AuthorsDataSet.ReadXml(filePath); dataGridView1.DataSource = AuthorsDataSet; dataGridView1.DataMember = "authors"; }

4.

Com o cdigo do manipulador de eventos ReadXMLButton_Click, altere a entrada filepath = para o caminho correto. Crie o manipulador de eventos para exibir o esquema na Textbox

O boto Show Schema cria um objeto StringWriter que preenchido com o esquema e exibido no TextBox.

Para adicionar cdigo ao manipulador de eventos ShowSchemaButton_Click


1. 2. 3. No Solution Explorer, selecione Form1 e clique no boto View Designer. Clique duas vezes no boto Show Schema. O Code Editor abre no manipulador de eventos ShowSchemaButton_Click. Digite o seguinte cdigo para o manipulador de eventos ShowSchemaButton_Click. C#
private void ShowSchemaButton_Click(object sender, EventArgs e) { System.IO.StringWriter swXML = new System.IO.StringWriter(); AuthorsDataSet.WriteXmlSchema(swXML); textBox1.Text = swXML.ToString(); }

Visual C# Consolidado

935

Testando Agora voc pode testar o formulrio para certificar-se de que ele funciona comforme o esperado.

Para testar o formulrio


1. 2. 3. Pressione F5 para executar o aplicativo. Clique no boto Read XML. O DataGridView exibe o contedo do arquivo XML. Clique no boto Show Schema. A caixa de texto exibe o esquema XML para o arquivo XML. Prximas etapas Esta explicao passo a passo mostra as noes bsicas de ler um arquivo XML em um DataSet, bem como criar um esquema com base no contedo do arquivo XML. Aqui esto algumas tarefas que podem vie em seguida:

Edite os dados no DataSet e grave-os de volta como XML. Para obter mais informaes, consulte WriteXml. Edite os dados no DataSet e grave-os em um banco de dados. Para obter mais informaes, consulte Salvando dados.

Viso Geral da Exibio dados


Voc exibe dados para os usurios do seu aplicativo pela vinculao de dados a controles em um formulrio. Voc pode criar esses controles com dados vinculados arrastando itens da janela Data Sources para um formulrio no seu aplicativo do Windows. H vrios componentes e processos que devem ser compreendidos quando for desenvolver aplicativos do Windows com dados vinculados. Abaixo um resumo das tarefas, objetos e caixas de dilogo envolvidos na criao de aplicativos do Windows com dados vinculados. Para obter mais informaes, consulte Windows Forms Data Binding. Tarefas envolvidas na exibio de dados em um formulrio em um aplicativo do Windows As tarefas a seguir mostram o processo tpico que se segue para exibir dados em um formulrio em um aplicativo do Windows. Tarefa Abrir a janela Data Sources Adicionar uma fonte de dados no seu projeto Obter mais informaes Como abrir a janela Fontes de dados: Clique em Add New Data Source no Janela de fontes de dados e complete a Assistente para Configurao da Fonte de Dados

Como: Conectar-se a Dados em um Banco de Dados Como se conectar a dados em um objeto: Como: se conectar a dados em um servio da

Visual C# Consolidado

936

Web

Como: Conectar-se a Dados em um Banco de Dados SQL Server Express Como: Conectar a dados em um banco de dados do Access:

Definir os itens na janela Data Sources para os controles que voc deseja que estejam criados

Como: Definir o controle a ser criado quando arrastado da janela Data Sources:

Arrastar itens da janela Data Sources para seu formulrio


Como exibir dados em um controle Windows Forms DataGridView: Como: Exibir Dados em controles individuais Windows Forms Encadernao dados para controles existente como:

Formatar a maneira de controles exibirem dados

Formatting and Advanced Binding Dialog Box

Depois de ter criado um formulrio que exibe dados, voc pode desejar seguir uma das seguintes tarefas: Tarefa Editar os dados na fonte de dados subjacentes Para obter mais informaes Editar dados no seu aplicativo (tenha em mente que alteraes nos dados em controles com dados vinculados so gravadas automaticamente no dataset, mas no so salvas automaticamente no banco de dados subjacente.) Validando dados

Validar alteraes feitas nos dados

Salvar dados Salvando dados atualizados de volta no banco de dados Fontes de dados Fontes de dados representam os dados disponveis para seu aplicativo e so criadas executando o Assistente para Configurao da Fonte de Dados. Fontes de dados so criadas de bancos de dados, servios da Web ou objetos. Para obter mais informaes, consulte Viso geral sobre fontes de dados. Janela de fontes de dados Fontes de dados esto disponveis para o projeto como itens em Janela de fontes de dados e podem ser arrastadas para seu formulrio para criar controles que exibem os dados subjacentes.

Visual C# Consolidado

937

Antes de arrastar itens da janela Data Sources, especifique os controles a serem criados pelo clique na lista suspensa para cada tabela e coluna e selecione o controle desejado. Para obter mais informaes, consulte Como: Definir o controle a ser criado quando arrastado da janela Data Sources:. Observao Voc pode alterar a lista de controles disponveis para itens na janela Data Sources. Para obter mais informaes, consulte Como: Adicionar Controles Personalizados Janela de Fonte de Dados. TableAdapters TableAdapters so componentes gerados pelo designer criados pelo Visual Studio. Eles so usados para preencher datasets (ou, mais especificamente, eles so usados para carregar dados em DataTables que compem um dataset e para atualizar o banco de dados pelo qual a DataTable foi preenchida). TableAdapters so anlogos a adaptadores de dados fortemente tipados; eles fornecem comunicao entre seu aplicativo e seus dados. TableAdapters contm a conexo e comandos, ou instrues SQL, que so executados no armazenamento de dados subjacentes. Para obter mais informaes, consulte Viso Geral do Adaptador de Tabela. Consultas de TableAdapter Diferentemente de adaptadores de dados padres, TableAdapters tm a capacidade para conter vrias consultas para preencher suas tabelas de dados associadas. Voc pode definir tantas consultas para um TableAdapter quantas seu aplicativo requerer, contanto que cada consulta retorne dados que estejam de acordo com o mesmo esquema que sua tabela de dados associada. Para obter mais informaes, consulte Como: Criar Consultas TableAdapter:. Marcas inteligentes de dados Marcas inteligentes especficas para trabalhar com dados esto disponveis em vrios controles. Quando certos controles so adicionados a um formulrio, um conjunto de aes possveis relacionadas a dados esto disponveis na marca inteligente. Para obter mais informaes, consulte Marcas Inteligentes de Dados. Componente BindingSource O componente BindingSource serve a dois propsitos. Primeiro, ele fornece uma camada de engano ao vincular os controles no seu formulrio aos dados. Controles no formulrio so vinculados ao componente BindingSource (em oposio aos sendo vinculados diretamente a uma fonte de dados). Alm disso, o componente BindingSource pode gerenciar uma coleo de objetos. Adicionar um tipo ao BindingSource cria uma lista do mesmo tipo. Para obter mais informaes sobre o componente BindingSource, consulte:

BindingSource Component BindingSource Component Overview BindingSource Component Architecture BindingSource Component Sample

Visual C# Consolidado

938

Controle BindingNavigator Este componente fornece uma interface de usurio para navegar por dados em um aplicativo do Windows. Para obter mais informaes, consulte BindingNavigator Control (Windows Forms). Controle DataGridView O controle DataGridView permite que voc exiba e edite dados tabulares de muitos tipos diferentes de fontes de dados. Vinculao de dados ao controle DataGridView realizada por meio da propriedade DataSource. Para obter mais informaes, consulte DataGridView Control Overview (Windows Forms).

Passo-a-passo: Exibindo dados em um formulrio em um aplicativo do Windows


Um dos cenrios mais comuns no desenvolvimento de aplicativos exibir dados num formulrio em um aplicativo Windows. Voc pode exibir dados em um formulrio arrastando itens do Janela de fontes de dados para o formulrio. Esta explicao passo a passo cria um formulrio simples que exibe dados de uma nica tabela em vrios controles individuais. Este exemplo usa a tabela Customers do banco de dados de exemplo Northwind. Tarefas ilustradas nesta explicao passo a passo incluem:

Criando um novo projeto Windows Application. Criando e configurando um DataSet com o Assistente para Configurao da Fonte de Dados. Selecionando o controle a ser criado no formulrio ao arrastar itens a partir da janela Data Sources. Para obter mais informaes, consulte Como: Definir o controle a ser criado quando arrastado da janela Data Sources:. Criando um controle vinculado a dados, arrastando itens da janela Data Sources para seu formulrio. Pr-requisitos

Para concluir esta explicao passo a passo, voc precisa:

Acesso ao banco de dados de exemplo Northwind. Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Criando o aplicativo Windows

A primeira etapa para criar um projeto Windows Application.

Para criar o novo projeto do Windows Application


1. 2. 3. No menu File, crie um novo projeto. Nomeie o projeto DisplayingDataonaWindowsForm. Selecione Windows Application e clique em OK. Para obter mais informaes, consulte Creating Windows-based Applications. O projeto DisplayingDataonaWindowsForm criado e adicionado Solution Explorer. Criando a fonte de dados Essa etapa cria uma fonte de dados usando o Data Source Configuration Wizard baseado na tabela Customers no banco de dados de exemplo Northwind. Voc deve ter acesso ao banco de

Visual C# Consolidado

939

dados de exemplo Northwind para criar a conexo. Para informaes sobre como configurar dados de exemplo Northwind, consulte COMO: Instalar Bancos de Dados de Exemplo.

Para criar a fonte de dados


1. 2. 3. 4.
o

No menu Data, clique em Show Data Sources. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type, e clique Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind est disponvel na lista drop-down, selecione-a. -ouSelecione New Connection para iniciar a caixa de dilogo Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais, e clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione a tabela Customers, e clique Finish. O NorthwindDataSet adicionado ao seu projeto e a tabela Customers aparece na janela Data Sources. Definindo os controles a serem criados

5. 6. 7. 8.

Para este explicao passo a passo os dados estaro em um layout Details onde dados so exibidos em controles individuais. (A abordagem alternativa o layout padro Grid onde os dados so exibidos em um controle DataGridView.)

Para definir o tipo subjacente para os itens na janela Data Sources


1. 2. Expanda o n Customers na janela Data Sources. Altere o tipo subjacente da tabela Customers para Details selecionando Details na lista drop-down no n Customers. Para obter mais informaes, consulte Como: Definir o controle a ser criado quando arrastado da janela Data Sources:. Altere o tipo suspenso da coluna CustomerID para um rtulo selecionando Label na lista de controles no n CustomerID. Criando o formulrio Crie os controles com dados vinculados, arrastando itens da janela Data Sources para seu formulrio.

3.

Para criar controles vinculado a dados no formulrio

Arraste o n principal Customers da janela Data Sources para o formulrio. Controles com dados vinculados com rtulos descritivos aparecem no formulrio, juntamente com uma faixa de ferramenta (BindingNavigator) para navegar pelos registros. A

Visual C# Consolidado

940

NorthwindDataSet, CustomersTableAdapter, BindingSource, e BindingNavigator aparecem na bandeja do componente. Testando o aplicativo

Para executar o aplicativo


Pressione F5. Navegue pelos registros usando o controle BindingNavigator. Prximas etapas

Dependendo dos seus requisitos de aplicativo, h vrias etapas que voc pode desejar executar aps criar um Windows Form vinculado a dados (data-bound). Alguns aprimoramentos que voc poderia fazer a essa explicao passo a passo incluem:

Adicionar funcionalidade de pesquisa ao formulrio. Para obter mais informaes, consulte Como: Adicionar uma Consulta Parametrizada a um Formulrio em um Aplicativo do Windows. Adicionar funcionalidade para enviar atualizaes de volta para o banco de dados. Para obter mais informaes, consulte Passo-a-Passo: Salvando Dados para um Banco de Dados (Tabela Simples). Adicionando a tabela Orders para o DataSet, selecionando Configure DataSet with Wizard de dentro da janela Data Sources. Em seguida, voc pode adicionar controles que exibem dados relacionados, arrastando o n Orders (aquele abaixo da coluna Fax dentro da tabela Customers) para o formulrio. Para obter mais informaes, consulte Como: exibir dados relacionados em um aplicativo Windows:.

Explicao passo a passo: Exibindo Dados Relacionados em um Formulrio em um Aplicativo Windows


Em muitos cenrios de aplicativo, voc deseja trabalhar com dados que vem de mais de uma tabela e, com freqncia, dados de tabelas relacionadas. Isto , voc deseja trabalhar com uma relao pai-filho. Por exemplo, convm criar um formulrio onde selecionar um registro de cliente exibe os pedidos referentes a esse cliente. Exibir os registros relacionados no formulrio obtido, definindo a propriedade DataSource do filho BindingSource para a pai BindingSource (no a tabela filho), e definindo a propriedade DataMember do filho BindingSource para a relao de dados que liga as tabelas pai e filho juntas. Tarefas ilustradas nesta explicao passo a passo incluem:

Criando um projeto Windows Application. Criando e configurando um DataSet em seu aplicativo baseado nas tabelas Customers e Orders no banco de dados Northwind usando o Assistente para Configurao da Fonte de Dados. Adicionando controles para exibir dados da tabela Customers. Adicionar controles para exibir a Orders baseado nos Customer selecionados. Teste o aplicativo, selecionando clientes diferentes e verificando que os pedidos corretos so exibidos para o cliente selecionado. Pr-requisitos

Para concluir esta explicao passo a passo, voc precisa:

Visual C# Consolidado

941

Acesso ao banco de dados de exemplo Northwind. Para configurar bancos de dados de exemplo, consulte COMO: Instalar Bancos de Dados de Exemplo. Criando o projeto

A primeira etapa criar um Windows Application.

Para criar o projeto do aplicativo do Windows


1. 2. 3. No menu File, crie um novo projeto. Nomeie o projeto RelatedDataWalkthrough. Selecione Windows Application e clique em OK. Para obter mais informaes, consulte Creating Windows-based Applications. O projeto RelatedDataWalkthrough criado e adicionado ao Solution Explorer. Criando o DataSet Esta etapa cria um DataSet com base nas tabelas Customers e Orders do banco de dados de exemplo Northwind.

Para criar o DataSet


1. 2. 3. 4.
o

No menu Data, clique em Show Data Sources. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type, e clique Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind estiver disponvel na lista drop-down, selecione-o. -ouSelecione New Connection para iniciar a caixa Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais, e clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione as tabelas Customers e Orders, e clique Finish. O NorthwindDataSet adicionado ao seu projeto e a tabela Customers aparece na janela Data Sources. Criando controles para exibir dados da tabela Customers

5. 6. 7. 8.

Para criar controles para exibir os dados do cliente (customer) (registros pai)
1. 2. 3. Na janela Data Sources, selecione a tabela Customers, e clique na seta suspensa. Escolha Details no menu. Arraste o n principal Customers da janela Data Sources na parte superior do Form1. Controles com dados vinculados com rtulos descritivos aparecem no formulrio, juntamente com uma faixa de ferramenta. (BindingNavigator) para navegar pelos registros

Visual C# Consolidado

942

Um NorthwindDataSet, CustomersTableAdapter, BindingSource, e BindingNavigator aparecem na bandeja do componente. Criando controles para exibir dados da tabela Orders

Para criar controles para exibir os pedidos (orders) para cada cliente (registros filho)

Na janela Data Sources, expanda o n Customers e selecione a ltima coluna na tabela Customers, que um n expansvel Orders, e arraste-o para a parte inferior do Form1. Um DataGridView adicionado ao formulrio, e um novo BindingSource. (OrdersBindingSource) e TableAdapter (OrdersTableAdapter) so adicionados bandeja de componentes. Observao Abra a Properties Window e selecione o OrdersBindingSource. Inspecione o DataSource e as propriedades DataMember para ver como a ligao est configurada para exibir registros relacionados. A DataSource est definida como CustomersBindingSource (a tabela pai do BindingSource), em vez da tabela Orders. A propriedade DataMember definida como FK_Orders_Customers, que o nome do objeto DataRelation que relaciona as tabelas juntas. Testando o aplicativo

Para testar o aplicativo


1. 2. Pressione F5 para executar o aplicativo. Selecione diferentes clientes usando o CustomersBindingNavigator para verificar que os pedidos corretos so exibidos na DataGridView.

Visual C# Consolidado

943

Prximas etapas Dependendo dos seus requisitos de aplicativo, h vrias etapas que voc pode desejar executar aps criar um formulrio de detalhes mestre. Voc pode fazer um aperfeioamento nesta explicao passo a passo, que :

Filtrando os registros Customers por adicionar parametrizao tabela Customers. Para fazer isso, selecione qualquer controle que exibe dados da tabela Customers, clique na marca inteligente, e escolha Add Query. Conclua a Caixa de Dilogo Construtora de Critrios de Pesquisa. Para obter mais informaes, consulte Como: Adicionar uma Consulta Parametrizada a um Formulrio em um Aplicativo do Windows.

Passo-a-passo: Criando um formulrio para pesquisar dados em um aplicativo do Windows


Um cenrio de aplicativo comum exibir dados selecionados em um formulrio. Por exemplo, voc pode desejar exibir os pedidos para um cliente especfico ou os detalhes de uma ordem especfica. Nesse cenrio, um usurio insere informaes em um formulrio, e em seguida, uma consulta executada com a entrada do usurio como parmetro; ou seja, os dados so selecionados com base em uma consulta parametrizada. A consulta retorna somente os dados que satisfizerem aos critrios inseridos pelo usurio. Esta explicao passo a passo mostra como criar uma consulta que retorne clientes de uma cidade especfica, e modifica a interface do usurio para que os usurios possam inserir um nome de cidade e pressionar um boto para executar a consulta. Usar consultas parametrizadas ajuda a tornar seu aplicativo eficiente, permitindo que o banco de dados faa o trabalho no qual ele melhor filtrar registros rapidamente. Se, em contrapartida, voc solicitar um tabela de banco de dados inteira, transferi-la atravs da rede, e em seguida, usar lgica do aplicativo para encontrar os registros que voc deseja, seu aplicativo pode se tornar lento ineficiente. Voc pode adicionar consultas parametrizadas a qualquer TableAdapter (e controles para aceitar valores de parmetro e executar a consulta) usando o Caixa de Dilogo Construtora de Critrios de Pesquisa. Abra a caixa de dilogo selecionando o comando Add Query no menu Data (ou em qualquer marca inteligente TableAdapter). Tarefas ilustradas nesta explicao passo a passo incluem:

Criando um novo projeto Windows Application. Criao e configurao da fonte de dados em seu aplicativo com o Assistente para Configurao da Fonte de Dados. Definio do tipo subjacente dos itens na Janela de fontes de dados. Para obter mais informaes, consulte Como: Definir o controle a ser criado quando arrastado da janela Data Sources:. Criao de controles que exibem dados, arrastando itens a partir da janela Data Sources em um formulrio. Adio de controles para exibir os dados no formulrio. Concluso do Caixa de Dilogo Construtora de Critrios de Pesquisa. Insero de parmetros no formulrio e execuo da consulta parametrizada. Pr-requisitos

Para concluir esta explicao passo a passo, voc precisa:

Visual C# Consolidado

944

Acesso ao banco de dados de exemplo Northwind. Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Criando o aplicativo Windows

A primeira etapa criar um Windows Application. Atribuir um nome para o projeto opcional nesta etapa mas ns lhe daremos um nome porque planejamos salv-lo posteriormente.

Para criar o novo projeto do Aplicativo do Windows


1. 2. 3. No menu File, crie um novo projeto. Nomeie o projeto como WindowsSearchForm. Selecione Windows Application e clique em OK. Para obter mais informaes, consulte Creating Windows-based Applications. O projeto WindowsSearchForm projeto criado e adicionado ao Solution Explorer. Criando a Fonte de Dados Essa etapa cria uma fonte de dados a partir de um banco de dados usando o Data Source Configuration Wizard. Voc deve ter acesso ao banco de dados de exemplo Northwind para criar a conexo. Para informaes sobre como configurar o banco de dados de exemplo Northwind, consulte COMO: Instalar Bancos de Dados de Exemplo.

Para criar a fonte de dados


1. 2. 3. 4.
o

No menu Data, clique em Show Data Sources. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type, e em seguida clique Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind est disponvel na lista suspensa, selecione-a. -ouSelecione New Connection para iniciar a caixa de dilogo Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais, e em seguida clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione a Tablea Customers, e clique Finish. O NorthwindDataSet adicionado ao seu projeto e a tabela Customers aparece na janela Data Sources. Criando o formulrio

5. 6. 7. 8.

Voc pode criar os controles vinculados a dados arrastando itens da janela Data Sources para seu formulrio.

Para criar controles vinculado a dados no formulrio Visual C# Consolidado 945

1. 2.

Expanda o n Customers na janela Data Sources. Arraste o n Customers da janela Data Sources para seu formulrio. Um DataGridView e uma faixa ferramenta (BindingNavigator) para navegar pelos registros aparecem no formulrio. Um NorthwindDataSet, CustomersTableAdapter, BindingSource, e BindingNavigator aparecem na bandeja do componente. Adicionando Parametrizao (funcionalidade de pesquisa) Consulta

Voc pode adicionar uma clusula WHERE consulta original usando o Caixa de Dilogo Construtora de Critrios de Pesquisa.

Para criar uma consulta parametrizada e controles para inserir os parmetros


1. 2. 3. Selecione o controle DataGridView, e escolha Add Query no menu Data. Digite FillByCity na rea New query name no Caixa de Dilogo Construtora de Critrios de Pesquisa. Adicione WHERE City = @City consulta na rea Query Text. A consulta deve ser semelhante seguinte:
SELECT CustomerID, CompanyName, ContactName, ContactTitle, Address, City, Region, PostalCode, Country, Phone, Fax FROM Customers WHERE City = @City

Observao Fontes de dados OleDb e Access usam o ponto de interrogao '?' para denotar parmetros, portanto a clusula WHERE teria esta aparncia: WHERE City = ? 4. Clique OK para fechar a caixa de dilogo Search Criteria Builder. Uma FillByCityToolStrip adicionado ao formulrio. Testando o aplicativo Executar o aplicativo abre o formulrio pronto para receber o parmetro como entrada.

Para testar o aplicativo


1. 2. Pressione F5 para executar o aplicativo. Digite London na caixa de texto City e clique FillByCity. A grade de dados preenchida com clientes que atendem aos critrios de parametrizao. Neste exemplo, a grade de dados exibe clientes que tm um valor London na sua coluna City. Prximas etapas Dependendo dos seus requisitos de aplicativo, h vrias etapas que voc pode desejar executar aps criar um formulrio parametrizado. Alguns aprimoramentos que voc pode fazer nesta explicao passo a passo incluem:

Adio de controles que exibem dados relacionados. Para obter mais informaes, consulte Como: exibir dados relacionados em um aplicativo Windows:.

Visual C# Consolidado

946

Edio do dataset para adicionar ou remover objetos de banco de dados. Para obter mais informaes, consulte Como editar um DataSet:. Consulte tambm

Passo a passo: Criando uma tabela de pesquisa


Uma tabela de pesquisa (lookup table) usada para exibir informaes de uma tabela de acordo com o valor de um campo de chave externo de outra tabela. Por exemplo, considere uma tabela de pedidos em um banco de dados de vendas. Cada registro na tabela Pedidos inclui um CdigoDoCliente indicando qual cliente colocou a ordem. O CdigoDoCliente uma chave externa apontando para um registro de cliente na tabela Clientes. Convm exibir o nome real dos clientes, em vez do CdigoDoCliente, quando apresentar uma lista de pedidos (da tabela Pedidos). Como o nome do cliente est na tabela Clientes, e voc est apresentando dados da tabela Pedidos, voc precisa criar uma tabela de pesquisa, que recebe o valor CdigoDoCliente da tabela Pedidos, e usa esse valor para navegar pelo relacionamento e retornar um valor mais palpvel, o nome do cliente. Esse conceito conhecido como uma tabela de pesquisa. As tarefas ilustradas nesta explicao passo a passo incluem:

Criando um novo projeto Windows Application. Criar e configurar um dataset com o Assistente para Configurao da Fonte de Dados. Selecionar o controle a ser criado no formulrio ao arrastar itens a partir da janela Data Sources. Para obter mais informaes, consulte Como: Definir o controle a ser criado quando arrastado da janela Data Sources:. Criando controles com dados vinculados, arrastando itens da janela Data Sources em um formulrio. Configurando uma tabela de pesquisa soltando uma tabela relacionada em um controle vinculado por uma relao de chave externa. Pr-requisitos

Para concluir esta explicao passo a passo, voc precisa:

Acesso ao banco de dados de exemplo Northwind. Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Criando um novo aplicativo Windows

Para criar o novo projeto de Windows Application


1. 2. 3. No menu File, crie um novo projeto. Nomeie o projeto LookupTableWalkthrough. Selecione Windows Application e clique em OK. Para obter mais informaes, consulte Creating Windows-based Applications. O projeto LookupTableWalkthrough criado e adicionado Solution Explorer. Criando uma nova fonte de dados

Para criar a fonte de dados


1. 2. No menu Data, clique em Show Data Sources. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source Configuration Wizard.

Visual C# Consolidado

947

3. 4.
o

Selecione Database na pgina Choose a Data Source Type, e clique Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind est disponvel na lista drop-down, selecione-o. - ou Selecione New Connection para iniciar a caixa Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se o seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais, e clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione as tabelas Customers e Orders, e clique Finish. O NorthwindDataSet adicionado ao seu projeto e as duas tabelas aparecem na janela Data Sources . Criando controles vinculados a dados no formulrio

5. 6. 7. 8.

Para criar controles vinculados a dados no formulrio


1. 2. Expanda o n Customers na janela Data Sources. Altere o drop type da tabela Orders relacionada para Details selecionando Details na lista de controles no n Orders. Para obter mais informaes, consulte Como: Definir o controle a ser criado quando arrastado da janela Data Sources:. Expanda o n Orders relacionado e altere o drop type da coluna CustomerID para a uma combo box selecionando ComboBox na lista de controles no n CustomerID. Arraste o n Orders relacionado da janela Data Sources para o Form1. Controles vinculados a dados com suas descries aparecem no formulrio, junto com um tool strip (BindingNavigator) para navegar pelos registros. Um NorthwindDataSet, CustomersTableAdapter, BindingSource, e BindingNavigator aparecem na caixa de componentes. Criando a tabela de pesquisa Voc estabelece a tabela de pesquisa, definindo propriedades na combo box CustomerID:

3. 4.

Para criar a funcionalidade de tabela de pesquisa no formulrio

Arraste o n principal Customers da janela Data Sources diretamente para a combo box CustomerID no Form1. Observao A tabela a seguir somente para referncia; as propriedades so definidas automaticamente durante o arraste do procedimento acima. O designer define as propriedades a seguir conforme descrito abaixo em " Explicao das configuraes ". Dependendo das estruturas da sua tabela, voc talvez precise ajustar as propriedades para a sua tabela de pesquisa funcionar corretamente. Propriedade DataSource Explicao sobre configurao O Visual Studio define essa propriedade como o BindingSource criado para a tabela que voc arrastou para o controle (em vez do BindingSource criado quando o controle foi criado).

Visual C# Consolidado

948

Se voc precisar fazer um ajuste, ento defina essa propriedade como o BindingSource da tabela com a coluna que voc quer mostrar. (CustomersBindingSource para este passo a passo.) DisplayMember O Visual Studio define essa propriedade como a primeira coluna aps a chave primria que tem um tipo de dados string para a tabela que voc arrastar para o controle. Se voc precisar fazer um ajuste, defina essa propriedade como o nome da coluna que voc deseja exibir. O Visual Studio define esta propriedade como a primeira coluna participante da chave primria, ou a primeira coluna na tabela se nenhuma chave estiver definida. Se voc precisar fazer um ajuste, defina essa propriedade como a chave primria na tabela com a coluna que voc deseja exibir. O Visual Studio define essa propriedade como a coluna original arrastada da janela Data Sources. Se voc precisar fazer um ajuste, defina essa propriedade como a coluna de chave externa na tabela relacionada. (CustomerID na tabela Orders para esse passo a passo.)

ValueMember

SelectedValue

Executando o aplicativo

Para executar o aplicativo


1. 2. Pressione F5. Navegue pelos pedidos e certifique-se de que a combo box CustomerID exibe o
CompanyName da tabela Customers para cada pedido (em vez da coluna CustomerID da tabela Orders).

Prximas etapas Dependendo dos requisitos do seu aplicativo, h vrias etapas que voc pode querer executar aps criar um formulrio vinculado a dados. Alguns aprimoramentos que voc pode fazer nesse passo a passo incluem:

Adicionar funcionalidade de pesquisa ao formulrio. Para obter mais informaes, consulte Como: Adicionar uma Consulta Parametrizada a um Formulrio em um Aplicativo do Windows. Adicionar funcionalidade para enviar atualizaes de volta para o banco de dados. Para obter mais informaes, consulte Passo-a-Passo: Salvando Dados para um Banco de Dados (Tabela Simples). Adicionar a tabela Orders para o dataset selecionando Configure DataSet with Wizard de dentro da janela Data Sources. Em seguida, voc pode adicionar controles que exibem dados relacionados arrastando o n Orders relacionado (aquele abaixo da coluna Fax dentro da tabela Customers) para o formulrio. Para obter mais informaes, consulte Como: exibir dados relacionados em um aplicativo Windows:.

Passo a passo: Criando um Controle de Usurio que Suporta Ligao de Dados Simples
Ao exibir dados em formulrios em aplicativos Windows, voc pode escolher controles existentes da Toolbox ou voc pode criar controles personalizados se seu aplicativo requer funcionalidade que no est disponvel nos controles padro. Este explicao passo a passo mostra como criar um controle que implementa o DefaultBindingPropertyAttribute. Controles que implementam o DefaultBindingPropertyAttribute podem conter uma propriedade que pode ser vinculada a dados. Esses controles so semelhantes aos de um TextBox ou CheckBox

Visual C# Consolidado

949

Para obter mais informaes sobre criao de controle, consulte Developing Windows Forms Controls at Design Time. Ao criar controles para uso em cenrios de vinculao de dados, voc precisa implementar um dos seguintes atributos de vinculao de dados: Uso atributo DataBinding Implementar o DefaultBindingPropertyAttribute em controles simples, como a TextBox, que exibe uma nica coluna (ou propriedade) de dados. (Esse processo descrito nesta pgina de explicao passo a passo.) Implementar o ComplexBindingPropertiesAttribute nos controles, como o DataGridView, que exibe listas (ou tabelas) de dados Para obter mais informaes, consulte Passo a passo: Criando um Controle de Usurio que Suporta Ligao de Dados Complexa. Implementar o LookupBindingPropertiesAttribute nos controles, como a ComboBox, que exibe listas (ou tabelas) de dados, mas tambm precisa apresentar uma nica coluna ou propriedade. Para obter mais informaes, consulte Passo a passo: Criando um Controle de Usurio que Suporta Pesquisa de Ligao de Dados. Esta explicao passo a passo cria um controle simples que exibe dados de uma nica coluna em uma tabela. Este exemplo usa a coluna Phone da tabela Customers do banco de dados de exemplo Northwind. O controle de usurio simples ir exibir nmeros de telefone do cliente em um padro de formato nmero telefnico usando uma MaskedTextBox e configurando a mscara para um nmero de telefone Durante esta explicao passo a passo, voc aprender como:

Criar um novo Windows Application. Adicionar um novo User Control para o projeto. Criar o controle de usurio visualmente . Implementar o atributo DefaultBindingProperty. Criar um DataSet com o Assistente para Configurao da Fonte de Dados. Definir a coluna Phone na janela Data Sources para usar o novo controle. Criar um formulrio para exibir dados no novo controle. Pr-requisitos

A fim de concluir esta explicao passo a passo, ser necessrio:

Acessar o banco de dados de exemplo Northwind. Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Criando um Aplicativo do Windows

A primeira etapa para criar um Windows Application.

Para criar o novo projeto Windows


1. 2. No Visual Studio, a partir do menu File, criar um novo Project. Nome do projeto SimpleControlWalkthrough.

Visual C# Consolidado

950

3.

Selecione Windows Application e clique em OK. Para obter mais informaes, consulte Creating Windows-based Applications. O projeto SimpleControlWalkthrough criado e adicionado ao Solution Explorer. Adicionar um Controle de Usurio ao Projeto

Esta explicao passo a passo cria um simples controle de dados-ligveis de um User Control para adicionar um item User Control ao projeto SimpleControlWalkthrough.

Para adicionar um controle de usurio ao projeto


1. 2. No menu Project, escolha Add User Control. Digite PhoneNumberBox na rea Nome e clique em Add. O controle PhoneNumberBox adicionado ao Solution Explorer e abre no designer. Criando o Controle PhoneNumberBox Esta explicao passo a passo expande na existncia de MaskedTextBox para criar o controle PhoneNumberBox.

Para criar o controle PhoneNumberBox


1. 2. 3. Arraste um MaskedTextBox do Toolbox na superfcie do design do controle de usurio. Selecione a marca inteligente no MaskedTextBox apenas arrastando e escolha Set Mask. Selecione Phone number na caixa de dilogo Input Mask e clique em OK para definir a mscara. Adicionando o Atributo de Vinculao de Dados Requerido Para simples controles que suportam DataBinding, implemente o DefaultBindingPropertyAttribute.

Para implementar o atributo DefaultBindingProperty


1. 2. Alterne o controle PhoneNumberBox para modo de exibio do cdigo. (No menu View, escolha Code.) Substitua o cdigo no PhoneNumberBox com o seguinte: C#
using System.Windows.Forms; namespace CS { [System.ComponentModel.DefaultBindingProperty("PhoneNumber")] public partial class PhoneNumberBox : UserControl { public string PhoneNumber { get{ return maskedTextBox1.Text; } set{ maskedTextBox1.Text = value; } } public PhoneNumberBox() { InitializeComponent(); } } }

J#
package JSL; /**@attribute System.ComponentModel.DefaultBindingProperty("Text") */ public class PhoneNumberBox extends System.Windows.Forms.UserControl { /**@property */ public String get_Text() { return maskedTextBox1.get_Text(); } /**@property */ public void set_Text(String value) { this.maskedTextBox1.set_Text(value); } public PhoneNumberBox() { InitializeComponent(); } private System.Windows.Forms.MaskedTextBox maskedTextBox1; private System.ComponentModel.IContainer components; #region Component Designer generated code

Visual C# Consolidado

951

protected void Dispose(boolean disposing) { if (disposing) { if (components != null) { components.Dispose(); } } super.Dispose(disposing); } private void InitializeComponent() { this.maskedTextBox1 = new System.Windows.Forms.MaskedTextBox(); this.SuspendLayout(); // // maskedTextBox1 // this.maskedTextBox1.set_CutCopyMaskFormat(System.Windows.Forms.MaskFormat.IncludeLiteral s); this.maskedTextBox1.set_HidePromptOnLeave(false); this.maskedTextBox1.set_Location(new System.Drawing.Point(26, 25)); this.maskedTextBox1.set_Mask("(999) 000-0000"); this.maskedTextBox1.set_Name("maskedTextBox1"); this.maskedTextBox1.set_Size(new System.Drawing.Size(100, 20)); this.maskedTextBox1.set_TabIndex(0); this.maskedTextBox1.set_TextMaskFormat(System.Windows.Forms.MaskFormat.IncludeLiterals); // // PhoneNumberBox // this.set_AutoScaleDimensions(new System.Drawing.SizeF(6F, 13F)); this.set_AutoScaleMode(System.Windows.Forms.AutoScaleMode.Font); this.get_Controls().Add(this.maskedTextBox1); this.set_Name("PhoneNumberBox"); this.ResumeLayout(false); this.PerformLayout(); } #endregion }

3.

No menu Build, escolha Build Solution. Criando Uma Fonte de Dados do Seu Banco de Dados

Esta etapa usa o Data Source Configuration Wizard para criar uma fonte de dados com base na tabela Customers, no banco de dados de exemplo Northwind. Voc deve ter acesso ao banco de dados de exemplo Northwind para criar a conexo. Para informaes sobre como configurar dados de exemplo Northwind, consulte COMO: Instalar Bancos de Dados de Exemplo.

Para criar a fonte de dados


1. 2. 3. 4.
o

No menu Data, clique em Show Data Sources. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type e clique Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind est disponvel na lista drop-down, selecione-o. Ou Selecione New Connection para iniciar a caixa de dilogo Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais e clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione a tabela Customers e clique Finish. O NorthwindDataSet adicionado ao seu projeto e a tabela Customers aparece na janela Data Sources. Definindo a Coluna de Telefone Para usar o Controle PhoneNumberBox

5. 6. 7. 8.

Dentro da janela Data Sources voc pode definir o controle a ser criado antes de arrastar itens para seu formulrio.

Visual C# Consolidado

952

Para definir a coluna telefone para vincular ao controle PhoneNumberBox


1. 2. 3. 4. 5. 6. Abra Form1 no designer. Expanda o n Customers na janela Data Sources. Clique na seta suspensa no n Customers e escolha Details a partir da lista controle. Clique na seta suspensa na coluna Phone e escolha Customize. Selecione o PhoneNumberBox da lista de Associated Controls na caixa de dilogo Data UI Customization Options. Clique na seta suspensa na coluna Phone e escolha PhoneNumberBox. Adicionando Controles ao Formulrio Voc pode criar os controles com dados vinculados, arrastando itens da janela Data Sources para o formulrio.

Para criar controles vinculados a dados no formulrio

Arraste o n Customers principal da janela Data Sources para o formulrio e verifique que o controle PhoneNumberBox usado para exibir os dados na coluna Phone. Controles com dados vinculados com rtulos descritivos aparecem no formulrio, juntamente com uma faixa de ferramenta (BindingNavigator) para navegar pelos registros. NorthwindDataSet, CustomersTableAdapter, BindingSource e BindingNavigator aparecem na bandeja do componente. Executando o Aplicativo

Para executar o aplicativo

Pressione F5 para executar o aplicativo. Prximas etapas

Dependendo dos seus requisitos de aplicativo, h vrias etapas que voc pode desejar executar depois de criar um controle que oferece suporte a vinculao de dados. Algumas etapas prximas tpicas incluem:

Colocar os controles personalizados em uma biblioteca de controle para voc poder reutiliz-los em outros aplicativos. Para obter mais informaes, consulte Windows Control Library Template. Criar controles que suportam o mais complexo cenrios de vinculao de dados. Para obter mais informaes, consulte Passo a passo: Criando um Controle de Usurio que Suporta Ligao de Dados Complexa e Passo a passo: Criando um Controle de Usurio que Suporta Pesquisa de Ligao de Dados. Consulte tambm

Passo a passo: Criando um Controle de Usurio que Suporta Ligao de Dados Complexa
Ao exibir dados em formulrios em aplicativos Windows, voc pode escolher os controles existentes do Toolbox, ou voc pode criar controles personalizados se seu aplicativo requer funcionalidade que no esto disponveis nos controles padro. Esta explicao passo a passo mostra como criar um controle que implementa o ComplexBindingPropertiesAttribute. Os controles que so implementados do ComplexBindingPropertiesAttribute contm o DataSource e que a

Visual C# Consolidado

953

propriedade DataMember pode ser vinculada aos dados. Esses controles so semelhantes aos um DataGridView ou ListBox. Para obter mais informaes sobre controle de criao, consulte Developing Windows Forms Controls at Design Time. Ao criar controles para uso em cenrios de ligao de dados ser preciso implementar um dos seguintes atributos de vinculao de dados: Uso do atributo DataBinding Implementar os simples controles DefaultBindingPropertyAttribute, como TextBox, que exibir uma nica coluna (ou propriedade) de dados. Para obter mais informaes, consulte Passo a passo: Criando um Controle de Usurio que Suporta Ligao de Dados Simples. Implementar os controle ComplexBindingPropertiesAttribute, como DataGridView, que exibem listas (ou tabelas) de dados. (Esse processo descrito nesta pgina de explicao passo a passo.) Implementar os controles LookupBindingPropertiesAttribute, como ComboBox, que exibir listas (ou tabelas) de dados, mas tambm precisa apresentar uma nica coluna ou propriedade. Para obter mais informaes, consulte Passo a passo: Criando um Controle de Usurio que Suporta Pesquisa de Ligao de Dados. Esta explicao passo a passo cria um controle que exibe linhas de dados de uma tabela complexa. Este exemplo usa a tabela Customers do banco de dados de exemplo Northwind. O complexo controle de usurio exibir a tabela Clientes no controle personalizado DataGridView. Durante esta explicao passo a passo, voc aprender como:

Criar um novo Windows Application. Adicionar um novo User Control para o projeto. Criar visualmente o controle de usurio. Implementar o atributo ComplexBindingProperty. Criar um dataset com o Assistente para Configurao da Fonte de Dados. Definir a tabela Customers no Janela de fontes de dados para usar os novos controle complexos. Adicionar o novo controle, arrastando o Data Sources Window no Form1. Pr-requisitos

A fim de concluir esta explicao passo a passo, ser necessrio:

Acesso ao banco de dados de exemplo Northwind. Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Criando um Aplicativo Windows

A primeira etapa para criar um Windows Application.

Para criar o novo projeto Windows Visual C# Consolidado 954

1. 2. 3.

No Visual Studio, a partir do menu File, crie um novo Project. Nomeie o projeto como ComplexControlWalkthrough. Selecione Windows Application e clique em OK. Para obter mais informaes, consulte Creating Windows-based Applications. O projeto ComplexControlWalkthrough criado e adicionado Solution Explorer. Adicionar um controle de usurio ao projeto

Devido esta explicao passo a passo criar um controle de ligao de dados complexa do User Control, voc deve adicionar um item User Control no projeto

Para adicionar um controle de usurio ao projeto


1. 2. No menu Project, escolha Add User Control. Digite ComplexDataGridView na rea Name, e clique Add. O controle ComplexDataGridView adicionado ao Solution Explorer e abre no designer. Criar o controle ComplexDataGridView Adicione a esta etapa um DataGridView para o controle de usurio

Para criar o controle ComplexDataGridView

Arraste um DataGridView na superfcie do design do controle de usurio do Toolbox Adicionando o atributo de vinculao de dados requerido

Para controles complexos que suportam a vinculao de dados, voc pode implementar o ComplexBindingPropertiesAttribute.

Para implementar o atributo ComplexBindingProperties


1. 2. Alterne o controle ComplexDataGridView para modo de exibio do Cdigo. (No menu View, selecione Code.) Substituir o cdigo em ComplexDataGridView com o seguinte: C#
using System.Windows.Forms; namespace CS { [System.ComponentModel.ComplexBindingProperties("DataSource", "DataMember")] public partial class ComplexDataGridView : UserControl { public object DataSource { get{ return dataGridView1.DataSource; } set{ dataGridView1.DataSource = value; } } public string DataMember { get{ return dataGridView1.DataMember; } set{ dataGridView1.DataMember = value; } } public ComplexDataGridView() { InitializeComponent(); } } }

J#
package JSL; /**@attribute System.ComponentModel.ComplexBindingProperties("DataSource", "DataMember") */ public class ComplexDataGridView extends System.Windows.Forms.UserControl { /**@property */ public Object get_DataSource() { return dataGridView1.get_DataSource(); } /**@property */ public void set_DataSource(Object value) { dataGridView1.set_DataSource(value); } /**@property */ public String get_DataMember() { return dataGridView1.get_DataMember(); } /**@property */ public void set_DataMember(String value) {

Visual C# Consolidado

955

dataGridView1.set_DataMember(value); } public ComplexDataGridView() { InitializeComponent(); } private System.Windows.Forms.DataGridView dataGridView1; private System.ComponentModel.IContainer components; #region Component Designer generated code protected void Dispose(boolean disposing) { if (disposing) { if (components != null) { components.Dispose(); } } super.Dispose(disposing); } private void InitializeComponent() { this.dataGridView1 = new System.Windows.Forms.DataGridView(); ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); this.SuspendLayout(); // // dataGridView1 // this.dataGridView1.set_ColumnHeadersHeightSizeMode(System.Windows.Forms.DataGridViewColu mnHeadersHeightSizeMode.AutoSize); this.dataGridView1.set_ImeMode(System.Windows.Forms.ImeMode.Disable); this.dataGridView1.set_Location(new System.Drawing.Point(16, 16)); this.dataGridView1.set_Name("dataGridView1"); this.dataGridView1.set_Size(new System.Drawing.Size(240, 150)); this.dataGridView1.set_TabIndex(0); // // ComplexDataGridView // this.set_AutoScaleDimensions(new System.Drawing.SizeF(6F, 13F)); this.set_AutoScaleMode(System.Windows.Forms.AutoScaleMode.Font); this.get_Controls().Add(this.dataGridView1); this.set_Name("ComplexDataGridView"); this.set_Size(new System.Drawing.Size(307, 205)); ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); this.ResumeLayout(false); } #endregion }

3.

No menu Build, escolha Build Solution. Crie uma fonte de dados no seu banco de dados

Esta etapa usa o Data Source Configuration Wizard para criar uma fonte de dados com base na tabela Customers, no banco de dados de exemplo Northwind. Voc deve ter acesso ao banco de dados de exemplo Northwind para criar a conexo. Para informaes sobre como configurar dados de exemplo Northwind, consulte COMO: Instalar Bancos de Dados de Exemplo.

Para criar a fonte de dados


1. 2. 3. 4.
o

No menu Data, clique em Show Data Sources. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type, e clique Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind est disponvel na lista suspensa, a selecione. OuSelecione New Connection para iniciar a caixa Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais, e clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione a tabela Customers, e clique Finish.

5. 6. 7. 8.

Visual C# Consolidado

956

O NorthwindDataSet adicionado ao seu projeto e a tabela Customers aparece na janela Data Sources. Definindo a tabela de Clientes para usar o controle ComplexDataGridView Dentro da janela Data Sources voc pode definir o controle a ser criado, antes de arrastar itens para seu formulrio.

Para definir a tabela de Clientes como vinculo do controle ComplexDataGridView


1. 2. 3. 4. 5. Abra o Form1 no designer. Expanda o n Customers na janela Data Sources. Clique na seta suspensa no n Customers e escolha Customize. No ComplexDataGridView selecione da lista de Associated Controls na caixa de dilogo Data UI Customization Options. Clique na seta suspensa na tabela Customers e escolha ComplexDataGridView a partir da lista de controle. Adicionar os controles ao formulrio Voc pode criar os controles com dados vinculados, arrastando itens da janela Data Sources para seu formulrio.

Para criar controles vinculados a dados no formulrio

Arraste o n principal Customers da janela Data Sources para o formulrio e verifique que o controle ComplexDataGridView usado para exibir os dados da tabela. Executando o aplicativo

Para executar o aplicativo

Pressione F5 para executar o aplicativo. Prximas etapas

Dependendo dos requisitos de seu aplicativo, h vrias etapas que voc pode desejar executar depois de criar um controle que suporta ligao de dados. Algumas prximas etapas tpicas incluem:

Colocar os controles personalizados em uma biblioteca de controle para voc possa reutiliz-los em outros aplicativos. Para obter mais informaes, consulte Windows Control Library Template. Criando controles que suportam cenrios de pesquisa. Para obter mais informaes, consulte Passo a passo: Criando um Controle de Usurio que Suporta Pesquisa de Ligao de Dados. Consulte tambm

Passo a passo: Criando um Controle de Usurio que Suporta Pesquisa de Ligao de Dados
Ao exibir dados no Windows Forms, voc pode escolher os controles existentes a partir da caixa de ferramentas, ou voc pode criar controles personalizados se seu aplicativo requer uma funcionalidade no disponvel nos controles padro. Esta explicao passo a passo mostra como criar um controle que implementa o LookupBindingPropertiesAttribute. Os controles que

Visual C# Consolidado

957

implementam o LookupBindingPropertiesAttribute pode conter trs propriedades que podem ser vinculadas a dados. Esses controles so semelhantes aos um ComboBox. Para obter mais informaes sobre a criao de controles, consulte Developing Windows Forms Controls at Design Time. Ao criar controles para uso em cenrios de ligao de dados voc precisar implementar um dos seguintes atributos do databinding: Uso do atributo DataBinding Implementar o DefaultBindingPropertyAttribute em controles simples, como o TextBox, que exibi uma nica coluna (ou propriedade) dos dados. Para obter mais informaes, consulte Passo a passo: Criando um Controle de Usurio que Suporta Ligao de Dados Simples. Implementar os controles ComplexBindingPropertiesAttribute, como o DataGridView, que exibe listas (ou tabelas) de dados. Para obter mais informaes, consulte Passo a passo: Criando um Controle de Usurio que Suporta Ligao de Dados Complexa. Implementar os controles no LookupBindingPropertiesAttribute, como o ComboBox, que exibi listas (ou tabelas) de dados, mas tambm necessrio para apresentar uma nica coluna ou propriedade (Esse processo descrito nesta pgina na explicao passo a passo.) Esta explicao passo a passo cria um controle de pesquisa que vincula dados de duas tabelas. Este exemplo usa as tabelas do banco de dados Northwind Customers e Orders. O controle pesquisa estar acoplado ao campo CustomerID da tabela Orders. Ele usar este valor para pesquisar o CompanyName na tabela Customers. Durante esta explicao passo a passo, voc aprender como:

Criar um novo Windows Application. Adicionar um novo User Control para o projeto. Criar visualmente o controle de usurio. Implementar o atributo LookupBindingProperty. Criar um dataset com o Assistente para Configurao da Fonte de Dados. Definir a coluna CustomerID na tabela Orders na janela Data Sources para usar o novo controle. Criar um formulrio para exibir dados no novo controle. Pr-requisitos

A fim de concluir este explicao passo a passo, ser necessrio:

Acesso ao banco de dados de exemplo Northwind. Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Criando um aplicativo Windows

A primeira etapa criar um Windows Application.

Para criar o novo projeto Windows Visual C# Consolidado 958

1. 2. 3.

No Visual Studio, a partir do menu File, crie um novo Project. Nome do projeto LookupControlWalkthrough. Selecione Windows Application e clique em OK. Para obter mais informaes, consulte Creating Windows-based Applications. O projeto LookupControlWalkthrough criado e adicionado Solution Explorer. Adicionar um controle de usurio ao projeto

Esta explicao passo a passo cria um controle de pesquisa User Control, para adicionar um item User Control ao projeto LookupControlWalkthrough

Para adicionar um controle de usurio ao projeto


1. 2. No menu Project, selecione Add User Control. Digite LookupBox na rea Name, e clique Add. O controle LookupBox adicionado ao Solution Explorer e abre no designer. Criar o controle LookupBox

Para criar o controle LookupBox

Arraste um ComboBox do Toolbox para a superfcie de design do controle de usurio. Adicionando o atributo de vinculao de dados requerido

Para os controles de pesquisa que suporta a vinculao de dados, voc pode implementar o LookupBindingPropertiesAttribute.

Para implementar o atributo LookupBindingProperties


1. 2. Alternar o controle LookupBox para modo de exibio do cdigo. (No menu View, escolha Code). Substitua o cdigo no LookupBox com o seguinte: C#
using System.Windows.Forms; namespace CS { [System.ComponentModel.LookupBindingProperties("DataSource", "DisplayMember", "ValueMember", "LookupMember")] public partial class LookupBox : UserControl { public object DataSource { get{ return comboBox1.DataSource; } set{ comboBox1.DataSource = value; } } public string DisplayMember { get{ return comboBox1.DisplayMember; } set{ comboBox1.DisplayMember = value; } } public string ValueMember { get{ return comboBox1.ValueMember; } set{ comboBox1.ValueMember = value; } } public string LookupMember { get{ return comboBox1.SelectedValue.ToString(); } set{ comboBox1.SelectedValue = value; } } public LookupBox() { InitializeComponent(); } } }

J#
package JSL; /**@attribute System.ComponentModel.LookupBindingProperties("DataSource", "DisplayMember", "ValueMember", "LookupMember") */ public class LookupBox extends System.Windows.Forms.UserControl { /**@property */ public Object get_DataSource() { return comboBox1.get_DataSource(); } /**@property */ public void set_DataSource(Object value) { comboBox1.set_DataSource(value); } /**@property */ public String get_DisplayMember() { return

Visual C# Consolidado

959

comboBox1.get_DisplayMember(); } /**@property */ public void set_DisplayMember(String value) { comboBox1.set_DisplayMember(value); } /**@property */ public String get_ValueMember() { return comboBox1.get_ValueMember(); } /**@property */ public void set_ValueMember(String value) { comboBox1.set_ValueMember(value); } /**@property */ public String get_LookupMember() { return comboBox1.get_SelectedValue().ToString(); } /**@property */ public void set_LookupMember(String value) { comboBox1.set_SelectedValue(value); } public LookupBox() { InitializeComponent(); } private System.Windows.Forms.TextBox DisplayMemberBox; private System.Windows.Forms.TextBox ValueMemberBox; private System.Windows.Forms.TextBox SelectedValueBox; private System.Windows.Forms.ComboBox comboBox1; private System.ComponentModel.IContainer components; #region Component Designer generated code protected void Dispose(boolean disposing) { if (disposing) { if (components != null) { components.Dispose(); } } super.Dispose(disposing); } private void InitializeComponent() { this.DisplayMemberBox = new System.Windows.Forms.TextBox(); this.ValueMemberBox = new System.Windows.Forms.TextBox(); this.SelectedValueBox = new System.Windows.Forms.TextBox(); this.comboBox1 = new System.Windows.Forms.ComboBox(); this.SuspendLayout(); // // DisplayMemberBox // this.DisplayMemberBox.set_Location(new System.Drawing.Point(14, 15)); this.DisplayMemberBox.set_Name("DisplayMemberBox"); this.DisplayMemberBox.set_Size(new System.Drawing.Size(100, 20)); this.DisplayMemberBox.set_TabIndex(0); // // ValueMemberBox // this.ValueMemberBox.set_Location(new System.Drawing.Point(14, 42)); this.ValueMemberBox.set_Name("ValueMemberBox"); this.ValueMemberBox.set_Size(new System.Drawing.Size(100, 20)); this.ValueMemberBox.set_TabIndex(1); // // SelectedValueBox // this.SelectedValueBox.set_Location(new System.Drawing.Point(14, 69)); this.SelectedValueBox.set_Name("SelectedValueBox"); this.SelectedValueBox.set_Size(new System.Drawing.Size(100, 20)); this.SelectedValueBox.set_TabIndex(2); // // comboBox1 // this.comboBox1.set_FormattingEnabled(true); this.comboBox1.set_Location(new System.Drawing.Point(14, 107)); this.comboBox1.set_Name("comboBox1"); this.comboBox1.set_Size(new System.Drawing.Size(121, 21)); this.comboBox1.set_TabIndex(3); // // LookupBox // this.set_AutoScaleDimensions(new System.Drawing.SizeF(6F, 13F)); this.set_AutoScaleMode(System.Windows.Forms.AutoScaleMode.Font); this.get_Controls().Add(this.comboBox1); this.get_Controls().Add(this.SelectedValueBox); this.get_Controls().Add(this.ValueMemberBox); this.get_Controls().Add(this.DisplayMemberBox); this.set_Name("LookupBox"); this.ResumeLayout(false); this.PerformLayout(); } #endregion }

3.

No menu Build, escolha Build Solution. Crie uma fonte de dados no seu banco de dados

Essa etapa cria uma fonte de dados usando o Data Source Configuration Wizard baseado nas tabelas Orders e Customers no banco de dados de exemplo Northwind. Voc deve ter acesso ao banco de dados de exemplo Northwind para criar a conexo. Para informaes sobre como configurar dados de exemplo Northwind, consulte COMO: Instalar Bancos de Dados de Exemplo.

Para criar a fonte de dados


1. 2. 3. No menu Data, clique em Show Data Sources. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type, e clique Next.

Visual C# Consolidado

960

4.
o

Na pgina Choose your Data Connection e siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind est disponvel na lista suspensa, selecione-a. OuSelecione New Connection para iniciar a caixa de dilogo Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais, e clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione as tabelas Customers e Orders, e clique Finish O NorthwindDataSet adicionado ao seu projeto e as tabelas Customers e Orders aparecem na janela do Data Sources Defini a coluna CustomerID da tabela Pedidos para usar o controle LookupBox

5. 6. 7. 8.

Dentro da janela Data Sources voc pode definir o controle a ser criado antes de arrastar itens para seu formulrio.

Definir vinculao da coluna CustomerID ao controle LookupBox


1. 2. 3. 4. 5. 6. 7. 8. Abra o Form1 no designer. Expanda o n Customers na janela Data Sources. Expanda o n Orders (aquele n Customers abaixo da coluna Fax). Clique na seta suspensa no n Orders e escolha Details a partir da lista de controle. Clique na seta suspensa na coluna CustomerID (no n Orders) e escolha Customize. Do LookupBox selecione a lista de Associated Controls na caixa de dilogo Data UI Customization Options. Clique em OK. Clique na seta suspensa na coluna CustomerID e escolha LookupBox. Adicione controles ao formulrio Voc pode criar os controles com dados vinculados, arrastando itens da janela Data Sources para Form1.

Para criar controles de dados vinculados no Windows Form

Arraste o n Orders da janela Data Sources para o Windows Form e verifique se o controle LookupBox est sendo utilizado para exibir os dados na coluna CustomerID. Vinculando o controle para pesquisar o CompanyName na tabela Customers

Para configurar as vinculaes de pesquisa

Selecione o n principal Customers na janela Data Sources e arraste- CustomerIDLookupBox. No Form1

Visual C# Consolidado

961

Configura a ligao de dados para exibir o CompanyName a partir do Customers e enquanto mantm o valor CustomerID da tabela Orders. Para obter mais informaes, consulte Como: Criar Tabelas de Pesquisa. Executando o aplicativo

Para executar o aplicativo


Pressione F5 para executar o aplicativo. Navegue em alguns registros e verifique se a CompanyName aparece no controle
LookupBox

Consulte tambm

Ligao de Objeto no Visual Studio


O Visual Studio fornece ferramentas em tempo de design para trabalharem com objetos personalizados (em oposio a Datasets e servios da Web) como a fonte de dados em seu aplicativo. O nico requisito de objetos personalizados para trabalharem com as ferramentas de design de dados no Visual Studio que o objeto precisa pelo menos de uma propriedade public. Nenhum construtor especfico ou atributos so necessrios a objetos personalizados para trabalharem com ferramentas tais como a janela Data Sources. Enquanto houver incontveis maneiras de implementar a lgica do aplicativo ao trabalhar com objetos como uma fonte de dados, existiro algumas poucas operaes padres que podem ser simplificadas usando os novos objetos TableAdapter gerados do Visual Studio. Esta pgina explica como implementar esses processos padres usando TableAdapters; ela no se destina a ser um guia de criao de seus objetos personalizados. Por exemplo, voc ir normalmente executar as seguintes operaes padres independentemente da implementao especfica de seus objetos, ou lgica do aplicativo:

Carregando dados em objetos (normalmente de um banco de dados) Criar uma coleo tipada de objetos Adio de objetos para uma coleo e remoo de objetos de uma coleo Exibir os dados de objeto aos usurios em um formulrio Alterao/edio de dados em um objeto Salvar dados a partir objetos de volta ao banco de dados Observao

Para melhor entender, e fornecer contexto para os exemplos nesta pgina, recomendvel que voc aperfeioe o seguinte: Passo-a-Passo: Conectando a dados em Objetos. Esta explicao passo a passo cria os objetos discutidos nesta pgina de ajuda. Carregando dados em objetos Para esse exemplo, voc carrega dados para os objetos usando TableAdapters. Por padro, TableAdapters so criados com dois tipos de mtodos que buscam dados de um banco de dados e preenchem tabelas de dados.

Visual C# Consolidado

962

O mtodo TableAdapter.Fill preenche uma tabela de dados existente com os dados retornados. O mtodo TableAdapter.GetData retorna uma nova tabela dados preenchida com dados.

A maneira mais fcil de carregar os objetos personalizados com dados chamar o mtodo TableAdapter.GetData, efetuar um loop atravs da coleo de linhas na tabela de dados retornados, e preencher cada objeto com os valores em cada linha. Voc pode criar um mtodo GetData que retorna uma tabela de dados preenchida para qualquer consulta adicionada a um TableAdapter. Observao Visual Studio nomeia as consultas TableAdapter Fill e GetData por padro, mas esses nomes podem ser alterados para qualquer nome de mtodo vlido. O exemplo a seguir mostra como percorrer as linhas de uma tabela de dados e preencher um objeto com dados: Para obter um exemplo de cdigo completo, consulte Passo-a-Passo: Conectando a dados em Objetos. C#
private void LoadCustomers() { NorthwindDataSet.CustomersDataTable customerData = customersTableAdapter1.GetTop5Customers(); foreach (NorthwindDataSet.CustomersRow customerRow in customerData) { Customer currentCustomer = new Customer(); currentCustomer.CustomerID = customerRow.CustomerID; currentCustomer.CompanyName = customerRow.CompanyName; if (customerRow.IsAddressNull() == false) { currentCustomer.Address = customerRow.Address; } if (customerRow.IsCityNull() == false) { currentCustomer.City = customerRow.City; } if (customerRow.IsContactNameNull() == false) { currentCustomer.ContactName = customerRow.ContactName; } if (customerRow.IsContactTitleNull() == false) { currentCustomer.ContactTitle = customerRow.ContactTitle; } if (customerRow.IsCountryNull() == false) { currentCustomer.Country = customerRow.Country; } if (customerRow.IsFaxNull() == false) { currentCustomer.Fax = customerRow.Fax; } if (customerRow.IsPhoneNull() == false) { currentCustomer.Phone = customerRow.Phone; } if (customerRow.IsPostalCodeNull() == false) { currentCustomer.PostalCode = customerRow.PostalCode; } if (customerRow.IsRegionNull() == false) { currentCustomer.Region = customerRow.Region; } LoadOrders(currentCustomer); customerBindingSource.Add(currentCustomer); } }

Criando uma coleo tipada de objetos Voc pode criar classes de coleo para os objetos ou usar as colees tipadas que so automaticamente fornecidas pelo BindingSource Component. Quando voc estiver criando uma classe de coleo personalizada para objetos, recomendvel que voc herde da BindingList. Essa classe genrica fornece funcionalidade para administrar sua coleo, bem como a capacidade de evocar eventos que enviam notificaes para a infraestrutura de vinculao de dados no Windows Forms. A coleo gerada automaticamente no BindingSource usa um BindingList para sua coleo tipada. Se seu aplicativo no requerer funcionalidade adicional, ento voc pode manter sua

Visual C# Consolidado

963

coleo dentro do BindingSource. Para obter mais informaes, consulte a propriedade List da classe BindingSource. Observao Se sua coleo exigir funcionalidade no fornecida pela implementao base do BindingList, ento voc deve criar uma coleo personalizada para que voc possa adicionar classe, conforme o necessrio. O cdigo a seguir mostra como criar a classe de uma coleo fortemente tipada de objetos Order: C#
/// <summary> /// A collection of Orders /// </summary> public class Orders: System.ComponentModel.BindingList<Order> { // Add any additional functionality required by your collection. }

Adicionando objetos a uma coleo Voc adiciona objetos a uma coleo chamando o mtodo Add de sua classe de coleo personalizada ou do BindingSource. Para obter um exemplo de como adicionar a uma coleo usando o BindingSource, consulte o mtodo LoadCustomers em Passo-a-Passo: Conectando a dados em Objetos Para obter um exemplo de como adicionar objetos a uma coleo personalizada, consulte o mtodo LoadOrders em Passo-a-Passo: Conectando a dados em Objetos. Observao O mtodo Add fornecido automaticamente para sua coleo personalizada quando voc herda do BindingList. O cdigo a seguir mostra como adicionar objetos a uma coleo tipada em um BindingSource: C#
Customer currentCustomer = new Customer(); customerBindingSource.Add(currentCustomer);

O cdigo a seguir mostra como adicionar objetos a uma coleo tipada que herda do BindingList: Observao Neste exemplo a coleo Orders uma propriedade do objeto Customer. C#
Order currentOrder = new Order(); currentCustomer.Orders.Add(currentOrder);

Removendo objetos de uma coleo

Visual C# Consolidado

964

Voc remove objetos de uma coleo, chamando o mtodo Remove ou RemoveAt de sua classe de coleo personalizada ou do BindingSource. Observao Os mtodos Remove e RemoveAt so fornecidos automaticamente para sua coleo personalizada quando voc herda do BindingList. O cdigo a seguir mostra como localizar e remover objetos da coleo tipada em um BindingSource com o mtodo RemoveAt: C#
int customerIndex = customerBindingSource.Find("CustomerID", "ALFKI"); customerBindingSource.RemoveAt(customerIndex);

Exibindo dados de objeto aos usurios Para exibir os dados em objetos para usurios, voc cria uma fonte de dados objeto usando o Assistente para Configurao da Fonte de Dados, e arrasta o objeto inteiro ou propriedades individuais para seu formulrio a partir da janela Data Sources. Para obter mais informaes sobre como criar uma fonte de dados objeto, consulte Como se conectar a dados em um objeto:. Para obter mais informaes sobre como exibir dados a partir de objetos no Windows Forms, consulte Exibir dados em formulrios em aplicativos do Windows. Modificando os dados nos objetos Para editar dados em objetos personalizados que so vinculados a dados para controles Windows Forms, basta editar os dados no controle acoplado (ou diretamente nas propriedades do objeto). A arquitetura de vinculao de dados ir atualizar os dados no objeto. Se seu aplicativo requerer o rastreamento de alteraes e recuo nas alteraes propostas para seus valores originais, ento voc deve implementar essa funcionalidade no seu modelo de objeto. Para exemplos de como tabelas de dados mantm-se informadas das alteraes propostas, consulte DataRowState, HasChanges, e GetChanges. Salvando dados em objetos de volta ao banco de dados Voc salva dados de volta para o banco de dados passando os valores de seu objeto para os mtodos DBDirect do TableAdapter. O Visual Studio cria mtodos DBDirect que podem ser executados diretamente no banco de dados. Esses mtodos no requerem objetos DataSet ou DataTable. Mtodo DBDirect do TableAdapter
TableAdapter.Insert

Descrio Adiciona novos registros a um banco de dados, permitindo que voc passe valores individuais de coluna como parmetros do mtodo.

Visual C# Consolidado

965

TableAdapter.Update

Atualizaes de registros existentes em um banco de dados. O mtodo Update aceita valores originais e a novos valores de coluna como parmetros do mtodo. Os valores originais so usados para localizar o registro original, e os novos valores so usados para atualizar esse registro. O mtodo TableAdapter.Update tambm usado para acomodar as alteraes em um dataset de volta ao banco de dados fazendo o DataSet, DataTable, DataRow, ou matriz de DataRows como parmetros do mtodo.

TableAdapter.Delete

Exclui registros existentes do banco de dados com base nos valores originais da coluna que foram passados como parmetros do mtodo.

Para salvar dados de uma coleo de objetos, percorra a coleo de objetos (por exemplo, usando um loop for-next) e envie os valores de cada objeto para o banco de dados usando mtodos DBDirect do TableAdapter. O exemplo a seguir mostra como usar o mtodo TableAdapter.Insert do DBDirect para adicionar um novo cliente diretamente ao banco de dados: C#
private void AddNewCustomers(Customer currentCustomer) { customersTableAdapter.Insert( currentCustomer.CustomerID, currentCustomer.CompanyName, currentCustomer.ContactName, currentCustomer.ContactTitle, currentCustomer.Address, currentCustomer.City, currentCustomer.Region, currentCustomer.PostalCode, currentCustomer.Country, currentCustomer.Phone, currentCustomer.Fax); }

Viso Geral da Edio de dados em DataSets


Editar os dados em um DataSet. o processo de manipular os dados reais nos objetos individuais DataTable que compem um DataSet Voc editar os dados nas tabelas de dados much ao editar o dados em uma tabela em qualquer banco de dados o processo pode incluir inserir, atualizar e excluindo registros na tabela. Alm de alterar para os dados reais, voc tambm pode consultar um DataTable. Para retornar linhas especficas de dados, por exemplo, indivduo linhas, verses especficas de (original e proposta), linhas somente que foram alterados, linhas e linhas com erros Tarefas tabela dados comuns A tabela a seguir fornece links para as tarefas comuns associados ao editar e consultar dados de um DataSet: Tarefa Inserir novos registros em uma tabela de dados. Atualizar registros existentes em uma tabela de dados. Excluir registros existentes Descrio Criar uma nova DataRow e adicion-la coleo de linhas da tabela. For more information, see Como adicionar linhas ao um DataTable. Atribua um valor diretamente para a coluna especfica de uma linha de dados. For more information, see Como editar linhas de uma DataTable:. Chame o Delete mtodo da linha de dados que deseja remover da

Visual C# Consolidado

966

de uma tabela de dados. Localize os registros alterados em uma tabela de dados. Acesso verses diferentes de uma linha em uma tabela de dados. Localize linhas com erros em uma tabela de dados.

tabela. For more information, see Como: Excluir linhas em uma DataTable. Chame o GetChanges mtodo de uma tabela de dados. For more information, see Como: Recuperar Linhas Alteradas. Acesso as colunas individuais de uma linha de dados por passagem em voc DataRowVersion deseja exibir. For more information, see Como: Obter Verses Especficas de um DataRow. Verificar a HasErrors propriedade de uma tabela de dados. For more information, see Como: Localizar linhas com erros:.

Viso geral sobre validao de dados


Validao de dados o processo que confirma que os valores so inseridos em objetos de dados de acordo com as restries do esquema de um DataSet, bem como as regras estabelecidas pelo seu aplicativo. Validar dados antes de enviar atualizaes para o banco de dados subjacente uma boa prtica que reduz erros bem como o nmero potencial de chamadas entre um aplicativo e o banco de dados. Voc pode confirmar se os dados que esto sendo gravados para um DataSet so vlidos, criando verificaes de validao para o prprio DataSet. O DataSet pode verificar se os dados no importando como a atualizao estiver sendo executada se diretamente pelos controles de um formulrio, de um componente, ou de alguma outra maneira. Porque o DataSet faz parte do seu aplicativo, ele um local lgico para criar validaes especficas do aplicativo (diferente de criar as mesma verificaes na camada final do banco de dados). Observao A localidade sugerida para adicionar validao para o aplicativo no arquivo da classe parcial do DataSet. No Visual Basic ou Visual C# abra o DataSet Designer e clique duas vezes na coluna ou tabela que voc deseja criar a validao. Esta ao cria automaticamente um manipulador de eventos ColumnChanging. ou RowChanging. Para obter mais informaes, consulte Como: Validar Dados Durante Alteraes de Linha ou Como: validar dados durante alteraes em coluna, Validando dados Validao em um DataSet pode ser realizada:

Criando sua prpria validao especfica do aplicativo que pode verificar dados durante alteraes em valores em uma coluna de dados individual. Para obter mais informaes, consulte Como: validar dados durante alteraes em coluna. Criando sua prpria validao especfica do aplicativo que pode verificar dados durante alteraes em valores enquanto um linha de dados inteira est sendo alterada. Para obter mais informaes, consulte Como: Validar Dados Durante Alteraes de Linha. Ao criar chaves, restries exclusivas, e assim por diante como parte da definio do esquema real do DataSet. Para obter mais informaes sobre incorporar validao na definio de esquema, consulte Como definir uma coluna de dados como a chave primria: e Como restringir uma coluna de dados contm valores exclusivos para:. Definindo as propriedades do objeto DataColumn como MaxLength, AllowDBNull e Unique

Visual C# Consolidado

967

H vrios eventos que so gerados pelo objeto DataTable quando uma alterao est ocorrendo em um registro:

Os eventos ColumnChanging e ColumnChanged so gerados durante e aps cada alterao em uma coluna individual. O evento ColumnChanging til quando voc deseja validar alteraes em colunas especficas. Informaes sobre a alterao proposta so passadas como um argumento para o evento. Para obter mais informaes, consulte Como: validar dados durante alteraes em coluna. Os eventos RowChanging e RowChanged so gerados durante e aps qualquer alterao em uma linha. O evento RowChanging mais geral, porque ele simplesmente indica que uma alterao est ocorrendo em algum lugar na linha; voc no souber qual coluna foi alterada. Para obter mais informaes, consulte Como: Validar Dados Durante Alteraes de Linha.

Por padro, cada alterao em uma coluna gera quatro eventos: Primeiro o evento ColumnChanging e ColumnChanged para a coluna especfica sendo alterada, e depois os eventos RowChanging e RowChanged se vrias alteraes forem sendo feitas para a linha, os eventos sero gerados para cada alterao. Observao O mtodo da linha de dados BeginEdit desliga os eventos RowChanging e RowChanged aps cada alterao de colunas individuais. Nesse caso, o evento no gerado at que o mtodo EndEdit tenha sido chamado, quando os eventos RowChanging. e RowChanged eventos so gerados apenas uma vez Para obter mais informaes, consulte Como: desativar restries ao preencher um DataSet. O evento que voc escolher depende de quo granulada seja a validao que voc deseja. Se ele for importante que voc atualize um erro imediatamente quando uma coluna for alterada, criando validao usando o evento ColumnChanging. Caso contrrio, use o evento RowChanging que pode resultar em captura de vrios erros ao mesmo tempo. Alm disso, se seus dados so estruturados de tal forma que o valor de uma coluna validada com base no contedo de outra coluna, ento voc deve executar a validao durante o evento RowChanging. Quando registros so atualizados, o objeto DataTable gera eventos que voc pode responder para as alteraes que esto ocorrendo e depois que as alteraes forem feitas. Se seu aplicativo estiver usando um DataSet tipado, voc pode criar manipuladores de eventos altamente tipados. Isso adicionar quatro eventos tipados que voc pode criar manipuladores; dataTableNameRowChanging, dataTableNameRowChanged, dataTableNameRowDeleting e dataTableNameRowDeleted. Esses manipuladores de eventos tipados passam um argumento que inclui o nome das colunas da tabela que tornam mais fcil para cdigo gravar e ler. Eventos de atualizao de dados Evento Descrio

ColumnChanging O valor em uma coluna est sendo alterado. O evento passa a linha e coluna para voc, juntamente com o novo valor proposto. ColumnChanged RowChanging O valor em uma coluna foi alterado. O evento passa a linha e coluna para voc, juntamente com o valor proposto. Alteraes feitas em um objeto DataRow esto prestes a serem confirmadas de volta para o DataSet. Se voc no tiver chamado o mtodo BeginEdit, o

Visual C# Consolidado

968

evento RowChanging gerado para cada alterao em uma coluna imediatamente aps o evento ColumnChanging que foi gerado. Se voc no chamou BeginEdit antes de fazer alteraes, o evento RowChanging gerado somente quando voc chamar o mtodo EndEdit. O evento passa a linha para voc e um valor indicando o tipo de ao (alterar, inserir, e assim por diante) que est sendo executada. RowChanged RowDeleting RowDeleted Uma linha foi alterada. O evento passa a linha para voc e um valor indicando o tipo de ao (alterar, inserir, e assim por diante) que est sendo executada. Uma linha est sendo excluda. O evento passa a linha para voc e um valor indicando o tipo de ao (Excluir) que est sendo executada. Uma linha foi excluda. O evento passa a linha para voc e um valor indicando o tipo de ao (Excluir) que est sendo executada.

Os eventos ColumnChanging, RowChanging e RowDeleting so gerados durante o processo de atualizao Voc pode utilizar esses eventos para validar dados ou executar outros tipos de processamento. Porque as atualizaes esto em processo durante esses eventos, possvel cancelar a atualizao, atravs de uma exceo, que impede a alterao que est sendo completada. Os eventos ColumnChanged, RowChanged e RowDeleted so eventos de notificao que so gerados quando uma atualizao foi concluda com xito. Esses eventos so teis quando voc desejar fazer outra ao com base em uma atualizao bem sucedida. Consulte tambm Tarefas

Passo a passo: Adicionando validao a um DataSet


Esta explicao passo a passo demonstra como validar dados quando alteraes so feitas aos dados em um dataset. Onde voc deve executar as verificaes de validao em seus dados dependente dos requisitos do seu aplicativo; para esta explicao passo a passo ns validamos dados durante as alteraes dos valores nas colunas individuais. Esta explicao passo a passo usa o evento ColumnChanging para verificar se um valor aceitvel est sendo inserido no registro. Se o valor no for vlido, um controle ErrorProvider exibido para o usurio. O exemplo tambm mostra como usar o Dataset Designer para criar uma classe parcial para o dataset. (A classe parcial onde os usurios podem adicionar cdigo para estender a funcionalidade do dataset gerado pelo Visual Studio. Ela no substituda se o dataset for regenerado.) Observao As caixas de dilogo e comandos de menu que voc vir podem diferir dos descritos na Ajuda dependendo das suas configuraes ativas ou da sua edio. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Visual Studio Settings. As tarefas ilustradas nesta explicao passo a passo incluem:

A criao de um novo projeto Windows Application. A criao e configurao de um dataset com o Assistente para Configurao da Fonte de Dados.

Visual C# Consolidado

969

A seleo do controle a ser criado no formulrio ao arrastar itens a partir da janela Data Sources. Para obter mais informaes, consulte Como: Definir o controle a ser criado quando arrastado da janela Data Sources:. A criao de um controle ligado a dados, arrastando itens da Janela de fontes de dados para seu formulrio. A criao de uma classe parcial para estender a funcionalidade do dataset. A criao de um manipulador de eventos para o evento ColumnChanging da tabela
OrderDetails.

A adio de validao para confirmar se a coluna Quantity contm valores maiores que 0. A exibio de um ErrorProvider Component (Windows Forms) para informar aos usurios que um controle ligado a dados contm valores invlidos. Pr-requisitos

Para seguir esta explicao passo a passo, voc precisa de:

Acesso ao banco de dados de exemplo Northwind. Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Criar um Novo Windows Application

Para criar o novo projeto Windows Application


1. 2. 3. No menu File, crie um novo projeto. Nomeie o projeto como ValidationWalkthrough. Selecione Windows Application e clique em OK. Para obter mais informaes, consulte Creating Windows-based Applications. O projeto ValidationWalkthrough criado e adicionado ao Solution Explorer. Criando uma Nova Fonte de Dados a partir de seu Banco de Dados

Para criar a fonte de dados


1. 2. 3. 4.
o

No menu Data, clique em Show Data Sources. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type, e clique em Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind estiver disponvel na lista suspensa, selecione-o. -ouSelecione New Connection para iniciar a caixa de dilogo Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais (include sensitive data), e clique em Next. Clique em Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione a tabela Order Details, e clique em Finish.

5. 6. 7. 8.

Visual C# Consolidado

970

O NorthwindDataSet adicionado ao seu projeto e a tabela OrderDetails aparece na janela Data Sources. Criando Controles ligados a Dados

Para criar controles ligados a dados no formulrio


1. 2. 3. Na janela Data Sources, selecione a tabela Order Details. Escolha Details na lista de controles da tabela. Arraste o n Order Details da janela Data Sources para Form1. Controles ligados a dados com rtulos descritivos aparecem no formulrio, juntamente com uma faixa de ferramentas (BindingNavigator) para registros de navegao. Controles ligados a dados com rtulos descritivos aparecem no formulrio, juntamente com uma faixa de ferramentas (BindingNavigator) para registros de navegao. Um NorthwindDataSet, Order_DetailsTableAdapter, BindingSource, e BindingNavigator aparecem na bandeja de componentes. Adicionando um Controle ErrorProvider ao Formulrio

Para configurar um controle ErrorProvider


1. 2. Arraste um ErrorProvider da Toolbox para o Form1. Na janela Properties, defina a propriedade DataSource do ErrorProvider como Order_DetailsBindingSource. Observao No defina a propriedade DataMember. Criando o Manipulador de Eventos ColumnChanging

Para criar os manipuladores de eventos de validao


1. 2. Abra o NorthwindDataSet no Dataset Designer. clicando duas vezes no arquivo NorthwindDataSet.xsd no Solution Explorer Clique duas vezes na coluna Quantity da tabela OrderDetails para criar o manipulador de eventos OrderDetailsDataTable_ColumnChanging. (Em C# somente classe parcial da tabela de dados ser criada.) Observao Um clique duplo no nome da tabela (Order Details na barra de ttulo.) cria um manipulador de eventos para o evento RowChanging. 3. Adicione cdigo para verificar se e.ProposedValue contem valores maiores que 0. Se o valor proposto for 0 ou menos, marque a coluna para indicar que ela contm um erro. Cole o cdigo a seguir no manipulador de eventos de alterao da coluna (columnchanging) sob o comentrio Add user code here : C#
if ((short)e.ProposedValue <= 0) { e.Row.SetColumnError("Quantity", "Quantity must be greater than 0"); } else { e.Row.SetColumnError("Quantity", ""); }

Testando o Aplicativo

Para testar o aplicativo Visual C# Consolidado 971

1. 2. 3. 4.

Pressione F5 para executar o aplicativo. Altere o valor na caixa de texto Quantity para 0. Pressione TAB para mover o foco para fora da caixa de texto. O cone do provedor de erros (error provider) aparecer. Posicione o ponteiro do mouse sobre o provedor de erros para ver a mensagem. Prximas etapas

Dependendo dos seus requisitos de aplicativo, h vrias etapas que voc pode desejar executar aps adicionar validao. Alguns aprimoramentos que voc pode fazer a esta explicao passo a passo incluem:

Adicionar funcionalidade para enviar atualizaes de volta para o banco de dados. Para obter mais informaes, consulte Passo-a-Passo: Salvando Dados para um Banco de Dados (Tabela Simples). Editar o dataset para adicionar ou remover objetos de banco de dados. Para obter mais informaes, consulte Como editar um DataSet:.

Viso Geral do Salvar dados


Como um dataset efetivamente um cache uma cpia em memria dos dados, o processo de gravar informaes para a fonte de dados original separado do processo de modificar os dados no dataset. Voc pode enviar dados atualizados no datasets de volta para o banco de dados chamando um dos mtodos Update de um TableAdapter ou chamando um dos mtodos DBDirect do TableAdapter. Para obter mais informaes sobre o envio das alteraes em um dataset de volta para o banco de dados, consulte Como: atualizar dados usando um TableAdapter e Como salvar alteraes DataSet em um banco de dados:. Para informaes sobre como modificar dados no dataset, consulte Editar dados no seu aplicativo. Atualizaes de Dois Estgios Atualizar uma fonte de dados por meio de um dataset um processo de duas etapas. A primeira etapa atualizar o dataset com novas informaes novos registros, registros alterados ou registros excludos. Se seu aplicativo est relacionado somente com o dataset por exemplo, aps atualizar o dataset, voc o envia para outro aplicativo que ir executar mais processamento do dataset ento voc est terminando a atualizao. Observao No Windows Forms, a arquitetura de vinculao de dados cuida do envio de alteraes dos controles com dados vinculados ao dataset e voc no precisa claramente atualizar o dataset com seu prprio cdigo. Para obter mais informaes, consulte Windows Forms Data Binding. Se voc estiver atualizando uma fonte de dados (como um banco de dados), a segunda etapa enviar as alteraes do dataset para fonte de dados original. Isto , o processo de atualizao o dataset tambm no grava as alteraes a uma fonte de dados base; voc deve executar essa segunda etapa explicitamente. Voc normalmente faz isso chamando o mtodo Update do mesmo TableAdapter (ou adaptador de dados) que voc usou para preencher o dataset, embora tambm

Visual C# Consolidado

972

possa usar adaptadores diferentes, por exemplo, para mover dados de uma fonte de dados para outra ou para atualizar vrias fontes de dados. Processo de atualizao de dois estgios e a funo do DataRowVersion em uma atualizao bem sucedida

Estruturalmente, um dataset torna dados disponveis como conjuntos de colees. Datasets contm colees de tabelas. Tabelas contm colees de linhas. Tabelas so expostas como uma coleo do objeto DataSet e registros esto disponveis na coleo Rows de objetos DataTable. Fazer alteraes dos dados em um dataset por simples manipulao dessas colees usando mtodos de coleo de base possvel, mas se voc pretende atualizar uma fonte de dados subjacente voc deve usar os mtodos especificamente projetados para modificao de dataset. Por exemplo, para remover um registro de uma tabela de dados, voc poderia chamar o Mtodo RemoveAt da coleo Rows da tabela, que fisicamente exclui o registro do dataset. Se voc estiver usando o dataset somente como um armazenamento estruturado para dados e no estiver preocupado em transmitir mudana de informaes para um outro aplicativo, manipular colees dessa maneira um modo aceitvel de atualizao um dataset. Entretanto, se voc pretende enviar alteraes para uma fonte de dados ou outro aplicativo, voc precisar manter informaes de alteraes (isto , metadados) sobre cada atualizao. Posteriormente, quando voc enviar alteraes para a fonte de dados ou aplicativo, o processo ter as informaes necessrias para localizar e atualizar os registros adequados. Por exemplo, se voc excluir um registro no dataset, informaes sobre o registro excludo devem ser mantidas no dataset. Dessa forma, quando o DeleteCommand do TableAdapter chamado, h informaes suficientes para localizar o registro original em uma fonte de dados para que este possa ser excludo. Para obter mais informaes, consulte " Mantendo Informaes Sobre Alteraes " abaixo. Mesclando DataSets

Visual C# Consolidado

973

Voc pode atualizar o contedo de um dataset mesclando isto , copiando o contedo de um dataset (chamado de dataset origem) para o dataset chamado (referido como o dataset destino). Quando voc mescla datasets, novos registros na fonte do dataset so adicionados para o dataset destino. Alm disso, colunas extras do dataset fonte so adicionadas ao dataset destino. Mesclar datasets particularmente til quando voc tiver um dataset local e obter um segundo dataset de outro aplicativo ou de um componente como um XML Web Services. Tambm til quando voc precisa integrar dados de vrios datasets. Quando datasets so mesclados, tambm possvel passar um argumento booleano opcional (preserveChanges) que informa ao mtodo Merge se deseja manter modificaes existentes no dataset destino. Como datasets mantm vrias verses de registros, importante ter em mente que mais de uma verso dos registros est sendo mesclada. A tabela a seguir ilustra um registro em dois datasets que sero mesclados: DataRowVersion Original Atual DataSet destino James Wilson Jim Wilson DataSet origem James C. Wilson James C. Wilson

Chamar o mtodo Merge na tabela acima com preserveChanges=false targetDataset.Merge(sourceDataset) resulta no seguinte: DataRowVersion Original Atual DataSet destino James C. Wilson James C. Wilson DataSet origem James C. Wilson James C. Wilson

Chamar o mtodo Merge com preserveChanges = true targetDataset.Merge(sourceDataset, true) resulta no seguinte: DataRowVersion Original Atual Cuidado No cenrio preserveChanges = true, se o mtodo RejectChanges for chamado em um registro no dataset destino, ento ele reverter para os dados originais do dataset origem. Isso significa que se voc tentar atualizar a fonte de dados original com o dataset destino, ele pode no ser capaz de localizar a linha original para atualizar. Entretanto, voc pode impedir uma violao simultnea preenchendo outro dataset com os registros atualizados a partir da fonte de dados e, ento, executar uma mesclagem impedindo uma violao simultnea. (Uma violao simultnea ocorre quando outro usurio modifica um registro na fonte de dados aps o dataset ter sido preenchido). Para obter mais informaes, consulte Controle de concorrncia no ADO.NET. Restries de Atualizao Para fazer alteraes em um linha de dados existente, voc adiciona ou atualiza dados nas colunas individuais. Se o dataset contiver restries (como chaves externas ou restries noanulveis), possvel que voc atualize um registro aps voc ter terminado de atualizar uma coluna, mas antes que voc obtenha a prxima o registro pode temporariamente estar em um estado de erro. DataSet destino James C. Wilson Jim Wilson DataSet origem James C. Wilson James C. Wilson

Visual C# Consolidado

974

Para evitar violaes de restrio voc pode temporariamente suspender restries de atualizao. Isso serve para duas finalidades:

Ela impede que um erro seja jogado quando voc atualiza uma coluna antes de obter a outra coluna. Ele suspende determinados eventos de atualizao de serem elevados (eventos que so freqentemente usados para validao).

Aps a concluso de uma atualizao, voc pode reativar a restrio de verificao, que tambm reativa eventos de atualizao e os aumenta. Observao No Windows Forms, a arquitetura de vinculao de dados incorporados ao DataGrid suspende a restrio de verificao at que o foco mova para fora de uma linha e voc no precisa chamar explicitamente os mtodos BeginEdit, EndEdit ou CancelEdit. Restries so automaticamente desativadas quando o mtodo Merge chamado em um dataset. Quando a mesclagem estiver concluda, se houver qualquer restrio sobre o dataset que no possa ser ativado, ento uma ConstraintException ser lanada. Nesta situao, a propriedade EnforceConstraints definida para false e todas as violaes de restrio devem ser resolvidas antes de redefinir a propriedade EnforceConstraints para true. Aps a concluso de uma atualizao, voc pode reativar a restrio de verificao, que tambm reativa eventos de atualizao e os aumenta. Para obter mais informaes sobre suspenso de eventos, consulte Como: desativar restries ao preencher um DataSet. Erros de Atualizao de DataSet Quando voc atualiza um registro em um dataset, h a possibilidade de um erro. Por exemplo, voc pode inadvertidamente gravar dados em uma coluna que do tipo de dados errado ou muito longo ou que tenha algum outro problema de integridade. Alm disso, voc pode ter verificaes de validao especficas do aplicativo que podem elevar a erros personalizados durante qualquer estgio de um evento de atualizao. Para obter mais informaes, consulte Viso geral sobre validao de dados. Manter Informaes Sobre Alteraes As informaes sobre as alteraes em um dataset so mantidas de duas maneiras: por sinalizar a linha que indica se ele foi alterado (RowState) e por manter vrias cpias de um registro (DataRowVersion). Usando essas informaes, processos podem determinar o que foi alterado no dataset e podem enviar atualizaes apropriadas para a fonte de dados.

Propriedade RowState
A propriedade RowState de um objeto DataRow um valor que fornece informaes sobre o status de uma linha especfica de dados. A tabela a seguir detalha os possveis valores da enumerao DataRowState: Descrio

Valor de

Visual C# Consolidado

975

DataRowState Added A linha foi adicionada como um item a um DataRowCollection. (Uma linha nesse estado no tem uma verso original correspondente desde que no existia no momento que o ltimo mtodo AcceptChanges foi chamado). A linha foi excluda usando o Delete de um objeto DataRow. A linha tinha sido criada mas no faz parte de qualquer DataRowCollection. Um objeto DataRow est neste estado imediatamente aps ele ter sido criado e antes de ser adicionado a uma coleo ou se ele tiver sido removido de uma coleo. Um valor de coluna na linha foi alterado de alguma maneira. A linha no foi alterada desde que AcceptChanges foi chamado pela ltima vez.

Deleted Detached

Modified Unchanged

Enumerao DataRowVersion
Datasets mantm vrias verses de registros. A enumerao DataRowVersion de um objeto DataRow um valor que pode ser usado para retornar uma verso especfica de um objeto DataRow. A tabela a seguir detalha os possveis valores da enumerao DataRowVersion: Valor de DataRowVersion Current

Descrio A verso atual de um registro contm todas as modificaes executadas no registro desde a ltima vez que AcceptChanges foi chamado. Se a linha foi excluda no h verso atual. O valor padro de um registro, conforme definido pelo esquema do dataset ou fonte de dados. A verso original de um registro uma cpia do registro como ele nas ltimas alteraes foram confirmadas no dataset. Em termos prticos, isso normalmente a verso de um registro como lida de uma fonte de dados. A verso de um registro que est disponvel temporariamente, enquanto voc est no meio de uma atualizao ou seja, entre o momento voc chamou o mtodo BeginEdit e o mtodo EndEdit. Voc normalmente acessa a verso de um registro em um manipulador para um evento como RowChanging. Chamar o mtodo CancelEdit inverte as alteraes e exclui a verso da linha de dados proposta.

Default

Original

Proposed

Visual C# Consolidado

976

As verses originais e atuais so teis quando informaes de atualizao so transmitidas para uma fonte de dados. Normalmente, quando uma atualizao enviada para a fonte de dados, as novas informaes para o banco de dados esto na verso atual de um registro. Informaes da verso original so usadas para localizar o registro para atualizar. Por exemplo, no caso onde a chave primria de um registro for alterada, voc deve ter uma maneira de localizar o registro adequado em uma fonte de dados, para atualizar as alteraes. Se nenhuma verso original existisse, o registro provavelmente seria anexado fonte de dados, resultando no apenas em um registro extra indesejado, mas em um registro que est impreciso e desatualizado. As duas verses tambm so usados no controle de simultaneidade; voc pode comparar a verso original contra um registro na fonte de dados para determinar se o registro foi alterado desde que foi carregado no dataset. Para obter mais informaes, consulte Controle de concorrncia no ADO.NET. A verso proposta til quando voc precisa realizar validao antes de realmente confirmar as alteraes para o dataset. Mesmo se registros tiverem sido alterados, no h sempre verses originais ou atuais de linha. Quando voc insere uma nova linha na tabela, no h nenhuma verso original, somente a verso atual. Da mesma forma, se voc excluir uma linha, chamando o mtodo Delete da tabela, h uma verso original, mas nenhuma verso atual. Voc pode testar para ver se uma verso especfica de um registro existe consultando a propriedade HasVersion de uma linha de dados. Voc pode acessar tanto a verso de um registro, passando um valor de enumerao DataRowVersion como um argumento opcional quando voc solicitar o valor de uma coluna. Obter Registros Alterados comum que voc no atualize cada registro em um dataset. Por exemplo, um usurio pode estar funcionando com um controle Windows Forms DataGridView que exibe vrios registros. Entretanto, o usurio pode atualizar apenas alguns registros, excluir um, e inserir um novo nome. Datasets e tabelas de dados fornecem um mtodo (GetChanges) para retornar somente as linhas que foram modificadas Voc pode criar subconjuntos de registros alterados usando o mtodo GetChanges de uma tabela de dados (GetChanges) ou do DataSet prprio (GetChanges). Se voc chamar o mtodo para a tabela de dados, ela retornar uma cpia da tabela com apenas os registros alterados. Da mesma forma, se voc chamar o mtodo no dataset, voc ter um novo dataset com apenas registros alterados. GetChanges por si s retornar todos os registros alterados. Em contraste, passando o desejado DataRowState como um parmetro para o mtodo GetChanges, voc pode especificar o subconjunto de registros alterados que voc deseja: registros recm-adicionados, registros marcados para excluso, registros separados, ou registros modificados. Obter um subconjunto de registros alterados especialmente til quando voc deseja enviar registros para outro componente para processamento. Em vez de enviar o dataset inteiro, voc pode reduzir a sobrecarga de se comunicar com o outro componente por meio somente os registros que o componente precisa. Para obter mais informaes, consulte Como: Recuperar Linhas Alteradas. Confirmar Alteraes no DataSet Como as alteraes so feitas no dataset, a propriedade RowState de linhas alteradas est definida. As verses originais e atuais de registros so estabelecidas e mantidas e disponibilizadas para voc pela propriedade RowVersion. Os metadados armazenados nessas propriedades representam as alteraes que so necessrias para enviar as atualizaes adequadas para a fonte de dados.

Visual C# Consolidado

977

Se as alteraes refletem o estado atual da fonte de dados, voc no mais precisa manter essas informaes. Normalmente, existem duas vezes quando o dataset e sua fonte esto em sincronizao:

Imediatamente aps voc ter carregado informaes para o dataset, como quando voc l dados da fonte. Aps enviar alteraes do dataset para a fonte de dados (mas no antes, porque voc pode perder as informaes necessrias para enviar alteraes para o banco de dados).

Voc pode confirmar as alteraes pendentes para o dataset chamando o mtodo AcceptChanges. Normalmente, AcceptChanges deve ser chamado nos prximos momentos em seu aplicativo.

Depois que voc carregou o dataset. Se voc carregar um dataset chamando o mtodo Fill do TableAdapter, ento o adaptador confirma automaticamente as alteraes para voc. Entretanto, se voc carregar um dataset, mesclando outro dataset para ele, ento voc ter que confirmar as alteraes manualmente. Observao Voc pode impedir que o adaptador confirme automaticamente as alteraes ao chamar o mtodo Fill, definindo a propriedade AcceptChangesDuringFill do adaptador para false. Se ele estiver definido para false, ento o RowState de cada linha inserida durante o preenchimento definido como Added

Aps voc ter enviado alteraes do dataset para outro processo, como um XML Web Service. Cuidado Confirmar a alterao dessa maneira apaga qualquer mudana da informao. No confirmar alteraes at depois que voc tiver efetuado quaisquer operaes no qual seu aplicativo depende em saber quais alteraes foram feitas no dataset.

Esse mtodo realiza o seguinte:


Grava a verso de um registro Current em sua verso Original, substituindo a verso original. Remove qualquer linha cuja propriedade RowState definida como Deleted. Define a propriedade de um registro RowState para Unchanged.

O mtodo AcceptChanges est disponvel em trs nveis. Voc pode cham-lo em um objeto DataRow, que confirma as alteraes para apenas aquela linha. Voc tambm pode cham-lo em um objeto DataTable para confirmar todas as linhas em uma tabela ou no objeto DataSet para confirmar todas as alteraes pendentes em todos os registros de todas as tabelas do dataset. A tabela a seguir descreve quais alteraes so confirmadas com base em qual objeto o mtodo chamado. Mtodo Resultado

Visual C# Consolidado

978

DataRow.AcceptChanges

Alteraes so confirmadas somente sobre a linha especfica Alteraes so confirmadas em todas as linhas na tabela especfica Alteraes so confirmadas em todas as linhas em todas as tabelas do dataset

DataTable.AcceptChanges

DataSet.AcceptChanges

Observao Se voc carregar um dataset chamando o mtodo Fill do TableAdapter, voc no tem que explicitamente aceitar alteraes; por padro o mtodo Fill chama o mtodo AcceptChanges quando ele tiver terminado de preencher a tabela de dados. Um mtodo relacionado, RejectChanges, desfaz o efeito das alteraes por copiar a verso de volta Original para a verso Current dos registros e configurar o RowState de cada registro de volta a Unchanged. Validao de Dados A fim de verificar que os dados em seu aplicativo atendem aos requisitos dos processos que passado, voc freqentemente precisa adicionar validao. Isso pode envolver verificao que uma entrada do usurio em um formulrio est correta, validao de dados enviados para seu aplicativo por outro aplicativo ou mesmo verificar que informaes calculadas no seu componente se enquadra nas restries de sua fonte de dados e aplicativos requeridos. Voc pode validar dados de vrias maneiras:

Na camada comercial, adicionando o cdigo a seu aplicativo para validar dados. O dataset um local que voc pode fazer isso. O dataset fornece algumas das vantagens de validao back-end como a capacidade para validar alteraes como valores de coluna e linha alteradas. Para obter mais informaes, consulte Viso geral sobre validao de dados. Na camada de apresentao, adicionando validao a formulrios. Para obter mais informaes, consulte User Input Validation in Windows Forms (Windows Forms). No back-end de dados, enviando dados para a fonte de dados por exemplo, o banco de dados e permitindo que ele aceite ou rejeite os dados. Se voc estiver trabalhando com um banco de dados que tem recursos sofisticados para validao de dados e fornecimento de informaes de erro, isso pode ser uma abordagem prtica porque voc pode validar os dados no importando de onde ele vem. Entretanto, ele pode no acomodar requisitos especficos de aplicativo de validao. Alm disso, tendo a fonte de dados validada, dados podem resultar em vrias viagens fonte de dados, dependendo de como seu aplicativo facilita em resolver erros de validao elevados pelo back-end. Observao de segurana Ao usar comandos de dados com uma propriedade CommandType definida como Text, cuidadosamente verifique informaes que so enviadas de um cliente antes de pass-la para seu banco de dados. Usurios mal intencionados podem tentar para enviar (inserir) instrues SQL modificadas ou adicionais em um esforo para obter acesso no autorizado ou danificar o

Visual C# Consolidado

979

banco de dados. Antes de voc transferir a entrada do usurio a um banco de dados, voc deve verificar se as informaes so vlidas; a melhor prtica para sempre usar consultas parametrizadas ou procedimentos armazenados quando possvel. Para obter mais informaes, consulte Viso Geral Sobre Scripts Maliciosos. Aps terem sido feitas alteraes em um dataset, voc pode transmitir as alteraes em uma fonte de dados. Mais comumente, faa isso chamando o mtodo Update de um TableAdapter (ou adaptador de dados). O mtodo loops a cada registro em uma tabela de dados, determina que tipo de atualizao necessria (atualizar, inserir ou excluir), se houver, e, ento, executa o comando apropriado. Como Uma Atualizao Transmitida Fonte de Dados Como uma ilustrao da como atualizaes so feitas, suponha que o seu aplicativo utilize um dataset contendo uma nica tabela de dados. O aplicativo busca duas linhas do banco de dados. Aps a recuperao, a tabela de dados na memria tem esta aparncia:
(RowState) CustomerID Name Status (Unchanged) c200 Robert Lyon Good (Unchanged) c400 Nancy Buchanan Pending

Seu aplicativo altera o status de Nancy Buchanan para " Preferred ". Como resultado desta alterao, o valor da propriedade RowState para aquela linha altera de Unchanged para Modified. O valor da propriedade RowState para a primeira linha permanece Unchanged. A tabela de dados agora tem esta aparncia:
(RowState) CustomerID Name Status (Unchanged) c200 Robert Lyon Good (Modified) c400 Nancy Buchanan Preferred

Seu aplicativo agora chama o mtodo Update para transmitir o dataset para o banco de dados. O mtodo inspeciona cada linha por vez. Para a primeira linha, o mtodo no transmite Instruo SQL para o banco de dados, porque essa linha no foi alterada desde que foi originalmente procurada no banco de dados. Para a segunda linha, no entanto, o mtodo Update automaticamente chama o comando de dados adequado e o transmite para o banco de dados. A sintaxe especfica da instruo SQL depende do dialeto do SQL suportado para o armazenamento de dados subjacente. Mas os seguintes traos gerais de instruo do SQL transmitidos so os que valem a pena observar:

A instruo SQL transmitida uma declarao UPDATE. O adaptador sabe usar uma propriedade UPDATE, porque o valor da propriedade RowState Modified. A instruo SQL transmitida inclui uma clusula WHERE indicando que o destino da declarao UPDATE a linha cujo CustomerID = 'c400'. Esta parte da declarao SELECT distingue a linha de destino de todas as outras porque CustomerID a chave primria da tabela de destino. As informaes para a clusula WHERE so derivadas da verso original do registro (DataRowVersion.Original), no caso de os valores necessitarem identificar a linha que foi alterada. A instruo SQL transmitida inclui a clusula SET, para definir os novos valores das colunas modificadas. Observao Se a propriedade UpdateCommand do TableAdapter tiver sido definida com o nome de um

Visual C# Consolidado

980

procedimento armazenado, o adaptador no constri uma instruo SQL. Em vez disso, ele chama o procedimento armazenado com os parmetros apropriados passados. Passando Parmetros Valores de registros a serem atualizados no banco de dados so passados usando parmetros. Quando o mtodo Update do TableAdapter executa uma declarao UPDATE, ele precisa preencher os valores de parmetro. Ele obtm esses valores da coleo Parameters para o comando de dados apropriados neste caso, o objeto UpdateCommand na TableAdapter. Se voc tiver usado ferramentas do Visual Studio para gerar um adaptador de dados, o objeto UpdateCommand conter um conjunto de parmetros que corresponde a cada espao reservado do parmetro na declarao. A propriedade SqlParameter.SourceColumn de cada parmetro aponta para uma coluna na tabela de dados. Por exemplo, a propriedade SourceColumn para os parmetros au_id e Original_au_id estiverem definidos como qualquer coluna na tabela de dados contm o autor do ID. Quando o adaptador do mtodo Update executa, ele l o autor coluna ID do registro sendo atualizado e preenche os valores na declarao Em uma declarao UPDATE, voc precisa especificar os dois novos valores (aqueles que sero gravados para o registro), bem como os antigos valores (para que o registro a ser atualizado possa estar localizado no banco de dados). H, portanto, dois parmetros para cada valor: um para a clusula SET e um cone diferente para a clusula WHERE. Os dois parmetros lem dados do registro sendo atualizado, mas eles obtm verses diferentes do valor da coluna com base no parmetro da propriedade SqlParameter.SourceVersion. O parmetro para a clusula SET obtm a verso atual e o parmetro para a clusula WHERE obtm a verso original. Observao Voc tambm pode definir valores na coleo Parameters no cdigo, que normalmente voc deseja fazer em um manipulador de eventos para o adaptador de dados do evento RowChanging. Para obter mais informaes, consulte Parmetros de comandos Adapter Data-. Atualizando Tabelas Relacionadas Se o dataset contiver vrias tabelas, voc precisa atualiz-las individualmente chamando o mtodo Update de cada adaptador de dados separadamente. Se as tabelas tm uma relao paifilho, provvel que voc ter que enviar atualizaes para o banco de dados em uma ordem especfica. Um cenrio comum que voc adicionou pai e o filho relacionado gravados para um dataset por exemplo, um novo registro do cliente e um ou mais registros relacionados. Se o prprio banco de dados est impondo regras de integridade relacional, ele aumentar erros se voc enviar o novo registro filho para o banco de dados antes que o registro pai tiver sido criado. Inversamente, se voc excluir registros relacionados no dataset, geralmente voc ter para que atualizaes na ordem inversa: tabela filho primeiro, depois tabela pai. Caso contrrio, provvel que o banco de dados que gere um erro porque as regras de integridade referencial impediro voc de excluir um registro pai enquanto ainda existem registros filho relacionados.

Uma regra geral para enviar atualizaes para tabelControle

de concorrncia no

ADO.NET

Visual C# Consolidado

981

Controle concorrente o processo usado para identificar e resolver atualizaes dos dados que so feitas por vrios usurios simultaneamente. Os tpicos a seguir explicam mtodos comuns para controle concorrente, bem como recursos ADO.NET especficos para manipular erros concorrentes. as relacionadas a seguir nesta ordem: 1. 2. 3. 4. Tabela filho: excluir registros. Tabela pai: inserir, atualizar e excluir registros. Tabela filho: inserir e atualizar registros. Para obter mais informaes, consulte Passo-a-Passo: salvando dados a um banco de dados (vrias tabelas).

Controle de Concorrncia Como datasets so desconectados da fonte de dados, no mantenha bloqueios em registros na fonte de dados. Portanto, se voc deseja atualizar o banco de dados, e se ele for importante para seu aplicativo para manter controle de simultaneidade, voc deve reconciliar registros no dataset com aqueles no banco de dados. Por exemplo, voc pode localizar registros no banco de dados que foram alterados desde o ltimo preenchimento do dataset. Nesse caso, voc deve executar aplicao-apropriada lgica para especificar o que acontece com o registro de banco de dados ou com o registro alterado que voc tem em sua dataset. Para obter mais informaes, consulte Controle de concorrncia no ADO.NET.

Introduo ao CONCURRENCY dados em ADO.NET


Quando usurios mltiplos tentar para modificar dados ao mesmo tempo, controles precisar ser estabelecida para impedir modificaes de um usurio de afetar negativamente modificaes de usurios simultneos. O sistema de manipular o que acontece nessa situao chamado controle de simultaneidade. Tipos de controle CONCURRENCY Em geral, h trs maneiras comuns para gerenciar simultaneidade em um banco de dados:

Controle de simultaneidade pessimista uma linha indisponvel aos usurios a partir da hora do registro so vasculhados at que ele seja atualizada no banco de dados. Controle concorrncia otimista Linha indisponvel para outros usurios somente enquanto os dados est realmente sendo atualizados. A atualizao examina a linha no banco de dados e determina se qualquer alterao tiver sido feita. Tentativa de atualizar um registro que j tenha sido alterado resulta em uma violao de concorrncia. " ltima no WINS " Linha indisponvel para outros usurios somente enquanto os dados est realmente sendo atualizados. No entanto, nenhum esforo feita para comparar atualizaes contra o registro original; o registro simplesmente gravado out, potencialmente sobrescrever qualquer alterao feita por outros usurios desde voc atualizou os registros pela ltima vez.

CONCURRENCY pessimista Simultaneidade pessimista normalmente usado para dois motivos. Primeiro, em algumas situaes, no alta conteno dos mesmos registros. O custo de colocando bloqueios sobre os dados menor que o custo de reverter alteraes quando ocorrerem conflitos simultaneidade.

Visual C# Consolidado

982

Simultaneidade pessimista tambm til para situaes onde ela seja detrimental para o Registro para alterar durante o curso de uma transao. Um bom exemplo um aplicativo de estoque. Considere um representante empresa verificao estoque de um cliente potencial. Normalmente voc deseja bloquear o registro at que um pedido seja gerada, que deseja sinalizar o item com um status de ordenada e remov-lo do estoque disponvel Geralmente. Se nenhuma ordem gerado, o bloqueio seria ser liberado para que outros usurios verificando estoque comear uma contagem do estoque disponvel precisas. No entanto, controle de simultaneidade pessimista possvel em uma arquitetura desconectado. As conexes so abrir somente longo o suficiente para ler os dados ou para atualiz-lo, portanto bloqueios no pode ser sustained por longos perodos. Alm disso, um aplicativo que contm at bloqueios por longos perodos no escalonveis. Observao Se sua fonte de dados subjacente suportar transaes, voc pode simular simultaneidade pessimista por atualizar dados em uma transao. For more information, see Features Provided by System.Transactions. CONCURRENCY otimista Em concorrncia otimista, bloqueios so conjunto e mantidos somente enquanto o banco de dados est sendo acessado. Os bloqueios impede os outros usurios de tentativa de atualizar registros no mesmo instantneas. Os dados esto sempre disponveis exceto para o momento em que uma atualizao for local Taking exata. For more information, see Using Optimistic Concurrency. Quando uma atualizao tentada, a verso original de uma linha alterada comparado contra a linha existente no banco de dados. Se as duas forem diferentes, a atualizao falhar com um erro de simultaneidade. Ele backup a voc nesse ponto para reconciliar as linhas dois, usando lgica corporativa que voc criar. ltima no WINS Com " ltima no WINS, " feita nenhuma verificao dos dados originais e a atualizao simplesmente gravada no banco de dados. Ele compreendido que o cenrio a seguir podem ocorrer:

O usurio A fetches um registro a partir do banco de dados. O usurio B fetches o mesmo registro a partir do banco de dados, modifica-la, e grava o registro atualizado novamente para o banco de dados. O usurio A modifica o registro ' antigo ' e grava-lo novamente para o banco de dados.

No cenrio acima, as alteraes feitas Usurio B nunca foram vistas pelo usurio a. Certifique-se que esta situao aceitvel se voc quiser usar a abordagem " ltima no WINS " do controle de simultaneidade. Controle de simultaneidade em ADO.NET e Visual Studio ADO.NET e Visual Studio usar concorrncia otimista, porque a arquitetura de dados for baseada em dados desconectado. Portanto, voc precisar adicionar lgica corporativa para resolver problemas com simultaneidade otimista.

Visual C# Consolidado

983

Se voc optar por usar concorrncia otimista, existem duas maneiras geral para determinar se ocorreram alteraes: a abordagem verso (nmeros de verso True ou carimbos de data e hora) e a abordagem valores-economia-todos os. A abordagem nmero verso Na abordagem nmero verso, o registro a ser atualizado deve ter uma coluna que contm um carimbo de data e hora ou nmero de verso. O carimbo de data e hora ou um nmero de verso salva no cliente quando o registro leitura. Esse valor depois feita parte da atualizao. Uma maneira para manipular simultaneidade para atualizar somente se Valor na clusula WHERE corresponde ao valor no Registro. A representao SQL dessa abordagem :
UPDATE Table1 SET Column1 = @newvalue1, Column2 = @newvalue2 WHERE DateTimeStamp = @origDateTimeStamp

Como alternativa, a comparao pode ser feita usando o nmero de verso:


UPDATE Table1 SET Column1 = @newvalue1, Column2 = @newvalue2 WHERE RowVersion = @origRowVersionValue

Se o carimbos de data e hora ou os nmeros verso coincidirem, o registro no armazenamento de dados no foi alterado e com segurana podem ser atualizados com os novos valores do DataSet. Um erro ser retornado se elas no coincidem. Voc pode escrever cdigo para implementar essa forma de simultaneidade verificao no Visual Studio. Voc tambm ter para gravar cdigo para responder a qualquer conflitos de atualizao. Para manter o carimbo de data e hora ou nmero de verso precisa, voc precisar configurar um disparador na tabela para atualiz-lo quando ocorre uma alterao em uma linha.

A abordagem valores-Saving-tudo
Uma alternativa para usando um nmero ou verso carimbo de data e hora ser para obter cpias de todos os campos quando o registro leitura. O DataSet objeto no ADO.NET mantm duas verses de cada registro modificado: uma verso original (que foi ler a partir da fonte de dados) originalmente e uma verso modificada, que representa as atualizaes de usurio. Ao tentar para gravar o Registro de volta para a fonte de dados, os valores originais na linha de dados so comparados com o registro na fonte de dados. Se eles coincidirem, significa registro de banco de dados que no foi alterado desde que ela foi lida. Nesse caso, os valores alterados a partir do DataSet com xito so gravados para o banco de dados. Cada comando adaptador de dados tem uma coleo parmetros para cada um dos seus comandos quatro (DELETE, INSERT, SELECT, e UPDATE). Cada comando tem parmetros para tanto os valores originais,, bem como os valores atual (ou modificado). Observao Somente a adio de novos registros (o comando INSERT) requer os valores atuais pois nenhum registro original existe e remover registros (o comando delete) somente requer os valores originais, para localizar o registro para excluir.

Visual C# Consolidado

984

O exemplo a seguir mostra o texto de comando para um comando DataSet que atualiza uma tabela comum Customers. O comando foi especificado para SQL Dinmico e simultaneidade otimista.
UPDATE Customers SET CustomerID = @currCustomerID, CompanyName = @currCompanyName, ContactName = @currContactName, ContactTitle = currContactTitle, Address = @currAddress, City = @currCity, PostalCode = @currPostalCode, Phone = @currPhone, Fax = @currFax WHERE (CustomerID = @origCustomerID) AND (Address = @origAddress OR @origAddress IS NULL AND Address IS NULL) AND (City = @origCity OR @origCity IS NULL AND City IS NULL) AND (CompanyName = @origCompanyName OR @origCompanyName IS NULL AND CompanyName IS NULL) AND (ContactName = @origContactName OR @origContactName IS NULL AND ContactName IS NULL) AND (ContactTitle = @origContactTitle OR @origContactTitle IS NULL AND ContactTitle IS NULL) AND (Fax = @origFax OR @origFax IS NULL AND Fax IS NULL) AND (Phone = @origPhone OR @origPhone IS NULL AND Phone IS NULL) AND (PostalCode = @origPostalCode OR @origPostalCode IS NULL AND PostalCode IS NULL); SELECT CustomerID, CompanyName, ContactName, ContactTitle, Address, City, PostalCode, Phone, Fax FROM Customers WHERE (CustomerID = @currCustomerID)

Observe que os parmetros instruo SET nove representam os valores atuais que vai ser gravados para o banco de dados, enquanto a nove WHERE parmetros instruo representam o original valores que so usados para localizar o registro original. Os parmetros nove primeiros na instruo SET correspondem aos parmetros nove primeiros na coleo parmetros. Esses parmetros seria ter sua SourceVersion propriedade definida para Current. Os parmetros prxima nove na instruo WHERE so usadas para simultaneidade otimista. Esses espaos reservados seria correspondem com os parmetros prxima nove na coleo parmetros, e cada um desses parmetros deve ter sua SourceVersion propriedade definida como Original. A instruo SELECT usado para atualizar o DataSet aps a atualizao ter ocorrido. Ele gerado quando voc definir a Refresh the DataSet opo na caixa Advanced SQL Generations Options de dilogo. Observao A instruo SQL acima usa parmetros nomeados, enquanto OleDbDataAdapter comandos usar pontos de interrogao (?) como espaos reservados parmetro. Por padro Visual Studio cria esses parmetros para voc se voc selecionar a Optimistic Concurrency opo na DataAdapter Configuration Wizard. Ele backup a voc para adicionar um cdigo para manipular os erros com base em seus prprios requisitos de negcios. Fornece um DBConcurrencyException objeto que retorna a linha que viola as regras de simultaneidade ADO.NET. For more information, see Como: identificador erros concorrentes.

Como: identificador erros concorrentes


Voc pode capturar o objeto DBConcurrencyException para ajudar a resolver problemas de aparecimento de violaes concorrentes. O objeto DBConcurrencyException retorna o linha de dados que causou o erro. Para obter mais informaes, consulte Membros DBConcurrencyException.

Visual C# Consolidado

985

As tentativas do exemplo a seguir, atualiza uma fonte de dados com o contedo do NorthwindDataSet em um bloco try/catch, se um erro for gerado uma mensagem de erro exibida junto com a primeira coluna da linha de dados afetada. Observao O cdigo abaixo uma ilustrao de uma estratgia para tratar um erro de atualizao do banco de dados. O cdigo pressupe vrias coisas; uma conexo existente para um banco de dados, a existncia de um dataset, bem como a suposio que o comando de execuo da atualizao ser gerado numa violao de concorrncia. Para obter mais informaes e um exemplo completo, consulte Passo a passo: Manipulando uma exceo de concorrncia. Para resolver uma violao de concorrncia 1. 2. 3. Execute o comando para atualizar o banco de dados de dentro de um bloco try/catch. Se uma exceo gerada, inspecione a declarao catch da propriedade Row para determinar o que causou a violao. Adicione cdigo para resolver o erro com base nas regras de negcio do aplicativo. O cdigo a seguir usa o CustomersTableAdapter e o NorthwindDataSet, como exemplos do adaptador e do dataset em seu aplicativo. C#
try { customersTableAdapter.Update(northwindDataSet); } catch (DBConcurrencyException ex) { string customErrorMessage; customErrorMessage = "Concurrency violation\n"; customErrorMessage += ex.Row[0].ToString(); // Add business logic code to resolve the concurrency violation... }

Passo a passo: Manipulando uma exceo de concorrncia


As excees concorrentes (DBConcurrencyException) so geradas quando dois usurios tentam alterar os mesmos dados em um banco de dados ao mesmo tempo. Nesta explicao passo a passo voc ir criar um aplicativo do Windows que ilustra a captura da linha que causou o erro DBConcurrencyException e uma estratgia para voc efetuar o tratamento. Esta explicao passo a passo leva voc atravs do seguinte processo: 1. 2. 3. 4. 5. 6. Criar um novo projeto Windows Application. Crie um novo dataset baseado na tabela Northwind Customers. Criar um formulrio com um DataGridView para exibir os dados. Preencher um dataset com dados da tabela Customers do banco de dados Northwind. Aps preencher o dataset, use o Visual Database Tools no Visual Studio para acessar a tabela de dados Customers e alterar diretamente um registro. Ento no formulrio, altere o mesmo registro com um valor diferente, atualize o dataset, e tente gravar as alteraes no banco de dados, que resulta na gerao de um erro concorrente. Capture o erro, e exiba as diferentes verses do registro, permitindo ao usurio determinar se deseja continuar e atualizar o banco de dados, ou cancelar a atualizao. Pr-requisitos Para concluir esta explicao passo a passo, voc precisa:

7.

Visual C# Consolidado

986

Acesso ao banco de dados de exemplo Northwind com permisso para executar atualizaes. Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Observao

As caixas de dilogo e comandos de menu que voc v podem diferir das descritas na Ajuda dependendo de suas configuraes ativas. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Visual Studio Settings. Criar um novo projeto Voc comear com a explicao passo a passo de como criar um novo aplicativo do Windows.

Para criar um novo projeto de um aplicativo do Windows


1. 2. 3. 4. No menu File, criar um novo projeto. Selecione uma linguagem de programao no painel Project Types. Selecione Windows Application no painel Templates. Nomeie o projeto como ConcurrencyWalkthrough, e clique OK. O Visual Studio adiciona o projeto na Solution Explorer e exibe um novo formulrio no Designer. Criando o dataset Northwind Nesta seo voc criar um dataset chamado NorthwindDataSet.

Para criar o NorthwindDataSet


1. 2. 3. No menu Data, escolha Add New Data source. O Assistente para Configurao da Fonte de Dados aberto. Selecione Database na pgina Choose a Data Source Type. Selecione uma conexo para o banco de dados de exemplo Northwind a partir da lista de conexes disponveis, ou clique em New Connection Se a conexo no estiver disponvel na lista de conexes. Observao Se voc estiver se conectando a um arquivo de banco de dados local, selecione No quando perguntado se voc deseja adicionar o arquivo no seu projeto. 4. 5. 6. Clique Next na pgina Save connection string to the application configuration file. Expanda o n Tables e selecione a tabela Customers. O nome padro para o dataset deve ser NorthwindDataSet. Clique Finish para adicionar o dataset para o projeto. Criar um controle acoplado Data-DataGridView Nesta seo voc criar um DataGridView arrastando o Customers item da janela Data Sources para seu Windows Form

Visual C# Consolidado

987

Para criar um controle DataGridView que est acoplado tabela Clientes


1. 2. 3. 4. No menu Data, escolha Show Data Sources para abrir o Data Sources Window. Expanda o n NorthwindDataSet a partir da janela Data Sources e selecione a tabela Customers. Clique na seta para baixo no n da tabela e selecione DataGridView na lista suspensa. Arraste a tabela para uma rea vazia do seu formulrio. Um controle DataGridView denominado CustomersDataGridView e um BindingNavigator nomeado CustomersBindingNavigator so adicionados ao formulrio vinculado, que por sua vez o BindingSource vinculado tabela Customers no NorthwindDataSet.. NorthwindDataSet Ponto de Verificao Agora voc pode testar o formulrio para certificar-se que ele funciona como esperado at este ponto.

Para testar o formulrio


1. Pressione F5 para executar o aplicativo O formulrio aparece com um controle DataGridView que preenchido com dados da tabela Customers. 2. No menu Debug, escolha Stop Debugging. Manipular erros concorrentes Como voc manipula os erros depende como as regras especficas do negcio governam o aplicativo. Para esta explicao passo a passo, aps a gerao de uma violao de concorrncia, a estratgia de manipulao do erro concorrncia a seguir ser usada como uma ilustrao: O aplicativo apresentar ao usurio trs verses do registro:

O registro atual no banco de dados. O registro original carregado para o dataset. As alteraes propostas no dataset.

O usurio ento capaz de substituir o banco de dados com a verso proposta ou cancelar a atualizao e atualizar o dataset com os novos valores do banco de dados.

Para ativar o tratamento de erros concorrncia


1. 2. 3. 4. Criar um manipulador de erro personalizado. Exibir as opes para o usurio. Processar a resposta do usurio. Reenviar a atualizao, ou redefinir os dados no dataset.

Adicionar o cdigo para tratar a exceo concorrente


Quando voc tentar executar uma atualizao e uma exceo gerada, voc geralmente deseja fazer algo com as informaes fornecidas pela exceo gerada.

Visual C# Consolidado

988

Nesta seo voc ir adicionar cdigo que tentar atualizar o banco de dados, e tratar qualquer DBConcurrencyException gerado, bem como qualquer outra exceo. Observao Os mtodos CreateMessage e ProcessDialogResults sero adicionadas posteriormente nesta explicao passo a passo. Para adicionar o tratamento de erro para o erro de concorrncia 1. Adicione o seguinte cdigo abaixo o mtodo Form1_Load: C#
private void UpdateDatabase() { try { this.customersTableAdapter.Update(this.northwindDataSet.Customers); MessageBox.Show("Update successful"); } catch (DBConcurrencyException dbcx) { DialogResult response = MessageBox.Show(CreateMessage((NorthwindDataSet.CustomersRow) (dbcx.Row)), "Concurrency Exception", MessageBoxButtons.YesNo); ProcessDialogResult(response); } catch (Exception ex) { MessageBox.Show("An error was thrown while attempting to update the database."); } }

2.

Substitua o mtodo CustomersBindingNavigatorSaveItem_Click para chamar o mtodo UpdateDatabase para que se parea com o seguinte: C#
private void customersBindingNavigatorSaveItem_Click(object sender, EventArgs e) { UpdateDatabase(); }

Exibir as opes para o usurio


O cdigo apenas que voc escreveu chama o procedimento CreateMessage para exibir informaes de erro para o usurio. Para esta explicao passo a passo, voc usar uma caixa de mensagem para exibir as diferentes verses do Registro para o usurio e permitir que o usurio escolha se deseja substituir o registro com as alteraes ou cancelar a edio. Depois que o usurio seleciona uma opo (clicar um boto) na caixa de mensagem, a resposta passado para o mtodo ProcessDialogResult.

Para criar a mensagem a ser exibida para o usurio

Crie a mensagem, adicionando o seguinte cdigo para o Code Editor. Digite este cdigo abaixo para o mtodo UpdateDatabase. C#
private string CreateMessage(NorthwindDataSet.CustomersRow cr) { return "Database: " + GetRowData(GetCurrentRowInDB(cr), DataRowVersion.Default) + "\n" + "Original: " + GetRowData(cr, DataRowVersion.Original) + "\n" + "Proposed: " + GetRowData(cr, DataRowVersion.Current) + "\n" + "Do you still want to update the database with the proposed value?"; } //------------------------------------------------------------------------- // This method loads a temporary table with current records from the database // and returns the current values from the row that caused the exception. //------------------------------------------------------------------------- private NorthwindDataSet.CustomersDataTable tempCustomersDataTable = new NorthwindDataSet.CustomersDataTable(); private NorthwindDataSet.CustomersRow GetCurrentRowInDB(NorthwindDataSet.CustomersRow RowWithError) { this.customersTableAdapter.Fill(tempCustomersDataTable);

Visual C# Consolidado

989

NorthwindDataSet.CustomersRow currentRowInDb = tempCustomersDataTable.FindByCustomerID(RowWithError.CustomerID); return currentRowInDb; } //-------------------------------------------------------------------------- // This method takes a CustomersRow and RowVersion // and returns a string of column values to display to the user. //------------------------------------------------------------------------- private string GetRowData(NorthwindDataSet.CustomersRow custRow, DataRowVersion RowVersion) { string rowData = ""; for (int i = 0; i < custRow.ItemArray.Length ; i++ ) { rowData = rowData + custRow.Item(i, RowVersion).ToString() + " "; } return rowData; }

Processando resposta do usurio


Voc tambm precisar codificar para processar a resposta do usurio caixa de mensagem. As opes so tanto sobrescrever o registro atual no banco de dados com a alterao proposta ou abandonar as alteraes locais e atualizar a tabela de dados com o registro corrente no banco de dados. Se o usurio escolher Sim, o mtodo Merge chamado com o argumento preserveChanges definido como true. Isso far com que a tentativa de atualizao ser bem sucedida, porque agora a verso original do registro coincide com o registro no banco de dados.

Para processar a entrada de usurio na caixa de mensagem

Adicione o seguinte cdigo abaixo ao cdigo adicionado na seo anterior. C#


// This method takes the DialogResult selected by the user and updates the database // with the new values or cancels the update and resets the Customers table // (in the dataset) with the values currently in the database. private void ProcessDialogResult(DialogResult response) { switch (response) { case DialogResult.Yes: UpdateDatabase(); break; case DialogResult.No: northwindDataSet.Merge(tempCustomersDataTable); MessageBox.Show("Update cancelled"); break; } }

Teste Agora voc pode testar o formulrio para certificar-se ele funciona como esperado. Para simular uma violao de concorrncia voc precisa alterar os dados no banco de dados aps preench no NorthwindDataSet.

Para testar o formulrio


1. 2. 3. 4. 5. 6. Pressione F5 para executar o aplicativo. Aps o formulrio aparecer, deixe-lo funcionando e alterne para a IDE do Visual Studio. No menu View, escolha Server Explorer. No Server Explorer, expanda a conexo que seu aplicativo est usando e expanda o n Tables. Clique com o boto direito do mouse na tabela Customers e selecione Show Table Data. No primeiro registro (ALFKI) mude o ContactName) para Maria Anders2. Observao Navegue at uma linha diferente para confirmar a alterao. 7. Alterne para o ConcurrencyWalkthrough que esteja executando o formulrio

Visual C# Consolidado

990

8. 9.

No primeiro registro no formulrio (ALFKI), altere o ContactName para Maria Anders1. Clique no boto Save. O erro de concorrncia gerado, e a caixa de mensagem aparece.

10. Clicar em No cancela a atualizao e atualiza o dataset com os valores correntes no banco de dados, enquanto clicar em Yes grava o valor proposto para o banco de dados. Consulte tambm

Passo a passo: Salvando dados com os mtodos DBDirect do Adaptador de Tabela


Esta explicao passo a passo fornece instrues detalhadas para executar instrues SQL diretamente em um banco de dados usando os mtodos DBDirect de um TableAdapter . Mtodos DBDirect de um TableAdapter fornecem um fino nvel de controle sobre as atualizaes de banco de dados. Com eles podem executar especificamente instrues SQL ou procedimentos armazenados por chamando individual dos mtodos Insert, Update, e Delete conforme necessrio por seu aplicativo (em oposio a sobrecarga do mtodo Update que executa as instrues UPDATE, INSERT, e DELETE tudo em uma chamada). Durante esta explicao passo a passo, voc aprender como:

Criar um novo Windows Application. Criar e configurar um dataset com o Assistente para Configurao da Fonte de Dados. Selecione o controle a ser criado no formulrio ao arrastar itens a partir da janela Data Sources. Para obter mais informaes, consulte Como: Definir o controle a ser criado quando arrastado da janela Data Sources:. Criar um formulrio vinculado a dados, arrastando itens da janela Data Sources para o formulrio. Adicionar mtodos para acessar o banco de dados e executar inseres, atualizaes e excluses diretamente no banco de dados. Pr-requisitos

A fim de concluir esta explicao passo a passo, ser necessrio:

Acesso ao banco de dados de exemplo Northwind. Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo. Criando um Aplicativo Windows

A primeira etapa para criar um Windows Application.

Para criar o novo projeto Windows


1. 2. 3. No Visual Studio, a partir do menu File, criar um novo Project. Nome do projeto TableAdapterDbDirectMethodsWalkthrough. Selecione Windows Application e clique em OK. Para obter mais informaes, consulte Creating Windows-based Applications. O projeto TableAdapterDbDirectMethodsWalkthrough criado e adicionado ao Solution Explorer. Criar uma fonte de dados do seu banco de dados

Visual C# Consolidado

991

Os passos usados no Data Source Configuration Wizard para criar uma fonte de dados com base na tabela Region, no banco de dados de exemplo Northwind. Voc deve ter acesso ao banco de dados de exemplo Northwind para criar a conexo. Para informaes sobre como configurar dados de exemplo Northwind, consulte COMO: Instalar Bancos de Dados de Exemplo.

Para criar a fonte de dados


1. 2. 3. 4.
o

No menu Data, clique em Show Data Sources. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source Configuration Wizard. Selecione Database na pgina Choose a Data Source Type, e clique Next. Na pgina Choose your Data Connection siga um destes procedimentos: Se uma conexo de dados para o banco de dados de exemplo Northwind est disponvel na lista suspensa, selecione-a. OuSelecione New Connection para iniciar a caixa Add/Modify Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box (General). Se seu banco de dados exigir uma senha, selecione a opo para incluir dados confidenciais, e clique Next. Clique Next na pgina Save connection string to the Application Configuration file. Expanda o n Tables na pgina Choose your Database Objects. Selecione a tabela Region, e clique Finish. O NorthwindDataSet adicionado ao seu projeto e a tabela Region aparece na janela Data Sources. Adicionar controles ao formulrio para exibir os dados

5. 6. 7. 8.

Criar os controles com dados vinculados, arrastando itens da janela Data Sources para seu formulrio.

Para criar dados ligados a controles no Windows Form

Arraste o n principal Region da janela Data Sources para o formulrio. Um controle DataGridView e uma faixa de ferramenta. (BindingNavigator) para navegar pelos registros aparecem no formulrio. O NorthwindDataSet, RegionTableAdapter, BindingSource, e BindingNavigator aparecem na bandeja do componente.

Para adicionar botes que chamaram os mtodos individuais DbDirect TableAdapter


1. 2. Arraste trs controles Button do Toolbox par o Form1 (abaixo do RegionDataGridView). Defina as seguintes propriedades Name e Text em cada boto. Nome InsertButton UpdateButton DeleteButton Texto Inserir Atualizao Excluir

Visual C# Consolidado

992

Para adicionar o cdigo para inserir novos registros no banco de dados


1. 2. Clique duas vezes em InsertButton para criar um manipulador de eventos para o evento Click e abrir o seu formulrio no Editor de Cdigo. Substituir o InsertButton_Click manipulador de eventos com o seguinte cdigo: C#
private void InsertButton_Click(object sender, EventArgs e) { Int32 newRegionID = 5; String newRegionDescription = "NorthEastern"; try { regionTableAdapter1.Insert(newRegionID, newRegionDescription); } catch (Exception ex) { MessageBox.Show("Insert Failed"); } RefreshDataset(); } private void RefreshDataset() { this.regionTableAdapter1.Fill(this.northwindDataSet1.Region); }

Para adicionar o cdigo para atualizar registros no banco de dados


1. 2. Clique duas vezes em UpdateButton para criar um manipulador de eventos para o evento Click e abrir o formulrio no Editor de Cdigo. Substituir o manipulador de eventos UpdateButton_Click com o seguinte cdigo: C#
private void UpdateButton_Click(object sender, EventArgs e) { Int32 newRegionID = 5; try { regionTableAdapter1.Update(newRegionID, "Updated Region Description", 5, "NorthEastern"); } catch (Exception ex) { MessageBox.Show("Update Failed"); } RefreshDataset(); }

Para adicionar o cdigo para excluir registros do banco de dados


1. 2. Clique duas vezes em DeleteButton para criar um manipulador de eventos para o evento Click e abrir o formulrio no Editor de Cdigo. Substitua o manipulador de eventos DeleteButton_Click com o seguinte cdigo: C#
private void DeleteButton_Click(object sender, EventArgs e) { try { regionTableAdapter1.Delete(5, "Updated Region Description"); } catch (Exception ex) { MessageBox.Show("Delete Failed"); } RefreshDataset(); }

Executando o aplicativo

Para executar o aplicativo


Pressione F5 para executar o aplicativo. Clique no boto Insert e verifique se o novo registro aparece na grade. Clique no boto Update e verifique se o registro atualizado na grade. Clique no boto Delete e verifique se o registro foi removido da grade. Prximas etapas

Dependendo dos seus requisitos do aplicativo, existem vrias etapas podem ser executadas aps criar um formulrio vinculado a dados. Voc pode fazer nesta explicao passo a passo alguns aprimoramentos que incluem:

Visual C# Consolidado

993

Adicionando a funcionalidade pesquisa ao formulrio. Para obter mais informaes, consulte Como: Adicionar uma Consulta Parametrizada a um Formulrio em um Aplicativo do Windows. Adicionar tabelas adicionais ao dataset, selecionando o Configure DataSet with Wizard dentro da janela Data Sources. Voc pode adicionar controles que exibem dados relacionados, arrastando os ns relacionados para o formulrio. Para obter mais informaes, consulte Como: exibir dados relacionados em um aplicativo Windows:. Consulte tambm

Elementos de Dados de Interface de Usurio


Esta seo contm informaes sobre todos os caixas de dilogo e assistentes que voc usa ao criar acesso a dados no seu aplicativo Visual Basic ou Visual C#. Observao As caixas de dilogo e comandos de menu que voc v podem diferir das descritas na Ajuda dependendo de suas configuraes ativas ou de edio. Para alterar as configuraes, escolha Import and Export Settings no menu Tools. Para obter mais informaes, consulte Visual Studio Settings. Nesta seo Marcas Inteligentes de Dados Fornece informaes sobre alguns comandos de marca inteligente que esto disponveis para dados. Caixa de Dilogo Add Dataset Coloca um dataset tipado existente ou um novo dataset sem tipo (uma instncia da classe System.Data.Dataset) em um formulrio ou componente. Caixa de Dilogo Advanced SQL Generation Options Permite a voc controlar como instrues SQL ou procedimentos armazenados so criados para um adaptador de dados, especificando opes para atualizaes, simultaneidade otimista, e atualizao do dataset. Escolha uma caixa de dilogo Instncia fonte de dados Permite a voc selecionar o dataset desejado em uma lista de datasets em seu projeto. Caixa de dilogo Choose a Data Source to Merge With Permite a voc selecionar qual fonte de dados para mesclar quando vrias fontes de dados esto disponveis. Escolha Caixa de dilogo Chave Permite a voc selecionar uma tecla quando uma coluna participa de uma restrio multichave.

Visual C# Consolidado

994

Editores de Coleo Fornece links para tpicos sobre editores de coleo diferentes que permitem a voc criar e editar membros individuais de uma coleo. Conexes ausente Informa quando um dataset contm uma referncia para uma seqncia de conexo que no est nas configuraes do aplicativo. Caixa de Dilogo Data Adapter Configuration Error Exibe um ou mais erros que ocorreram enquanto o Visual Studio tentava criar uma instncia de um adaptador de dados e definir suas propriedades. Data Adapter Configuration Wizard Configura comandos SQL ou procedimentos armazenados que um adaptador de dados usa para ler dados de um banco de dados para um dataset e para gravar no banco de dados de volta. O tpico descreve como executar o assistente e o que fazer aps a concluso do assistente. Caixa de Dilogo Data Adapter Preview Permite a voc ver ser como os dados preenchero um dataset atravs de um adaptador de dados, o que til para testar se o adaptador est retornando os dados que voc espera, que mapeamentos de tabela funcionam corretamente, e o efeito de parmetros de diferentes valores. Caixa de Dilogo Data Source Login Permite a voc solicitar acesso a uma fonte de dados (normalmente um banco de dados) para o qual voc ainda no tenha sido autenticado. Guia, caixa de ferramentas DataSet Exibe os objetos voc pode adicionar a um dataset tipado. Voc deseja incluir a senha na caixa de dilogo a seqncia de conexo Permite que voc tenha controle se uma senha est incorporada na seqncia de conexo. Caixa de dilogo Edit Key Permite a voc definir e editar chaves. Caixa de Dilogo Foreign Key Constraint Permite a voc colocar uma restrio de chave externa em uma ou mais colunas em uma tabela dataset que est relacionada a outra tabela. Caixa de Dilogo Generate Dataset

Visual C# Consolidado

995

Permite a voc gerar um novo dataset tipado a partir informaes fornecidas por um ou mais adaptadores dados e adicionar tabelas a um dataset existente. Vrias Caixas de Dilogo BindingSources Permite a voc selecionar qual BindingSource a ser usado quando mais de um BindingSource est disponvel. Caixa de dilogo Preview Data Permite a voc revisar os dados retornados por consultas no seu projeto. Caixa de Dilogo Preview SQL Script Aparece como parte do Data Adapter Configuration Wizard para permitir que voc possa ver o script SQL que o assistente utilizar para criar procedimentos armazenados para ler e gravar dados. Caixa de Dilogo Relation Permite a voc criar um relacionamento (um objeto DataRelation) que mantm informao sobre registros pai-filho em duas tabelas de dados em um dataset. Caixa de Dilogo Construtora de Critrios de Pesquisa Permite a voc criar uma consulta parametrizada em um Windows Form vinculado a dados, e adicionar automaticamente os controles necessrios para executar a consulta. Caixa de Dilogo Table Mappings Permite a voc especificar quais colunas em uma tabela do banco de dados ou outra fonte de dados so equivalentes s colunas em uma tabela dataset. Caixa de Dilogo Unique Constraint Permite a voc colocar uma restrio exclusiva em uma ou mais colunas em uma tabela em um dataset sem tipo. XML Designer Fornece um conjunto de ferramentas visuais para trabalhar com Esquemas XML, Datasets ADO.NET, e documentos XML. Sees relacionadas Acessando Dados Fornece links para tpicos que descrevem como acessar dados em seus aplicativos Visual Basic e Visual C#. Referncia(Ferramentas de Banco de Dados Visual) Fornece links para tpicos de referncia sobre como trabalhar com Ferramentas de Banco de Dados Visual.

Visual C# Consolidado

996

Adaptadores de Dados do ADO.NET


Os tpicos a seguir fornecem informaes sobre objetos adaptadores de dados ADO.NET e como trabalhar com eles. Adaptadores so usados para trocar dados entre uma fonte de dados e um DataSet. Observao Na verso anterior do Visual Studio Adaptadores de dados eram usados para comunicao entre um aplicativo e um banco de dados. Embora adaptadores de dados sejam ainda um componente principal do .NET Framework Data Providers, TableAdapters so componentes gerados pelo designer que simplificam o processo de mover dados entre o seu aplicativo e um banco de dados. Para obter mais informaes sobre como trabalhar com TableAdapters, consulte Viso Geral do Adaptador de Tabela. Nesta seo Introduo aos adaptadores de dados Fornece uma viso geral do que so adaptadores de dados, para que so usados, e como eles so estruturados. Parmetros de comandos Adapter DataDescreve a estrutura e uso de parmetros que adaptadores passam em tempo de execuo para instrues SQL ou procedimentos armazenados. Mapeamento de tabela em adaptadores de dados Descreve as opes para obter informaes sobre como mapear nomes de coluna entre uma tabela de origem e uma tabela DataSet. Criando adaptadores de dados Lista maneiras diferentes de criar adaptadores de dados no Visual Studio. Como configurar parmetros para adaptadores de dados: Explica como criar e definir propriedades de parmetros que sero passados em tempo de execuo para comandos do adaptador de dados. Como mapear colunas origem Data-para colunas Tabela DataSet data-: Fornece instrues sobre como estabelecer e modificar o mapeamento entre os nomes de coluna das tabelas de origem e as tabelas DataSet. Como: Visualizar Resultados de um Data-Adapter Fornece instrues para testar como um adaptador de dados preencher um DataSet. Sees relacionadas Criando aplicativos de dados com Visual Studio

Visual C# Consolidado

997

Fornece uma introduo geral dos conceitos de acesso a dados no Visual Studio. DataSets no Visual Studio Overview Fornece informaes bsicas sobre a estrutura e o uso de DataSets. Populating a DataSet from a DataAdapter Apresenta uma srie de tpicos de cdigo exemplo especfico para preencher DataSets com adaptadores de dados. Viso Geral do Adaptador de Tabela Explica o que so TableAdapters e ferramentas disponveis para cri-los. Como: Criar TableAdapters Fornece as etapas para criar um novo TableAdapter. Como: Editar consultas do TableAdapter Fornece as etapas para adicionar uma consulta a um TableAdapter existente. Consulte tambm Conceitos

Projetos SQL Server


Voc pode usar linguagens .NET Framework em conjunto com a linguagem de programao Transact-SQL para criar objetos de banco de dados tais como procedimentos armazenados e disparadores, e para recuperar e atualizar dados para banco de dados Microsoft SQL Server 2005. O desenvolvimento de objetos de banco de dados .NET Framework para SQL Server usando cdigo gerenciado tem muitas vantagens quando comparado com Transact-SQL. Para obter mais informaes, consulte Vantagens de usar cdigo gerenciado para criar objetos de bancos de dados. Para criar um objeto de banco de dados, voc deve criar um projeto SQL Server, adicionar os itens necessrios ao projeto e adicionar cdigo a esses itens. Em seguida, voc deve compilar o projeto em um assembly e implant-lo no SQL Server. Observao O recurso de integrao Common Language Runtime (CLR) fica desativado por padro no Microsoft SQL Server e deve ser ativado para usar itens de projeto SQL Server. Para ativar a integrao CLR, use a opo clr enabled do procedimento armazenado sp_configure. Para mais informaes, consulte Enabling CLR Integration. Criando um novo projeto Crie um novo projeto SQL Server clicando no menu File, selecionando Project e depois selecionando SQL Server Project na New Project Dialog Box. Para obter mais informaes, consulte Como: criar um projeto SQL Server.

Visual C# Consolidado

998

Aps criar o novo projeto SQL Server, a Add Database Reference Dialog Box exibida. Use esta caixa de dilogo para adicionar uma referncia do banco de dados, ou conexo, para o projeto. Voc pode selecionar um referncia do banco de dados que est disponvel no momento no Server Explorer/Database Explorer ou definir uma nova conexo. Somente uma referncia do banco de dados pode ser adicionada ao projeto.

Propriedades do projeto
Voc pode alterar o Assembly name, que o nome do arquivo de sada que contm o manifesto do assembly. Se voc alterar o nome do assembly, o nome do objeto do banco de dados no banco de dados do SQL Server tambm alterado. Adicionando itens ao projeto Novos projetos SQL Server contm somente referncias e informaes de assembly. Para criar objetos de banco de dados, voc deve primeiro adicionar itens ao projeto e depois adicionar cdigo aos itens. Para obter mais informaes, consulte Modelos de Item para Projetos do SQL Server. A tabela a seguir lista itens especficos para projetos SQL Server que voc pode adicionar. Item Procedimento armazenado Mais informaes Como: criar e executar um procedimento armazenado SQL Server CLR Como: Criar e Executar um Disparador SQL Server CLR Como criar e executar um SQL CLR Server funo definida pelo usurio: Como criar e executar um SQL CLR Server funo definida pelo usurio: Como criar e executar uma agregao ao CLR do SQL Server:

Disparador Funo definida pelo usurio Tipo definido pelo usurio

Agregado

Compilando, implantando e depurando Quando voc compila seu projeto, ele compilado em um assembly que pode ser implantado em um banco de dados que est referenciado no projeto e depurado. Dica Como uma alternativa a compilar, implantar e depurar em trs etapas separadas, voc pode usar o comando Start (F5) ou o comando Start Without Debugging (CTRL+F5) para compilar o assembly, implant-lo no banco de dados e depurar o objeto de banco de dados. Antes de voc poder depurar o objeto de banco de dados, voc deve adicionar cdigo TransactSQL ao item Test.sql. O script no item Test.sql essencial para a depurao porque ele executa as aes no banco de dados que so necessrias para iniciar e testar seu objeto de banco de

Visual C# Consolidado

999

dados. Quando ele adicionado ao seu projeto, o item Test.sql contm esboo de cdigo para um script que executa a ao necessria no banco de dados. Se seu projeto SQL Server contm mais de um objeto de banco de dados, o script do item Test.sql deve executar cada um dos objetos de banco de dados. Esse requisito de script de depurao diferente de, por exemplo, um projeto do Windows Forms, que cria e executa um programa executvel independente; objetos de banco de dados so executados apenas em resposta a aes ou chamadas no banco de dados. Por exemplo, um disparador pode ser ativado quando uma nova linha inserida em uma tabela. Portanto, o script de Test.sql deve inserir uma nova linha em uma tabela para ativar o disparador. Os resultados do disparador sero exibidos na Output Window no Visual Studio, para que voc possa determinar se o disparador est funcionando corretamente. Em seguida, adicione cdigo ao item que voc adicionou no seu projeto SQL Server e ao item Test.sql. Voc pode encontrar cdigo de exemplo para cada objeto de banco de dados em tpicos sobre o item de banco de dados disponvel. Consulte a tabela anterior.

Compilando um projeto SQL Server


Quando voc compila seu projeto, ele compilado em um assembly. Se voc estiver usando Visual Basic, use o seguinte procedimento:

Para compilar um projeto SQL Server em Visual Basic


1. 2. No Solution Explorer, selecione o projeto. No menu Build, escolha Build<ProjectName>.

Se voc estiver usando Visual C# ou Visual J#, use o seguinte procedimento:

Para criar um projeto SQL Server em Visual C# ou Visual J#


1. 2. No Solution Explorer, selecione a soluo. No menu Build, escolha Build Solution.

Implantando o assembly em um banco de dados


Ao implantar o assembly no banco de dados que referenciado no projeto, a conexo ao banco de dados feita e depois o assembly copiado para o banco de dados, onde ele registrado e atributos so definidos. Devido ao fato de o assembly ser implantado em um banco de dados especfico em um servidor, se voc cria uma nova referncia de banco de dados para um banco de dados diferente no mesmo servidor, o assembly deve ser implantado no segundo banco de dados antes que ele possa ser usado. Se voc estiver usando Visual Basic, use o seguinte procedimento.

Para implantar um assembly do SQL Server Class Library em Visual Basic


1. 2. No Solution Explorer, selecione o projeto. No menu Build, escolha Deploy<ProjectName>.

Se voc estiver usando Visual C# ou Visual J#, use o seguinte procedimento.

Para implantar um assembly do SQL Server Class Library em Visual C# ou Visual J# Visual C# Consolidado 1000

1. 2.

No Solution Explorer, selecione a soluo. No menu Build, escolha Deploy Solution.

Depurando o objeto de banco de dados


Quando voc depura um objeto de banco de dados, o assembly compilado, implantado no banco de dados e depurado. Quando voc depura um objeto de banco de dados que foi compilado e implantado anteriormente, o assembly compilado novamente apenas se o projeto tiver sido alterado desde a ltima vez em que ele foi compilado. O assembly sempre excludo do banco de dados e copiado novamente.

Para depurar o objeto de banco de dados


1. 2. 3. No Solution Explorer, selecione a soluo. No menu Debug, escolha Start. Na janela Output, na lista Show output from, escolha Database Output para visualizar os resultados.

Consulte tambm Tarefas

Passo a passo: Criando um procedimento armazenado no cdigo gerenciado


Procedimentos armazenados para bancos de dados SQL Server 2005 agora podem ser escritos em cdigo gerenciado usando as linguagens do .NET Framework como Visual Basic e C#. Procedimentos armazenados escritos em cdigo gerenciado so chamados procedimentos armazenados CLR. Voc pode criar procedimentos armazenados SQL adicionando itens Stored Procedure a projetos SQL Server. Aps a implantao bem sucedida para um SQL Server, procedimentos armazenados criados no cdigo gerenciado so chamados e executados como qualquer outro procedimento armazenado. As tarefas ilustradas nesta explicao passo a passo incluem:

Criando um novo projeto Windows Application. Criando um procedimento armazenado no cdigo gerenciado. Implantando o procedimento armazenado em um banco de dados SQL Server 2005. Criando um script para testar o procedimento armazenado no banco de dados. Consultando dados no banco de dados para confirmar que o procedimento armazenado executa corretamente. Pr-requisitos

Para concluir esta explicao passo a passo, voc precisa:

Uma conexo com o banco de dados de exemplo AdventureWorks executando em SQL Server 2005. Para obter mais informaes, consulte COMO: Instalar Bancos de Dados de Exemplo Criando o projeto

Para criar o novo projeto de SQL Server Visual C# Consolidado 1001

1. 2.

No menu File, crie um novo projeto. Selecione SQL Server Project, nomeie o projeto SQLCLRStoredProcedure e clique em OK. Para obter mais informaes, consulte Como: criar um projeto SQL Server. Conectando-se a um banco de dados SQL Server 2005

Esta explicao passo a passo requer uma conexo para o banco de dados de exemplo AdventureWorks executando em SQL Server 2005. Se uma conexo com o banco de dados de exemplo AdventureWorks estiver disponvel no Server Explorer, ento ele ser listado na Add Database Reference Dialog Box. Observao O recurso de integrao do common language runtime (CLR) fica desativado por padro no Microsoft SQL Server e deve ser ativado para usar itens de projeto de SQL Server. Para ativar integrao CLR, use a opo clr enabled do procedimento armazenado sp_configure. Para mais informaes, consulte Enabling CLR Integration.

Para se conectar ao banco de dados de exemplo AdventureWorks

Conecte-se ao banco de dados de exemplo AdventureWorks includo com o SQL Server 2005 completando a caixa de dilogo Add Connection. Para obter mais informaes, consulte Add/Modify Connection (Microsoft SQL Server). - ou Selecione uma conexo existente com o banco de dados de exemplo AdventureWorks na caixa de dilogo Add Database Reference. Para obter mais informaes, consulte Add Database Reference Dialog Box. Criando o procedimento armazenado SQL Server

Aps criar o projeto de SQL Server, adicione um procedimento armazenado a ele.

Para criar o procedimento armazenado SQL Server


1. 2. 3. 4. 5. No menu Project, escolha Add New Item. Selecione Stored Procedure em Add New Item Dialog Box. Digite InsertCurrency como o Name para o novo procedimento armazenado. Clique em Add. Substitua o cdigo no Code Editor com o seguinte: Implantando, Executando, e Depurando o procedimento armazenado Aps voc criar um novo procedimento armazenado, ele pode ser criado, implantado no SQL Server, e depurado, pressionando F5. Primeiro, no arquivo Test.sql encontrado na pasta TestScripts do seu projeto, adicione cdigo para executar e testar seu procedimento armazenado. Para obter mais informaes sobre como criar scripts de teste, consulte Como: Editar o script Test.sql para executar objetos SQL. Para obter mais informaes sobre depurao de SQL, consulte Depurao objetos de banco de dados SQL.

Para distribuir, e executar o procedimento armazenado InsertCurrency Visual C# Consolidado 1002

1. 2.

No Solution Explorer, expanda a pasta TestScripts e clique duas vezes no arquivo Test.sql. Substitua o cdigo no arquivo Test.sql com o seguinte cdigo:
EXEC InsertCurrency 'AAA', 'Currency Test' SELECT * from Sales.Currency where CurrencyCode = 'AAA'

3.

Pressione F5 para criar, implantar e depurar o procedimento armazenado. Para informaes sobre como implantar sem depurao, consulte Como implantar SQL itens Project Server em um SQL Server:. Veja os resultados na janela Output e selecione Show output from: Database Output.

Visual C# Consolidado

1003

Criando Classes (Como Fazer em C#)


Esta pgina possui links para Ajuda sobre tarefas do Class Designer usadas amplamente em C#. Para ver outras categorias de tarefas populares abordadas na ajuda, consulte Como Fazer em C#. Os seguintes sites requerem uma conexo com a Internet. Centro de Desenvolvimento do Visual Studio 2005 Contm vrios artigos e recursos em desenvolvimento de aplicativos usando o Visual Studio 2005. Este site atualizado regularmente com novo contedo. Centro de Desenvolvimento do Visual C# Contm vrios artigos e recursos em desenvolvimento de aplicativos C#. Este site atualizado regularmente com novo contedo. Centro de Desenvolvimento do Microsoft .NET Framework Contm vrios artigos e recursos em desenvolvimento e aplicativos .NET Framework de depurao. Este site atualizado regularmente com novo contedo. Centro de Desenvolvimento de Padres Microsoft e Prticas Recomendaes especficas de cenrios ilustrando como criar, desenvolver, distribuir e operar arquitetonicamente aplicativos para a plataforma Microsoft .NET.

COMO: Criar Tipos em Diagramas de Classe


Em Class Designer, voc pode criar tipos no diagrama de classe arrastando-os na caixa de ferramentas Class Designer. Caixa de ferramentas Class Designer contm os seguintes tipos:

Class Enumerao Interface Classe abstrata Estrutura Delegado Module (Visual Basic somente)

Para exibir tipos existentes em um projeto, consulte COMO: Exibir tipos existentes. Para criar um tipo em um diagrama de classe 1. A partir do projeto no Solution Explorer, abra um arquivo diagrama de classe (.CD). Dica Se o projeto no contm um arquivo diagrama de classe, voc deve adicionar um. Para obter mais

Visual C# Consolidado

1004

informaes, consulte COMO: Adicionar diagramas de classes a projetos. 2. Abrir Caixa de ferramentas Class Designer clicando na Toolbox guia. Dica Para manter a caixa de ferramentas aberta enquanto voc trabalha no Class Designer, clique no Auto Hide boto (de pino de envio) na caixa de ferramentas. 3. Na caixa de ferramentas Class Designer, arraste uma forma tipo para o diagrama de classe. Caixa New <Type> de dilogo aparecer para que voc pode especificar o nome do tipo, o nome do arquivo para salvar o cdigo para o tipo, e o nvel de acesso para o tipo. Identifica <Type> o tipo que voc est criando, tais como Class ou Enumeration. 4.
o o

Na caixa New <Type> de dilogo, execute uma das opes a seguir: Para aceitar os valores padro, clique em OK. Para especificar valores diferentes, digite o nome e nome de arquivo para o tipo, escolha o nvel de acesso para o tipo na caixa Access de listagem, e clique em OK. Dica Para selecionar um arquivo existente, clique no ellipsis. () boto ao lado da File name Caixa

5.

A forma que representa o tipo aparece no diagrama na posio onde voc arrastado-lo. Se voc especificou um novo nome de arquivo Visual Studio cria um arquivo cdigo fonte com o nome do tipo no n de projeto em Solution Explorer. Se voc escolher um arquivo existente, Visual Studio adiciona o cdigo para o novo tipo ao arquivo especificado.

Criando e Configurando Membros de Tipos


Depois que tiver criado um tipo em um diagrama de classe, voc pode adicionar seus membros e configur-los. Faa isso usando a Class Details janela, que por padro aparece na parte inferior da janela do Visual Studio quando voc abre um diagrama de classe. As sees a seguir descrevem como trabalhar com membros tipo.

Criar membros tipo


Depois que tiver criado um tipo em um diagrama de classe, voc pode adicionar membros a ela e configur-los Para obter informaes sobre como adicionar membros, consulte COMO: Criar um membro. Para obter informaes sobre como modificar membros (configurao), consulte COMO: Modificar membros de tipo. Cada tipo que pode ser representado em um diagrama de classe pode conter tipos especficos de membros. A tabela a seguir descreve os tipos podem conter os membros: Type (Tipo) Class Ele pode conter membros Mtodo, Propriedade (para C# e Visual Basic), campo, evento (para C# e Visual Basic), (mtodo) construtor, destruidor (mtodo), constante

Visual C# Consolidado

1005

Enum Struct

Membro Mtodo, campo de propriedade (para C# e Visual Basic), evento (para C# e Visual Basic), (mtodo) construtor, constante mtodo, evento (para C# e Visual Basic), propriedade Mtodo, Campo (para J#)

Interface

Delegado Observao

Parmetro

O nico tipo para o qual voc pode especificar parmetros delegado. Voc pode especificar parmetros para mtodos, que por sua vez pode ser adicionado aos tipos para classe, estrutura, e interface; para obter mais informaes consulte COMO: Adicionar um parmetro a um mtodo.

COMO: Modificar membros de tipo


Class Designer permite-lhe modificar os membros de tipos exibidos no diagrama. Voc pode modificar os membros de qualquer tipo exibido em um diagrama de classe que No READONLY (consulte Exibio de informaes somente leitura). Voc Modificar membros tipo usando edio in-loco na superfcie de design, grade propriedade, a janela Detalhes classe, que por padro aparece no canto inferior da janela do Visual Studio quando voc abrir um diagrama de classe. Observao Para obter informaes sobre como criar membros tipo, consulte Criar membros tipo. Para modificar um membro tipo 1. 2. 3. Selecione o tipo no Class Designer. Se a janela Detalhes classe no for exibida, exiba-o. (Consulte COMO: Abrir a janela Class Details.) Edite os valores nos campos da grade da janela Detalhes classe. Aps cada edio, pressione enter, ou caso contrrio mover foco fora do campo editado, tais como pressionando TAB. Suas edies refletem imediatamente no cdigo. Observe que se voc desejar modificar o nome de um membro, somente poder fazer to in loco no diagrama.. to in loco no diagrama

COMO: Adicionar um parmetro a um mtodo


Voc pode adicionar um parmetro para um mtodo utilizando a janela Detalhes classe. Observao

Visual C# Consolidado

1006

Para adicionar um parmetro a um delegado, consulte COMO: Criar um membro. Observao Embora um destruidor seja um mtodo, ele no pode ter parmetros.

Para adicionar um parmetro para um mtodo 1. Na superfcie do diagrama, clique no tipo contendo o mtodo ao qual voc deseja adicionar um parmetro. O tipo obtm foco e exibir seu contedo na janela Detalhes classe. 2. Na janela Detalhes classe, expanda a linha do mtodo ao qual voc deseja adicionar um parmetro. Uma linha de parmetro recuado aparece, contendo apenas um par de parnteses e as palavras <add parameter>. 3. Clique em <add parameter>, digite o nome do novo parmetro, e pressione ENTER. O novo parmetro adicionado ao cdigo do mtodo o mtodo e. Ele exibe na janela Detalhes classe e a janela Propriedades. 4. Como opo, especificar outros detalhes sobre o parmetro, como seu tipo.

COMO: Abrir a janela Class Details


Detalhes de classe uma janela voc pode usar para configurar os membros de um tipo. Por padro, a janela Detalhes classe aparece automaticamente quando voc abre um novo diagrama de classe (consulte COMO: Adicionar diagramas de classes a projetos). Voc tambm pode abrir a janela Detalhes classe explicitamente, das maneiras a seguir. Para abrir a janela Detalhes classe 1. 2. ou

Clique com o boto direito do mouse a superfcie de um diagrama de classe para exibir um menu de contexto. No menu de contexto, clique em Class Details Window.

Aponte para Other Windows no menu Exibir e clique em Class Details.

Consulte tambm

Atalhos de teclado para a janela Detalhes de classe


Voc pode usar o teclado, bem como o mouse para executar aes de navegao na janela Detalhes classe Usar o mouse Usar o mouse, voc pode alterar a aparncia da janela do detalhes classe e os dados ele exibe, em maneiras a seguir:

Visual C# Consolidado

1007

Clicar em qualquer clula editvel permite que voc editar o contedo da clula. Suas alteraes so refletidas em todos os locais que dados so armazenados ou exibido, incluindo na janela Propriedades do e no cdigo fonte. Clicar em qualquer clula de uma linha faz a janela Propriedades para exibir as propriedades para o elemento representados por aquela linha. Para alterar a largura de uma coluna, arraste o limite no lado direito do cabealho da coluna at que a coluna esteja da largura desejada. Voc pode expandir ou recolher compartimento ou ns propriedade clicando no sinal de mais ou menos smbolo esquerda da linha. A janela Detalhes de classe oferece vrios botes para criar novos membros da classe atual e para navegar entre os membros dos compartimentos na grade da janela Detalhes classe. Para obter mais informaes, consulte botes janela Detalhes classe.

Usando o teclado Observao Os acoplamentos de teclas a seguir foram escolhidos para especificamente para imitar a experincia de digitar cdigo. Use estas teclas para navegar a janela Detalhes classe: Chave (vrgula) Resultado Se o cursor estiver em uma linha de parmetro, digitar uma vrgula Move o cursor para o campo Nome do parmetro prximo. If the cursor is in the last parameter row of a method, it moves the cursor to the <add parameter> field, which you can use to create a new parameter. Literalmente se o cursor est em outro lugar na janela Detalhes classe, digitar uma vrgula adicionar uma vrgula no campo atual. Mova o cursor para o campo Nome da prxima linha na grade da janela Detalhes classe Membro.

(ponto-evrgula) Ou Parntese de fechamento ()) Tab

Move o cursor para o campo prximo, primeiro mover da esquerda para direita e ento superior para baixo. Se o cursor est movendo de um campo em que voc digitou texto, janela Detalhes classe processa esse texto e o armazena se ele no produz um erro. If the cursor is on an empty field such as <add parameter>, Tab moves it to the first field of the next row. Move o cursor para o campo prximo, primeiro mover da esquerda para direita e ento superior para baixo. If the cursor is on an empty field such as <add parameter>, it moves to the first field of the next row. Note that &lt;space&gt; typed immediately after a comma is ignored. Se o cursor for no campo Resumo, digitar um espao adicionar um caractere de espao. Se o cursor est na coluna de uma linha determinada, ocultar digitar um espao alternar o valor na caixa de seleo Ocultar. Alterna para outra janela do documento. Por exemplo, alterne da janela Detalhes classe para um arquivo de cdigo aberto.

< espao >

CTRL + TAB

ESC (ESCAPE) Se voc tiver comeado digitar texto em um campo, pressionando ESC atua

Visual C# Consolidado

1008

como uma chave de desfazer, revertendo o contedo do campo para o valor anterior. Se a janela Detalhes classe tem foco geral, mas nenhuma clula especfica tiver foco, pressionar ESC move o foco fora da janela Detalhes classe. Seta superiores Essas chaves mova o cursor de linha para outra verticalmente na grade da e inferiores seta janela Detalhes classe. Seta esquerda Seta direita Se o cursor for na coluna Nome, pressionar a seta esquerda recolhe o n atual na hierarquia (se ele estiver aberto). Quando o cursor est na coluna Nome, pressionando na SETA PARA DIREITA expande o n atual na hierarquia (se ele estiver recolhido).

Observaes teis sobre a janela Class Details


Observe as seguintes dicas para usar a janela Detalhes classe. Clulas editveis e no-editveis Todas as clulas na janela Detalhes classe so editveis com algumas excees:

O tipo inteiro somente leitura, quando, por exemplo, ele reside em um conjunto de referncia (consulte Exibio de informaes somente leitura.) Quando voc seleciona a forma no Class Designer, a janela Detalhes classe exibe seus detalhes em um estado somente leitura. Para indexadores, o nome somente leitura e o restante (tipo, modificador, Resumo) editvel. Todos os generics ter parmetros somente leitura na janela Detalhes classe. Para alterar um parmetro genrico, edite o cdigo fonte. O nome do parmetro do tipo que definido em um tipo genrico somente leitura. Quando cdigo Um do tipo interrompido (no analisvel), janela Detalhes classe exibe contedo do tipo como somente leitura. Voc pode exibir cdigo fonte clicando com o boto direito do mouse uma forma na janela Detalhes classe (ou o Class Designer) e, em seguida, clicando em Exibir cdigo. O arquivo de cdigo de fonte abre e rola para o elemento selecionado. Imediatamente Alterar cdigo fonte ser refletida na exibio de informaes de assinatura no Class Designer e a janela Detalhes classe. Se a janela Detalhes classe fechada ao tempo, as novas informaes estar visveis na prxima vez que abri-lo. Quando cdigo Um do tipo interrompido (no analisvel), janela Detalhes classe exibe contedo do tipo como somente leitura.

O cdigo janela Detalhes classe e fonte

Funcionalidade da rea de transferncia na janela Detalhes classe Voc pode copiar ou recortar campos ou linhas na janela Detalhes classe e col-los em outro tipo. Voc pode diminuir uma linha somente se ele for no somente para leitura. Quando voc cola a linha, janela Detalhes classe atribui um novo nome (derivado do nome da linha copiada) para evitar um conflito.

Visual C# Consolidado

1009

Exibio de informaes somente leitura


Class Designer e a janela Detalhes classe pode exibir o tipos (e membros de tipos) para o seguinte:

Um projeto que contm um diagrama de classe Um projeto referenciado a partir de um projeto que contm um diagrama de classe Um conjunto de mdulos (assembly) referenciado a partir de um projeto que contm um diagrama de classe

Nos dois ltimos casos, a entidade de referncia (um tipo ou membro) somente para leitura no diagrama de classe que representa. Um projeto inteiro ou partes dele, tais como arquivos individuais, podem ser somente leitura. Os casos mais comuns em que um projeto ou um de seus arquivos somente leitura so quando ele est sob controle Cdigo fonte-(e possvel check-out), ele existe em um conjunto externo, ou quando o sistema operacional considera os arquivos para ser somente leitura. Controle Code origemComo um diagrama de classe salvo como um arquivo em um projeto, voc precisa fazer checkout do projeto para salvar as alteraes feitas na Class Designer ou na janela Detalhes classe. Se voc no faa check-out do projeto, voc pode ainda salvar um diagrama de classe que descreve o projeto, mas no como parte do projeto. Projetos somente leitura O projeto pode ser somente leitura por uma razo diferente de controle cdigo fonte-. Fechar o projeto exibe uma caixa de dilogo perguntando se deve substituir o arquivo de projeto, descartar alteraes (no salvar) ou cancelar a operao de fechamento. Se voc optar por substituir, arquivos de projeto so sobrescritos e feita somente leitura. O novo arquivo diagrama de classe for adicionado. Tipos somente leitura Se voc tentarem salvar um projeto contendo um tipo cujo arquivo cdigo-fonte somente para leitura, caixa Save of Read-Only File de dilogo aparece, que oferece opes para salvar o arquivo com um novo nome ou novo local, ou para substituir o arquivo somente leitura. Se voc substituir o arquivo, a nova cpia mais somente leitura. Se um arquivo de cdigo contm um erro de sintaxe, formas Exibir cdigo no arquivo sero somente leitura-temporariamente at ser corrigido o erro de sintaxe. Formas de nesse estado exibir texto vermelho e um cone vermelho que exibe uma dica de ferramenta ler " O arquivo cdigo fonte contm um erro de anlise ". Um tipo referenciado (como um tipo .NET Framework), que existe em outro n de projeto ou em um n conjunto referenced-, indicado na superfcie de design Class Designer como somente leitura. Um tipo local, que existe no projeto voc tenha aberto, leitura-gravao, e sua forma sobre o Class Designer superfcie do design indicada as such. Indexadores so de leitura-gravao em cdigo e janela Detalhes classe, mas o indexador nome somente leitura.

Visual C# Consolidado

1010

Elementos da janela Class Details


A janela Detalhes classe til para exibindo detalhes membro das formas selecionadas no diagrama, e fornece uma experincia de edio para criar e modificar membros tipo. A janela Detalhes classe consiste de uma combinao de um controle de rvore e uma grade. O controle de rvore permite que voc expandir e recolher compartimentos membro para ver mais detalhes ou menos. rea da grade armazena dados em linhas e colunas. A grade exibe uma hierarquia de dois nveis de linhas. Linhas no nvel superior Exibir membros. Linhas no nvel inferior exibir parmetros, sob os mtodos s quais eles pertencem. As sees em In This Section descrevem aspectos das linhas exibidas pela janela Detalhes classe.

Linhas membro
Todos os membros descritos na janela Detalhes classe representam os membros do tipo selecionado no diagrama de classe. Existem quatro tipos de membros: mtodos, propriedades, campos, e eventos. Linhas membro fornecem Nvel baixo edio de membros tipo. Todas as linhas membro aparecem em ttulos que agrupam os membros por tipo. Por exemplo, todas as propriedades aparecer sob o ttulo Properties, que, como um n na grade, pode ser expandida ou recolhida. Cada linha membro exibe os seguintes elementos:

Member Icon Cada tipo de membro representado por seu prprio cone. Apontando o mouse para o cone membro exibe o membro assinatura. Clicando no cone membro ou em espao em branco para a esquerda do cone membro seleciona a linha.

Member Name A Name coluna em uma linha membro exibe o nome do membro. Este nome tambm exibido na propriedade Name na janela Propriedades. Voc pode usar essa clula para alterar o nome de qualquer membro com permisses somente leitura. Apontando o mouse para o nome do membro exibe o nome do membro se a Name coluna muito estreita para mostrar o nome completo.

Member Type A Member Type clula usa IntelliSense (exceto em J#), que permite que voc escolha em uma lista de todos os tipos disponveis no projeto atual ou projetos referenciados.

Member Modifier Nesta coluna, voc pode alterar o Modificador de visibilidade de um membro a um Public (public. (private (internal, Private), Friend ou Default (protected (protected internal), Protected Friend,) Protected))

<add member> A ltima linha na janela Detalhes classe contm o texto <add member> na clula Name. Clicando nesta clula permite que voc criar um novo membro. Para obter mais informaes, consulte: COMO: Criar um membro.

Member properties in the Properties window

Visual C# Consolidado

1011

A janela Detalhes classe exibe um subconjunto das propriedades membro que so exibidos na janela Propriedades. Alterar uma propriedade em um local atualiza o valor da propriedade globalmente, incluindo a exibio de seu valor em outro local.

Summary A Summary clula expe um resumo das informaes sobre o membro. Clicando na elipse na clula Summary permite que voc se exibir ou editar informaes sobre o Summary, Return Type., e Remarks para o membro

Hide Quando a caixa de seleo Ocultar marcada, o membro no exibido no tipo.

Linhas de parmetro
Parmetros de um membro so agrupados juntos nas linhas imediatamente sob o membro ao qual eles se aplicam. Linhas parmetro conter os seguintes itens:

Parameter Icon Trs tipos de cones aparecem esquerda de linhas de parmetro: An opening parenthesis '(' indicates the first parameter of a member. Um parntese de fechamento ') '. indica a linha aps o ltimo parmetro do membro Esta linha contm as palavras <add parameter>. Um separador de parmetro (. ', ') aparece esquerda de cada parmetro aps a primeira que uma vrgula, Parameter Name A Name coluna em uma linha de parmetro exibe o nome do parmetro. Este nome tambm exibido na propriedade Name na janela Propriedades. Voc pode usar essa clula para alterar o nome de qualquer parmetro com permisses somente leitura. Apontando para o nome do parmetro exibe o nome do parmetro se a Name coluna muito estreita para mostrar o nome completo.

o o o

Parameter Type A Parameter Type clula usa IntelliSense, que permite que voc escolha em uma lista de todos os tipos disponveis no projeto atual ou projetos referenciados.

Parameter Modifier A Modifier clula em uma linha de parmetro aceita e exibe o novo modificador do parmetro. Para usar a caixa de listagem drop-down para selecionar In, In/Out, insira um novo modificador de parmetro, e Out.

<add parameter> A ltima linha de parmetro de um membro contm o texto <add parameter> na clula Name. Permite que voc criar um novo parmetro clicando nesta clula. Para obter mais informaes, consulte COMO: Adicionar um parmetro a um mtodo.

Parameter properties in the Properties window A janela Propriedades exibe as mesmas propriedades de parmetro exibidas na janela Detalhes classe: Modifier., Name e Type Alterar uma propriedade em um local atualiza o valor da propriedade globalmente, incluindo a exibio de seu valor em outro local.

COMO: Herdar de um Tipo Genrico


Voc pode usar Class Designer para criar um tipo herdeira de um tipo genrico.

Visual C# Consolidado

1012

Observao Usando Class Designer, voc pode visualizar existentes tipos genricos, mas voc pode criar novos tipos genricos. Voc tambm no pode modificar parmetros tipo em existentes tipos genricos. Para herdar de um tipo genrico 1. 2. Na Toolbox, selecione a Inheritance linha. Na diagrama de classe, desenhe uma linha de herana do tipo derivado para o tipo base. (Neste procedimento, o tipo base um tipo genrico.) Uma linha de herana do tipo derivado apontando para o tipo base ser exibida na superfcie do design. A Linha de Herana obtm foco e sua exibio propriedades na janela Propriedades. A Type Arguments propriedade na janela Properties exibe valores padro para a linha de herana. Alterar o valor da propriedade Type Arguments para coincidir com os tipos desejados para o tipo derivado.

COMO: Definir herana entre tipos


Em Class Designer, voc pode definir uma relao de herana entre dois tipos em um diagrama de classe. Para definir herana entre dois tipos 1. 2. 3. 4. A partir do projeto no Solution Explorer, abra o arquivo diagrama de classe (.CD). Na caixa de ferramentas Class Designer, clique na Inheritance ferramenta. Mova o ponteiro para o diagrama de classe. O ponteiro se transformar em um cursor de herana. No diagrama de classe, arraste uma linha a partir da forma que representa o tipo derivado para a forma que representa o tipo base. Dica O cursor de herana mudar para um cursor conectado quando voc pode criar uma relao de herana. O cursor de herana mudar para um cursor soltar no-quando voc no pode criar uma relao de herana. 5. Uma linha de herana com uma seta apontando para o tipo base do tipo derivado aparece entre as duas formas no diagrama. A forma a tipo do tipo derivado tambm exibe o nome do tipo base. Observe que se a classe pai uma classe abstrata e contm pelo menos um membro abstract, esses participantes ser automaticamente implementadas em classes abstratas no-inheriting. Para obter mais informaes, consulte COMO: Implementar uma classe abstrata.

6.

COMO: Definir associaes entre tipos


Linhas de associao em Class Designer mostrar como classes em um diagrama esto relacionadas. Uma linha de associao representa uma classe que o tipo de uma propriedade

Visual C# Consolidado

1013

ou campo de outra classe no projeto. Linhas de associao geralmente so usadas para ilustrar os relacionamentos entre classes no seu projeto mais importantes. Enquanto voc poderia exibir todos os campos e propriedades como associaes, faz mais sentido para mostrar somente os membros importantes como associaes, dependendo do que voc pretende enfatizar no diagrama. (Voc pode mostrar membros menos importantes membros como normais ou ocult-las totalmente.) Observao Class Designer oferece suporte somente associaes unidirecionais. Para definir um linha de associao no diagrama de classe 1. 2. Na caixa de ferramentas, selecione o Association item. Desenhar uma linha entre as duas formas voc deseja vincular com uma associao. Uma nova propriedade criada na primeira classe. Essa propriedade exibe como um linha de associao (no como uma propriedade em um compartimento na forma) com um nome padro. Seu tipo a forma para o qual a linha de associao aponta. Para alterar o nome de uma associao

Na superfcie do diagrama, clique no rtulo do linha de associao e edit-lo.

- ou 1. Clique na forma que contm a propriedade que mostrada como uma associao. A forma obtm foco e seus membros exibir na janela Detalhes classe e na janela Propriedades. 2. Na janela Detalhes classe ou a janela Propriedades, edite o campo Nome para essa propriedade e pressione ENTER. O nome ser atualizado na janela Class Details, na linha de associao, na janela Propriedades, e no cdigo.

COMO: Excluir formas de tipos e cdigo associado de diagramas classe


Voc pode excluir uma forma e seu cdigo associado usando o Class Designer. Este procedimento descreve como excluir ambos simultaneamente. Para excluir uma forma Tipo e seu cdigo subjacente 1. 2. Clique com o boto direito do mouse na forma na superfcie do design. Selecione Delete from Code a partir do menu de contexto. A forma removida do diagrama e seu cdigo subjacente excludo do projeto, incluindo qualquer comentrio e atributos ao redor do tipo e quaisquer dados unmodeled dentro do tipo, como comentrios regulares, espao em branco, e corpos mtodo.

Visual C# Consolidado

1014

COMO: Aplicar atributos personalizados a tipos ou membros de tipo


Voc pode aplicar um atributo personalizado para um tipo ou a um membro de um tipo. Para obter mais informaes sobre atributos, consulte Atributos (guia de programao C#), Atributos referncia alfabtica. ou Atributos no Visual Basic Para aplicar um atributo personalizado a um tipo 1. 2. 3. Clique em um diagrama de classe o tipo na forma. Na janela Propriedades, prximo propriedade Custom Attributes para o tipo, clique no boto de reticncias (). A Attribute Editor caixa de dilogo exibida. No Editor atributo, digite um ou mais atributos personalizados. Separar atributos em novas linhas, mas no fazer coloque-os entre colchetes. Quando voc tiver terminado, clique em OK. Voc inseriu os atributos personalizados so aplicados ao tipo. Para aplicar um atributo personalizado a um membro tipo 1. 2. 3. Clique no nome do membro na forma seu do tipo em um diagrama de classe, ou sua linha na janela Detalhes classe. Na janela Propriedades, localize a Custom Attributes propriedade para o membro. Digite um ou mais atributos personalizados (um por linha), e pressione ENTER. Voc inseriu os atributos personalizados so aplicados ao tipo.

COMO: Exibir Herana entre Tipos


Em Class Designer, voc pode exibir o relacionamento de herana, se existir, entre um tipo base e seus tipos derivados no diagrama de classe. Uma relao de herana pode existir entre duas classes, entre duas interfaces, ou entre uma classe e uma interface. Observao Voc pode definir uma relao de herana se no existe nenhum. Para obter mais informaes, consulte COMO: Definir herana entre tipos. Para exibir o tipo base 1. 2. Sobre o diagrama de classe, selecione o tipo para que voc deseja exibir a classe base ou interface. No menu Class Diagram, escolha Show Base Class ou Show Base Interfaces como apropriado. O tipo na classe base ou interface aparecer selecionado no diagrama. Todas as linhas ocultas de herana agora aparecem entre as duas formas. Clique com o boto direito do mouse tambm o tipo cujo tipo base voc deseja exibir, e escolha Show Base Class ou Show Base Interfaces como apropriado. Para exibir os tipos derivados 1. Sobre o diagrama de classe, selecione o tipo para o qual voc deseja exibir a classes derivadas e interfaces.

Visual C# Consolidado

1015

2.

No menu Class Diagram, escolha Show Derived Classes ou Show Derived Interfaces como apropriado. O tipo derivado classes ou interfaces aparecem no diagrama. Todas as linhas ocultas de herana agora aparecem entre as formas.

Clique com o boto direito do tambm mouse o tipo para que voc deseja ver seus tipos derivados, e escolher Show Derived Classes ou Show Derived Interfaces conforme apropriado.

COMO: Exibir tipos derivados


Diagramas de classe podem exibir relacionamentos entre tipos, incluindo as relaes de herana. Uma relao de herana pode existir entre duas classes, entre duas interfaces, ou entre uma classe e uma interface. Observao Nome Tipo Base um tipo sempre ser exibido dentro do cabealho forma. No caso de vrias interfaces, onde a lista pode obter longa, a lista pode estar recolhida para economizar espao. Este procedimento supe que exista uma relao de herana entre o tipo e sua classe base ou interface. Se nenhuma relao de herana existir, voc pode criar um seguindo as etapas no COMO: Definir herana entre tipos. Observao Para exibir um tipo derivado, uma relao de herana deve existir entre dois tipos. Para definir uma relao de herana, consulte COMO: Definir herana entre tipos. Para exibir os tipos derivados o tipo selecionado 1. 2. Sobre o diagrama de classe, selecione o tipo para que voc deseja exibir seus tipos derivados. No menu Class Diagram, Show Derived Classes ou Show Derived Interfaces conforme apropriado. As formas que representam a classes derivadas ou interfaces aparea selecionadas no diagrama. Todas as linhas ocultas de herana aparecero no diagrama. Voc pode tambm clique com o boto direito do mouse o tipo e escolha Show Derived Classes ou Show Derived Interfaces como apropriado.

COMO: Remover formas de tipos de diagramas de classe


Em Class Designer, voc pode remover uma forma Tipo do diagrama de classe sem afetar o tipo o cdigo subjacente. Observao Removendo formas Tipo de um diagrama de classe afeta apenas esse diagrama e no outros

Visual C# Consolidado

1016

diagramas no seu projeto. Para remover uma forma de um diagrama de classe 1. 2. Na diagrama de classe, selecione a forma tipo que deseja remover do diagrama. No menu Edit, escolha Remove from Diagram. A forma Tipo e nenhuma linha de associao ou herana conectado a forma mais aparecem no diagrama. Voc pode tambm selecione a forma e pressionar a tecla DELETE ou clique com o boto direito do mouse na forma e escolha Remove from Diagram.

COMO: Exibir compartimentos em formas de tipo


No Class Designer, voc pode exibir os membros de tipos sobre o diagrama de classe. Compartimentos dentro da forma tipo exibir os membros do tipo. Para obter mais informaes sobre como exibir e criar tipos, consulte COMO: Exibir tipos existentes. Observao Na diagrama de classe, formas tipo aparecem recolhidas por padro para simplificar o modo de exibio do diagrama. Voc pode expandir a forma Tipo para exibir seu contedo. No entanto, compartimentos sem membros no aparecem na forma tipo. Nomes compartimento descrever a natureza dos membros tipo e o idioma do projeto e a ordem de grupo selecionado para exibir esses participantes dependem. Por exemplo, se voc agrupar por tipo, membros tipo compartment nomes, como Fields, Properties, Methods. e Events pode aparecer na forma Se voc agrupar membros alfabeticamente, somente um compartimento chamado Members aparecer. Compartment nomes, como Public, Protected se voc agrupar membros por modificador de acesso,,. ou Private pode aparecer Para obter mais informaes, consulte COMO: Agrupar membros de tipo. Para expandir ou recolher uma forma tipo 1. 2. 3. A partir do projeto no Solution Explorer, abra o arquivo diagrama de classe (.CD). Sobre o diagrama de classe, selecione a forma tipo. No menu Class Diagram, escolha Expand ou Collapse. A forma Tipo para exibir seu compartimentos expande ou recolhe para ocultar seu compartimentos. Voc tambm pode expandir ou recolher a forma, clicando no boto cumulativo ou rolldown, que aparece como uma divisa, sobre a forma tipo ou clicando com o boto direito do mouse na forma Tipo e escolhendo Expand ou Collapse no menu de atalho. Quando a forma tipo estiver expandida, formas tipo mostram seus compartimentos por padro. No entanto, voc pode ocultar compartimentos individuais e membros dentro da forma tipo para enfatizar determinados aspectos do tipo no diagrama. Ocultando ou mostrando compartimentos e seus membros no afeta o cdigo. Para ocultar um compartimento 1. No diagrama de classe, expanda a forma tipo se necessrio.

Visual C# Consolidado

1017

2. 3.

Na forma tipo, clique no nome compartimento. No menu Class Diagram, escolha Hide Compartment. O compartimento est oculto dentro da forma tipo expandida.

Tambm pode clique com o boto direito do mouse no nome compartimento e escolha Hide Compartment a partir do menu de atalho. Voc tambm pode selecionar as caixas de seleo na coluna Hide da janela classe detalhes para todos os membros no compartimento para ocultar o compartimento Para obter mais informaes, consulte COMO: Abrir a janela Class Details. Para mostrar um compartimento 1. 2. Abrir ou exibir a janela Detalhes classe se ele estiver fechado. Na janela Class Details, desmarque a caixa de seleo na coluna Hide para o compartimento voc deseja mostrar. O compartimento e seus membros aparecem na forma tipo no diagrama de classe.

COMO: Exibir detalhes do tipo:


Voc pode exibir os detalhes para tipos mostrados em um diagrama de classe utilizando a janela Class Details. O controle rvore e Grade janela Detalhes classe torna possvel para que voc possa exibir detalhes para todos os tipos, bem como edit-los para tipos de leitura / gravao. Dica Verifique se a janela Detalhes classe est aberta. Para obter mais informaes, consulte COMO: Abrir a janela Class Details. Observao A janela Detalhes classe, diagrama de classe, e janela Propriedades todos exibir informaes sobre o elemento que tem foco. Voc pode usar todas as janelas trs simultaneamente para exibir informaes sobre o elemento. Para mais informaes, consulte Janela Properties. Para exibir detalhes para um tipo 1. 2. No projeto no Solution Explorer, abra o diagrama de classe para o tipo. Sobre o diagrama de classe, selecione o tipo. Se a Class Details janela estiver aberta, ele exibir os detalhes para os membros do mesmo tipo. Para ver nome cada membro , tipo, modificador, e os comentrios que tiver sido inseridos para ele. Se a forma somente para leitura, voc no pode editar qualquer um desses campos. Em qualquer forma, voc pode ocultar ou mostrar o membro ao marcar ou desmarcar a caixa de seleo na coluna Hide. Para exibir detalhes de um tipo diferente, clique em desse tipo. Quando o foco alterna para outro tipo, seus detalhes so mostrados na janela Class Details.

Visual C# Consolidado

1018

COMO: Alternar entre notao de membro e notao de associao


Em Class Designer, voc pode alterar da maneira a diagrama de classe representa um relacionamento de associao entre dois tipos da notao membro em notao de associao e vice-versa. Membros exibidos como linhas de associao geralmente fornecem uma visualizao de como tipos esto relacionados til. Observao Relaes associao podem ser representadas como um propriedade de membro ou campo. Para alterar notao membro para notao de associao, um tipo deve ter um membro de outro tipo. Para alterar notao de associao para notao membro, os dois tipos devem estar conectados por um linha de associao. Para obter mais informaes, consulte COMO: Definir associaes entre tipos.Se o projeto contm vrios diagramas de classe, as alteraes que voc faz para a forma como um diagrama exibe relaes de associao afetaro somente esse diagrama. Para alterar a maneira como um outro diagrama exibe relaes de associao, abra ou exibir esse diagrama e execute estas etapas. Para alterar notao membro para notao de associao 1. 2. Do n de projeto em Solution Explorer, abra o arquivo diagrama de classe (.CD). Na forma tipo no diagrama de classe, clique com o boto direito do mouse no propriedade de membro ou campo representando a associao, e escolha Show as Association. Dica Se nenhum propriedades ou campos estiverem visveis na forma tipo, os compartimentos na forma podem estar recolhidos. Para expandir a forma tipo, clique duas vezes no nome compartimento ou clique com o boto direito do mouse na forma tipo, e escolha Expand. 3. O membro desaparece do compartimento na forma tipo e um linha de associao aparece para conectar os dois tipos. A linha de associao rotulada com o nome do campo ou propriedade.

Para alterar notao de associao para notao membro

Na diagrama de classe, clique com o boto direito do mouse a linha de associao, e escolha Show as Property ou Show as Field como apropriado. A linha de associao desaparecer, e a propriedade exibe no compartimento apropriado em sua forma tipo no diagrama.

COMO: Exibir membros de tipo


Em Class Designer, voc pode mostrar ou ocultar os membros em seus compartimentos nas formas tipo no diagrama de classe Ocultar membros em seus compartimentos pode ajudar a simplificar o modo do diagrama ou para enfatizar determinados aspectos dos tipos que aparecem no diagrama. Observao

Visual C# Consolidado

1019

O diagrama de classe exibe membros em compartimentos por padro. Quando todos os membros em um compartimento estiverem ocultas, o compartimento ficar ocultos. Ocultando ou mostrando compartimentos e seus membros no afeta o cdigo. Para obter mais informaes, consulte COMO: Exibir compartimentos em formas de tipo. Para mostrar membros ocultos em uma forma tipo

No diagrama de classe, clique com o boto direito do mouse no nome compartimento e escolha Show All Members. Membros ocultos aparecem no compartimento.

Voc tambm pode mostrar um membro tipo usando a janela Detalhes classe desmarcando a Hide caixa de seleo para o membro. Para obter mais informaes, consulte COMO: Abrir a janela Class Details. Para ocultar um membro de uma forma tipo

No diagrama de classe, clique com o boto direito do mouse no nome membro e escolha Hide. Deixa o membro visvel no compartimento.

Voc tambm pode ocultar um membro usando a Class Details janela, marcando a Hide caixa de seleo para o membro. Para obter mais informaes, consulte COMO: Abrir a janela Class Details.

COMO: Adicionar diagramas de classes a projetos


Voc pode comear criando, editando, e classes refactoring e outros tipos em um projeto do Visual Studio usando Class Designer adicionando um diagrama de classe para o projeto. Voc pode adicionar a seu projeto, Diagramas de classe em branco ou voc pode criar diagramas de tipos existentes no seu projeto. Cada projeto pode conter vrios diagramas de classe, til para visualizar cdigo diferentes reas de projeto. Para adicionar um diagrama de classe a um projeto 1.
o o

No Solution Explorer, clique com o boto direito do mouse no nome do projeto e execute uma das opes a seguir: Clique em Add New Item. Aponte para Add, e clique em New Item. A Add New Item caixa de dilogo ser exibida. No painel Modelos da caixa Add New Item de dilogo, execute uma das opes a seguir: Para criar um diagrama de classe com o nome padro, clique duas vezes Class Diagram. Para criar um diagrama de classe com outro nome, clique em Class Diagram, alterar o nome na caixa Name, e clique em Add. O diagrama de classe aberta no Class Designer e aparece como um arquivo com uma extenso.CD no Solution Explorer dentro da hierarquia do projeto. Caixa de ferramentas Class Designer aparece e contm formas e linhas voc pode arrastar para o diagrama.

2.
o o

3.

Para adicionar vrios diagramas de classe, repita as etapas no procedimento. Observao que voc tambm pode criar um diagrama de classe para sua soluo, clicando no Class Diagram boto no Solution Explorer, ou escolhendo View Class

Visual C# Consolidado

1020

Diagram dos menus de contexto de Class e Project Ns de Solution Explorer e Namespace. e Type Ns de Class View

COMO: Exibir tipos existentes


Em Class Designer, para exibir a estrutura de um tipo existente em um projeto do Visual Studio, exibindo sua forma correspondente em um diagrama de classe. A forma contm compartimentos que exibir os membros pertencentes ao tipo. Voc pode exibir tipos local e referncia. Um tipo local existe em um projeto aberto no momento e leitura / gravao. Um tipo de referncia existe em outro projeto ou em um conjunto de referncia e somente leitura. Para criar novos tipos em diagramas de classe, consulte COMO: Criar Tipos em Diagramas de Classe. Para exibir tipos em um projeto em um diagrama de classe 1. Do n de projeto em Solution Explorer, abrir um arquivo diagrama de classe (.CD). Dica Se nenhum diagrama de classe existir, adicionar um diagrama de classe ao projeto. Para obter mais informaes, consulte COMO: Adicionar diagramas de classes a projetos. 2. No n de projeto em Solution Explorer, arraste um arquivo cdigo fonte para o diagrama de classe. Formas que representam os tipos definidos no arquivo de cdigo de origem aparecem no diagrama na posio onde voc arrastado o arquivo. Tambm pode exibir tipos no projeto, arrastando um ou mais tipos do n de projeto em Class View para o diagrama de classe. Dica Se no estiver aberto, Exibir Classe Abrir exibir classe no menu View. Para obter mais informaes sobre modo classe, consulte Exibir classes e seus membros. Para exibir tipos nos locais padro no diagrama, selecione um ou mais tipos no modo de classe, clique com o boto direito do mouse os tipos selecionados, e escolha View Class Diagram. Observao Se um diagrama de classe fechado contendo o tipo j existe no projeto, o diagrama de classe abrir para exibir a forma tipo. No entanto, se nenhum diagrama de classe contendo o tipo existir no projeto, Class Designer cria um novo diagrama de classe no projeto e abre o arquivo para exibir o tipo.

Visual C# Consolidado

1021

Quando voc primeiro exibir um tipo no diagrama, sua forma aparece recolhida por padro. Voc pode expandir a forma para ver o respectivo contedo. Para obter mais informaes, consulte COMO: Exibir compartimentos em formas de tipo. Para exibir um projeto ou espao para nome em um diagrama de classe

No Solution Explorer (para projetos) ou exibio classe (para espaos para nome) clique com o boto direito do mouse no projeto ou espao para nome e escolha Exibir no diagrama. Um diagrama classe populated auto- criado.

Ententendo um cdigo que voc no escreveu


Voc pode usar o Class Designer como uma ferramenta para ajud-lo a entender classes e tipos escritos por outras pessoas. A ferramenta exibe uma representao grfica do cdigo. Voc pode personalizar esta exibio para atender s suas preferncias; por exemplo, voc pode mostrar mais detalhes ou menos, grupo e filtrar membros de tipos, explicitamente ocultar membros, e exibir linhas que indicam relacionamentos, como a herana. Tambm pode optar por visualizar o mesmo projeto de maneiras diferentes. Para fazer isso, crie vrios diagramas de classe no projeto e ento personalizar cada uma para enfocar detalhes diferentes. Para obter mais informaes, consulte COMO: Adicionar diagramas de classes a projetos.

COMO: Agrupar membros de tipo


Em Class Designer, voc pode agrupar membros tipo em seus compartimentos no diagrama de classe por seu modificador de acesso, tipo, como Public ou Private. ou alfabeticamente Para membros de grupo de um tipo 1. 2. No projeto no Solution Explorer, abra o diagrama de classe para o tipo. No menu Class Diagram, escolha a ordem de grupo que voc deseja. Todas as formas no diagrama atual Atualizar seus compartimentos para refletir a ordem selecionada. Voc tambm pode definir a ordem de grupo clicando com o boto direito do mouse um local em branco no diagrama e selecionando uma ordem de grupo a partir do menu de atalho, definindo a Group By propriedade para o diagrama na janela Propriedades, ou na barra de ferramentas Class Designer.

COMO: Adicionar comentrios a diagramas de classe


Voc pode usar formas de comentrio para anotar diagramas de classe. Um forma de comentrio possui uma propriedade, Text,. no qual voc pode digitar texto Formas comentrio existem apenas na superfcie do diagrama e no no cdigo. Um comentrio reside em modo de exibio diagrama de classe em Class Designer; Se voc abrir uma segunda diagrama de classe at o mesmo projeto, comentrios voc criou no primeiro modo so no visveis. Se voc excluir um diagrama, todos os comentrios continha tambm sero excludos. Voc pode redimensionar um forma de comentrio mas no pode alterar outros aspectos da sua aparncia, como seu tamanho cor, fonte, ou fonte de plano de fundo.

Visual C# Consolidado

1022

Para adicionar um comentrio 1. 2. Arraste um comentrio de at o diagrama de classe. o Class Designer Toolbox Clique no novo forma de comentrio no diagrama e digite o texto desejado.

Personalizando diagramas de classe


Voc pode alterar a maneira que diagramas de classe exiba informaes sobre o projeto. Por exemplo, voc pode alterar tamanho aparente todo o diagrama clicando na barra de ferramentas Class Designer. e Zoom Out botes (ou por clicando uma quantidade Zoom na caixa de listagem) a Zoom In Definir o zoom no afeta como um diagrama de classe impresso. Observao No possvel alterar a terminologia exibida para tipos do o projeto na superfcie do diagrama. Terminologia dependente sobre a linguagem do projeto. Os mtodos disponveis para alterar diagramas so resumidos na lista a seguir:

Roteamento de linha manual. Primeiro, clique em um linha de associao para selecionlo. Em seguida, voc pode mover a linha, ou segmentos de linha, esquerda, direita, para cima, ou para baixo. Pontos de extremidade da linha permanecem ancorados nas formas se conecta. Posicionamento rtulo de linha associao. Primeiro, clique no rtulo de um linha de associao para selecion-lo. Em seguida, voc pode arrastar o rtulo para outra posio no diagrama. Ocultar linha de associao. Com o boto direito do mouse uma linha de associao exibe um menu de contexto. Em seguida, se voc clicar em Show as Property, a linha removida do diagrama, mas a associao aparecer como uma propriedade em uma forma. Consulte COMO: Alternar entre notao de membro e notao de associao. Mostrar e ocultar formas. Para ocultar forma um tipo, clique com o boto direito do mouse em sua rea de cabealho e clique em Remove from Diagram. Para mostr-la novamente, arraste-a para o diagrama de Class View. Mostrar e ocultar membros tipo. Usando o Class Designer ou janela Detalhes classe, voc pode mostrar membros um tipo ou ocult-las Para obter mais informaes, consulte COMO: Exibir membros de tipo. Expandir e recolher formas. Para recolher uma forma, clique com boto direito mouse sua rea de cabealho e clique em Collapse. Isso oculta todos os compartimentos a forma. Para expandir a forma, clique com o boto direito do mouse e clique em Expand. Expandir e recolher compartimentos forma. Para recolher um compartimento em uma forma, clique com o boto direito do mouse no rtulo compartimento e clique em Collapse. Para exibir o compartimento, clique na forma (para que ele foco) e desmarque caixas o compartimento Hide na janela Detalhes classe. Agrupar e classificar membros. Voc pode agrupar membros um tipo de vrias maneiras. Para obter mais informaes, consulte COMO: Agrupar membros de tipo.

Visual C# Consolidado

1023

COMO: Copiar elementos de diagrama de classe para um documento do Microsoft Office


Voc pode copiar um, vrios ou todos as formas de um diagrama de classe em outros documentos. Se a operao de cpia duplica a imagem visual da forma ou seu cdigo subjacente de depende do tipo de documento no qual col-lo. Para copiar um nico elemento

Clique com boto direito mouse a forma e escolha Copy as Image. A forma colocada na rea de transferncia.

Para copiar vrios elementos 1. 2. Na superfcie do diagrama, arraste o ponteiro para selecionar as formas que voc deseja copiar. Clique com boto direito mouse uma das formas selecionadas e escolha Copy as Image. Todas as formas selecionadas so colocadas na rea de transferncia. Para copiar todos os elementos em um diagrama de classe 1. 2. Clique com o boto direito do mouse a superfcie de diagrama e escolha Select All. Clique no Copy cone na barra de ferramentas Padro, ou selecione Copy as image no menu Editar. Formas do todo o diagrama so colocadas na rea de transferncia. Depois voc copiados sua seleo, col-lo usando o Paste Comando no programa de destino. Programas orientado Text-exibir o cdigo por trs do forma selecionada ou formas, enquanto programas orientado a elementos grficos-exibir a imagem da forma ou formas que voc copiou. Observao Voc tambm pode escolher Copy em vez de Copy as Image. Copia Copy a imagem como um bitmap regular, e Copy as Image copia a imagem como uma imagem vetorial, que melhor para a maioria dos aplicativos do Office.

COMO: Imprimir diagramas de classe


Voc pode imprimir um diagrama de classe usando o recurso de impresso do Visual Studio. Para imprimir um diagrama de classe 1. 2. Exibir o diagrama de classe. (Se necessrio, selecione a guia diagrama de classe para exibi-la.) Clique Impresso no menu Arquivo. O diagrama de classe inteira ser impressa. Observe que voc pode precisa ajustar as configuraes na caixa de dilogo Instalao pgina a fim de imprimir em um tamanho adequado.

Visual C# Consolidado

1024

COMO: Ignorar membros de tipo


Em Class Designer, voc pode permitir membros como mtodos e propriedades em uma classe filho para substituir membros herdados de uma classe base. Substituir um membro possvel somente se aplica a seguinte circunstncia:

O mtodo base seja substitudo deve ser virtual, abstract, ou substituir. (Ele no pode ser no-virtual ou esttico.) 1. No diagrama de classe, clique com o boto direito do mouse em uma forma de classe, e escolha Intellisense DEPOIS Override Members. Ser exibida uma caixa de dilogo Exibir membros substituvel. 2. Na lista, escolha um membro. Um membro com o mesmo nome, modificador de acesso, valor de retorno, e assinatura aparecer como selecionado na classe, e sua Override propriedade definida como True.

Para substituir um membro

COMO: Renomear tipos e membros de tipo


Em Class Designer, voc pode renomear um tipo ou um membro de um tipo no diagrama de classe ou na janela Propriedades do. Na janela Detalhes classe, voc pode editar o nome do membro mas no um tipo. Renomear um tipo ou membro tipo propaga para todas as janelas e locais de cdigo onde o nome antigo apareceu. Para renomear um nome no Class Designer 1. 2. 1. No diagrama de classe, selecione o tipo ou membro. O nome do membro se tornar editvel. Digite o novo nome para o tipo ou membro tipo Para exibir a janela Detalhes classe, clique com o boto direito do mouse no tipo ou membro Tipo e escolha Class Details. A janela Detalhes classe aparece. 2. 3. Na coluna Name, edite o nome do membro do tipo Para mover o foco fora da clula, pressione a tecla Enter ou clique na clula fora do. Observao Na janela Detalhes classe, voc pode editar o nome do membro mas no um tipo. Para renomear um nome na janela Propriedades 1. No diagrama de classe ou na janela Detalhes classe, clique com o boto direito do mouse no tipo ou membro e escolha Properties. A janela Propriedades aparece e exibe propriedades para o tipo ou membro tipo. 2. Na propriedade Name, alterar o nome do tipo ou membro tipo. O novo nome propaga para todas as janelas e locais de cdigo no projeto atual onde o nome antigo apareceu. Para renomear um nome na janela Detalhes classe

Visual C# Consolidado

1025

COMO: Mover um membro de tipo de um tipo para outro


Usando Class Designer, pode mover um membro Tipo de um tipo para outro tipo, se ambas estiverem visveis no diagrama de classe atual. Para mover um membro Tipo de um tipo para outro 1. 2. Em um tipo que esteja visvel na superfcie de design, clique com o boto direito do mouse no membro voc deseja mova para outro tipo, e clique Cut. Clique com o boto direito do mouse no tipo de destino e clique em Paste. A propriedade ser removido do tipo de fonte e aparece em Tipo de destino.

COMO: Implementar uma interface


Em Class Designer, voc pode implementar uma interface no diagrama de classe conectando-lo a uma classe que fornece cdigo para os mtodos de interface. Class Designer gera um implementao de interface e exibe a relao entre a interface e a classe como uma relao de herana. Voc pode implementar uma interface desenhando uma Linha de Herana entre a interface e a classe ou arrastando a interface da exibio classe. Dica Voc pode criar interfaces da mesma maneira que criar outros tipos. Se a interface existe mas no exibido no diagrama de classe, em seguida, primeiro exiba-o. Para obter mais informaes, consulte COMO: Criar Tipos em Diagramas de Classe e COMO: Exibir tipos existentes. Para implementar uma interface desenhando uma Linha de Herana 1. 2. Na diagrama de classe, exibir a interface e a classe ser que implementam a interface. Desenhe uma linha de herana da classe e a interface. Um pirulito aparece anexado classe e um rtulo com o nome da interface identifica a relao de herana. O Visual Studio gera stubs para todos os membros de interface. Para obter mais informaes, consulte COMO: Definir herana entre tipos. Para implementar uma interface a partir da janela Exibir Classe 1. 2. Na diagrama de classe, exibir a classe que voc deseja que implementam a interface. Abra Exibir Classe e localize a interface. Dica Se no estiver aberto, Exibir Classe Abrir exibir classe no menu View. Para obter mais informaes sobre modo classe, consulte Exibir classes e seus membros. 3. Arraste o n interface at a forma de classe no diagrama. Um pirulito aparece anexado classe e um rtulo com o nome da interface identifica a relao de herana. O Visual Studio gera stubs para todos os membros de interface; neste momento, a interface implementada.

Visual C# Consolidado

1026

COMO: Implementar uma classe abstrata


Voc pode usar Class Designer para implementar uma classe abstrata. O seguinte para este procedimento, ser adotado:

O projeto contm uma classe abstrata. A classe abstrata contm membros abstratos. A classe abstrata a classe base em uma relao de herana com outra classe. (A classe derivada no precisa ser uma classe abstrata.) Clique com o boto direito a classe derivada em seguida, escolha Intellisense, escolha Implement Abstract Class. Todos os membros da classe base abstratos so implementados na classe derivada.

Implementar uma classe abstrato

COMO: Extrair para interface (C# somente)


Voc pode extrair um ou mais membros pblicos de um tipo em uma nova interface. Para extrair membros para uma nova interface 1. Na Class Designer, clique com o boto direito do mouse o tipo que contm o membro ou membros voc deseja extrair, aponte para Refactor, e clique em Extract Interface. A caixa de dilogo extrair interface exibe valores padro para o nome da interface e o nome do arquivo de cdigo no qual ela vai ser declarada. Aceite os valores padro ou alter-las. 2. No painel Select public members to form interface, marque ou desmarque a caixa de seleo ao lado os membros que voc deseja extrair para a nova interface, e clique em OK. Uma nova interface criado, e o arquivo que abriga ele adicionado ao projeto.

COMO: Reordenar parmetros (C# somente)


Na Class Designer, voc pode alterar a ordem dos parmetros de mtodo em tipos Para alterar a ordem dos parmetros 1. 2. No diagrama de classe, expanda a forma tipo e o Methods compartimento. No Methods compartimento, clique com o boto direito do mouse com os parmetros voc deseja, aponte para Refactor, e escolha Reorder Parameters o mtodo. A Reorder Parameters caixa de dilogo ser exibida. 3. Na caixa Reorder Parameters de dilogo, mova os parmetros para a ordem voc deseja, e clique em OK. As alteraes ordem de parmetro no cdigo e na forma no diagrama de classe.

COMO: Criar um membro


Voc pode criar um membro usando qualquer uma das seguintes ferramentas:

Projeto de Classes Classe ferramentas Janela detalhes

Visual C# Consolidado

1027

Classe janela Detalhes Observao

Voc tambm pode criar Construtores e destructors usando os procedimentos nesta seo. Lembre-se que Construtores e destructors so tipos especiais de mtodos, e como tal, so exibidos no Methods compartimento na formas diagrama de classe e na seo Methods de detalhes classe grade da janela. Observao A nica entidade voc pode adicionar a um delegado parmetro. Observe que o procedimento chamado ' para criar um membro usando a barra de ferramentas Janela detalhes classe ' no vlido para esta ao. Para criar um membro usando Class Designer 1. Clique com o boto direito do mouse o tipo ao qual voc deseja adicionar um membro, aponte para Add, e clique em Add <member>. A nova assinatura membro criado e adicionado ao tipo. fornecido um nome padro que voc pode alterar, na Class Designer janela Detalhes classe, ou na janela Propriedades. 2. 1. 2. Como opo, especificar outros detalhes sobre o membro, tais como seu tipo. Na superfcie do diagrama, selecione o tipo ao qual voc deseja adicionar um membro. O tipo obtm foco e seu contedo so exibidos na janela Detalhes classe. Na barra de ferramentas Janela detalhes classe, clique no cone superior e selecione New <member> na lista drop-o. O cursor vai para o Name campo em uma linha para o tipo de membro que voc deseja adicionar. Por exemplo, se voc clicou em New Property, em uma nova linha na seo Properties da janela Detalhes classe mover o cursor. 3. Digite o nome do membro voc deseja criar e pressione ENTER (ou caso contrrio mover o foco, como pressionando TAB). A nova assinatura membro criado e adicionado ao tipo. O membro agora existe no cdigo e exibido no Class Designer, a janela Detalhes classe, e a janela Propriedades. 4. 1. 2. Como opo, especificar outros detalhes sobre o membro, tais como seu tipo. Na superfcie do diagrama, selecione o tipo ao qual voc deseja adicionar um membro. O tipo obtm foco e seu contedo so exibidos na janela Detalhes classe. Na janela Detalhes classe, na seo que contm o tipo de membro voc deseja adicionar, clique em <add member>. Por exemplo, se voc deseja adicionar um campo, clique em <add field>. Digite o nome do membro voc deseja criar e pressione ENTER. A nova assinatura membro criado e adicionado ao tipo. O membro agora existe no cdigo e exibido na janela Detalhes classe, a Class Designer, o e a janela Propriedades. 4. Como opo, especificar outros detalhes sobre o membro, tais como seu tipo. Voc Note: pode usar atalhos de teclado para criar membros. Para obter mais informaes, consulte Atalhos de teclado para a janela Detalhes de classe. Para criar um membro usando a classe detalhes janela Para criar um membro usando a barra de ferramentas Janela detalhes classe

3.

Visual C# Consolidado

1028

COMO: Implementar um designer para um controle


Este tpico descreve como implementar um designer (HelpLabelDesigner. o COMO: Implementar um provedor Extender HelpLabel) para o HelpLabel controle provedor Extender descrito em O designer uma classe aninhada no controle HelpLabel. O exemplo de cdigo Designer demonstra os seguintes pontos:

Derivar HelpLabelDesigner de ControlDesigner. Fornece HelpLabelDesigner um verbo Designer, substituindo a Verbs propriedade especificada na interface IDesigner. No tempo de criao, verbos aparecem como comandos no objeto que est associado com o designer. Para obter mais informaes, consulte Verbos Designer. Adiciona HelpLabelDesigner uma propriedade design-time (TrackSelection. por substituir o PreFilterProperties mtodo especificado pela interface IDesignerFilter) para HelpLabel Para obter mais informaes sobre como adicionar ou substituir propriedades e eventos, consulte Filtragem de metadados.

Exemplo O exemplo de cdigo a seguir contm o cdigo para o designer. Observao O seguinte cdigo Designer por si s no ser compilado. Em vez disso, compilar o exemplo no COMO: Implementar um provedor Extender HelpLabel, que contm o cdigo para o criador como uma classe aninhada. C#
// // <doc> // <desc> // This is a designer for the HelpLabel. This designer provides // design time feedback for the label. The help label responds // to changes in the active control, but these events do not // occur at design time. In order to provide some usable feedback // that the control is working the right way, this designer listens // to selection change events and uses those events to trigger active // control changes. // </desc> // </doc> // [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] public class HelpLabelDesigner : System.Windows.Forms.Design.ControlDesigner { private bool trackSelection = true; /// <summary> /// This property is added to the control's set of properties in the method /// PreFilterProperties below. Note that on designers, properties that are /// explictly declared by TypeDescriptor.CreateProperty can be declared as /// private on the designer. This helps to keep the designer's publi /// object model clean. /// </summary> private bool TrackSelection { get { return trackSelection; } set { trackSelection = value; if (trackSelection) { ISelectionService ss = (ISelectionService)GetService(typeof(ISelectionService)); if (ss != null) { UpdateHelpLabelSelection(ss); } } else { HelpLabel helpLabel = (HelpLabel)Control; if (helpLabel.activeControl != null) { helpLabel.activeControl = null; helpLabel.Invalidate(); } } } } public override DesignerVerbCollection Verbs { get { DesignerVerb[] verbs = new DesignerVerb[] { new DesignerVerb("Sample Verb", new EventHandler(OnSampleVerb)) }; return new DesignerVerbCollection(verbs); } } // // <doc> // <desc> // Overrides Dispose. Here we remove our handler for the selection changed // event. With designers, it is critical that they clean up any events they // have attached. Otherwise, during the course of an editing session many // designers may get created and never destroyed. // </desc> // </doc> // protected override void Dispose(bool disposing) { if (disposing) { ISelectionService ss =

Visual C# Consolidado

1029

(ISelectionService)GetService(typeof(ISelectionService)); if (ss != null) { ss.SelectionChanged -= new EventHandler(OnSelectionChanged); } } base.Dispose(disposing); } // // <doc> // <desc> // Overrides initialize. Here we add an event handler to the selection service. // Notice that we are very careful not to assume that the selection service is // available. It is entirely optional that a service is available and you should // always degrade gracefully if a service could not be found. // </desc> // </doc> // public override void Initialize(IComponent component) { base.Initialize(component); ISelectionService ss = (ISelectionService)GetService(typeof(ISelectionService)); if (ss != null) { ss.SelectionChanged += new EventHandler(OnSelectionChanged); } } private void OnSampleVerb(object sender, EventArgs e) { MessageBox.Show("You have just invoked a sample verb. Normally, this would do something interesting."); } // // <doc> // <desc> // Our handler for the selection change event. Here we update the active control within // the help label. // </desc> // </doc> // private void OnSelectionChanged(object sender, EventArgs e) { if (trackSelection) { ISelectionService ss = (ISelectionService)sender; UpdateHelpLabelSelection(ss); } } protected override void PreFilterProperties(IDictionary properties) { // Always call base first in PreFilter* methods, and last in PostFilter* // methods. base.PreFilterProperties(properties); // We add a design-time property called "TrackSelection" that is used to track // the active selection. If the user sets this to true (the default), then // we will listen to selection change events and update the control's active // control to point to the current primary selection. properties["TrackSelection"] = TypeDescriptor.CreateProperty( this.GetType(), // the type this property is defined on "TrackSelection", // the name of the property typeof(bool), // the type of the property new Attribute[] {CategoryAttribute.Design}); // attributes } /// <summary> /// This is a helper method that, given a selection service, will update the active control /// of our help label with the currently active selection. /// </summary> /// <param name="ss"></param> private void UpdateHelpLabelSelection(ISelectionService ss) { Control c = ss.PrimarySelection as Control; HelpLabel helpLabel = (HelpLabel)Control; if (c != null) { helpLabel.activeControl = c; helpLabel.Invalidate(); } else { if (helpLabel.activeControl != null) { helpLabel.activeControl = null; helpLabel.Invalidate(); } } } }

COMO: Criar e configurar componentes no modo Design


O designer personalizado pode criar e configurar componentes na superfcie do design de forma programada. Exemplo O exemplo de cdigo a seguir demonstra como usar Servios Designer para criar e iniciar os componentes no seu designer personalizado. Uma classe chamada DemoControlDesigner Designer est conectado a uma DemoControl classe e executa as seguintes operaes:

Cria e configura um Timer componente para exibio na superfcie do design. Remove um Timer Componente da superfcie de design. Inicializa uma instncia da classe DemoControl quando ele criado pelo Toolbox.

C#
using System; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Diagnostics; using System.Drawing; using System.Drawing.Design; using System.Data; using System.Reflection; using System.Runtime.Serialization; using System.Text; using System.Windows.Forms; using System.Windows.Forms.Design; using System.Windows.Forms.Design.Behavior; public class Form1 : Form { private DemoControl demoControl1; private System.ComponentModel.IContainer components = null; public Form1() { InitializeComponent(); }

Visual C# Consolidado

1030

protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new Form1()); } #region Windows Form Designer generated code private void InitializeComponent() { this.demoControl1 = new DemoControl(); this.SuspendLayout(); // // demoControl1 // this.demoControl1.AutoSize = true; this.demoControl1.BackColor = System.Drawing.Color.Chartreuse; this.demoControl1.Location = new System.Drawing.Point(0, 0); this.demoControl1.Name = "demoControl1"; this.demoControl1.Size = new System.Drawing.Size(232, 14); this.demoControl1.TabIndex = 0; this.demoControl1.Text = "This text was set by CreateComponentsCore."; // // Form1 // this.ClientSize = new System.Drawing.Size(492, 482); this.Controls.Add(this.demoControl1); this.Name = "Form1"; this.Text = "r"; this.ResumeLayout(false); this.PerformLayout(); } #endregion } // This control is derived from UserControl, with only a little // added logic for the Toolbox interaction. // // All of the custom designer code is implemented in the // DemoControlDesigner class. [DesignerAttribute(typeof(DemoControlDesigner))] [ToolboxItem(typeof(DemoToolboxItem))] public class DemoControl : Label { private System.ComponentModel.IContainer components = null; public DemoControl() { InitializeComponent(); MessageBox.Show("DemoControl", "Constructor"); } protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } private void InitializeComponent() { // // DemoControl // this.Name = "DemoControl"; } // Toolbox items must be serializable. [Serializable] [System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Inheritan ceDemand, Name="FullTrust")] [System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDem and, Name="FullTrust")] class DemoToolboxItem : ToolboxItem { // The add components dialog in VS looks for a public // ctor that takes a type. public DemoToolboxItem(Type toolType) : base(toolType) { } // And you must provide this special constructor for serialization. // If you add additional data to MyToolboxItem that you // want to serialize, you may override Deserialize and // Serialize methods to add that data. DemoToolboxItem(SerializationInfo info, StreamingContext context) { Deserialize(info, context); } // This implementation sets the new control's Text and // AutoSize properties. protected override IComponent[] CreateComponentsCore( IDesignerHost host, IDictionary defaultValues) { IComponent[] comps = base.CreateComponentsCore(host, defaultValues); // The returned IComponent array contains a single // component, which is an instance of DemoControl. ((DemoControl)comps[0]).Text = "This text was set by CreateComponentsCore."; ((DemoControl)comps[0]).AutoSize = true; return comps; } } } // This class demonstrates a designer that attaches to various // services and changes the properties exposed by the control // being designed. [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] public class DemoControlDesigner : ControlDesigner { // This member backs the Locked property. private bool lockedValue = false; // This is the collection of DesignerActionLists that // defines the smart tags offered on the control. private DesignerActionListCollection actionLists = null; // This Timer is created when you select the Create Timer // smart tag item. private Timer createdTimer = null; // These are the services which DemoControlDesigner will use. private DesignerActionService actionService = null; private DesignerActionUIService actionUiService = null; private IComponentChangeService changeService = null; private IDesignerEventService eventService = null; private IDesignerHost host = null; private IDesignerOptionService optionService = null; private IEventBindingService eventBindingService = null; private IExtenderListService listService = null; private IReferenceService referenceService = null; private ISelectionService selectionService = null; private ITypeResolutionService typeResService = null; private IComponentDiscoveryService componentDiscoveryService = null; private IToolboxService toolboxService =

Visual C# Consolidado

1031

null; private UndoEngine undoEng = null; public DemoControlDesigner() { MessageBox.Show("DemoControlDesigner", "Constructor"); } // The Dispose method override is implemented so event handlers // can be removed. This prevents objects from lingering in // memory beyond the desired lifespan. protected override void Dispose(bool disposing) { if (disposing) { if (this.changeService != null) { // Unhook event handlers. this.changeService.ComponentChanged -= new ComponentChangedEventHandler( ChangeService_ComponentChanged); this.changeService.ComponentAdded -= new ComponentEventHandler( ChangeService_ComponentAdded); this.changeService.ComponentRemoved -= new ComponentEventHandler( changeService_ComponentRemoved); } if (this.eventService != null) { this.eventService.ActiveDesignerChanged -= new ActiveDesignerEventHandler( eventService_ActiveDesignerChanged); } if (this.selectionService != null) { this.selectionService.SelectionChanged -= new EventHandler( selectionService_SelectionChanged); } } base.Dispose(disposing); } // This method initializes the designer. public override void Initialize(IComponent component) { base.Initialize(component); // Connect to various designer services. InitializeServices(); // Set up the BackColor value that will be serialized. // This is the shadowed property on the designer. this.BackColor = Color.Chartreuse; // Set up the BackColor value that will be displayed. this.Control.BackColor = Color.AliceBlue; } // This method creates the DesignerActionList on demand, causing // smart tags to appear on the control being designed. public override DesignerActionListCollection ActionLists { get { if (null == actionLists) { actionLists = new DesignerActionListCollection(); actionLists.Add( new DemoActionList(this.Component)); } return actionLists; } } // This utility method connects the designer to various // services it will use. private void InitializeServices() { // Acquire a reference to DesignerActionService. this.actionService = GetService(typeof(DesignerActionService)) as DesignerActionService; // Acquire a reference to DesignerActionUIService. this.actionUiService = GetService(typeof(DesignerActionUIService)) as DesignerActionUIService; // Acquire a reference to IComponentChangeService. this.changeService = GetService(typeof(IComponentChangeService)) as IComponentChangeService; // Hook the IComponentChangeService events. if (this.changeService != null) { this.changeService.ComponentChanged += new ComponentChangedEventHandler( ChangeService_ComponentChanged); this.changeService.ComponentAdded += new ComponentEventHandler( ChangeService_ComponentAdded); this.changeService.ComponentRemoved += new ComponentEventHandler( changeService_ComponentRemoved); } // Acquire a reference to ISelectionService. this.selectionService = GetService(typeof(ISelectionService)) as ISelectionService; // Hook the SelectionChanged event. if (this.selectionService != null) { this.selectionService.SelectionChanged += new EventHandler(selectionService_SelectionChanged); } // Acquire a reference to IDesignerEventService. this.eventService = GetService(typeof(IDesignerEventService)) as IDesignerEventService; if (this.eventService != null) { this.eventService.ActiveDesignerChanged += new ActiveDesignerEventHandler( eventService_ActiveDesignerChanged); } // Acquire a reference to IDesignerHost. this.host = GetService(typeof(IDesignerHost)) as IDesignerHost; // Acquire a reference to IDesignerOptionService. this.optionService = GetService(typeof(IDesignerOptionService)) as IDesignerOptionService; // Acquire a reference to IEventBindingService. this.eventBindingService = GetService(typeof(IEventBindingService)) as IEventBindingService; // Acquire a reference to IExtenderListService. this.listService = GetService(typeof(IExtenderListService)) as IExtenderListService; // Acquire a reference to IReferenceService. this.referenceService = GetService(typeof(IReferenceService)) as IReferenceService; // Acquire a reference to ITypeResolutionService. this.typeResService = GetService(typeof(ITypeResolutionService)) as ITypeResolutionService; // Acquire a reference to IComponentDiscoveryService. this.componentDiscoveryService = GetService(typeof(IComponentDiscoveryService)) as IComponentDiscoveryService; // Acquire a reference to

Visual C# Consolidado

1032

IToolboxService. this.toolboxService = GetService(typeof(IToolboxService)) as IToolboxService; // Acquire a reference to UndoEngine. this.undoEng = GetService(typeof(UndoEngine)) as UndoEngine; if (this.undoEng != null) { MessageBox.Show("UndoEngine"); } } // This is the shadowed property on the designer. // This value will be serialized instead of the // value of the control's property. public Color BackColor { get { return (Color)ShadowProperties["BackColor"]; } set { if (this.changeService != null) { PropertyDescriptor backColorDesc = TypeDescriptor.GetProperties(this.Control)["BackColor"]; this.changeService.OnComponentChanging( this.Control, backColorDesc); this.ShadowProperties["BackColor"] = value; this.changeService.OnComponentChanged( this.Control, backColorDesc, null, null); } } } // This is the property added by the designer in the // PreFilterProperties method. private bool Locked { get { return lockedValue; } set { lockedValue = value; } } // The PreFilterProperties method is where you can add or remove // properties from the component being designed. // // In this implementation, the Visible property is removed, // the BackColor property is shadowed by the designer, and // the a new property, called Locked, is added. protected override void PreFilterProperties(IDictionary properties) { // Always call the base PreFilterProperties implementation // before you modify the properties collection. base.PreFilterProperties(properties); // Remove the visible property. properties.Remove("Visible"); // Shadow the BackColor property. PropertyDescriptor propertyDesc = TypeDescriptor.CreateProperty( typeof(DemoControlDesigner), (PropertyDescriptor)properties["BackColor"], new Attribute[0]); properties["BackColor"] = propertyDesc; // Create the Locked property. properties["Locked"] = TypeDescriptor.CreateProperty( typeof(DemoControlDesigner), "Locked", typeof(bool), CategoryAttribute.Design, DesignOnlyAttribute.Yes); } // The PostFilterProperties method is where you modify existing // properties. You must only use this method to modify existing // items. Do not add or remove items here. Also, be sure to // call base.PostFilterProperties(properties) after your filtering // logic. // // In this implementation, the Enabled property is hidden from // any PropertyGrid or Properties window. This is done by // creating a copy of the existing PropertyDescriptor and // attaching two new Attributes: Browsable and EditorBrowsable. protected override void PostFilterProperties(IDictionary properties) { PropertyDescriptor pd = properties["Enabled"] as PropertyDescriptor; pd = TypeDescriptor.CreateProperty( pd.ComponentType, pd, new Attribute[2] { new BrowsableAttribute(false), new EditorBrowsableAttribute(EditorBrowsableState.Never)}); properties[pd.Name] = pd; // Always call the base PostFilterProperties implementation // after you modify the properties collection. base.PostFilterProperties(properties); } #region Event Handlers void eventService_ActiveDesignerChanged( object sender, ActiveDesignerEventArgs e) { if (e.NewDesigner != null) { MessageBox.Show( e.NewDesigner.ToString(), "ActiveDesignerChanged"); } } void ChangeService_ComponentChanged( object sender, ComponentChangedEventArgs e) { string msg = String.Format( "{0}, {1}", e.Component, e.Member); MessageBox.Show(msg, "ComponentChanged"); } void ChangeService_ComponentAdded( object sender, ComponentEventArgs e) { MessageBox.Show( e.Component.ToString(), "ComponentAdded"); } void changeService_ComponentRemoved( object sender, ComponentEventArgs e) { MessageBox.Show( e.Component.ToString(), "ComponentRemoved"); } void selectionService_SelectionChanged( object sender, EventArgs e) { if (this.selectionService != null) { if (this.selectionService.PrimarySelection == this.Control) { MessageBox.Show( this.Control.ToString(), "SelectionChanged"); } } } #endregion // This class defines the smart tags that appear on the control // that is being designed. internal class DemoActionList : System.ComponentModel.Design.DesignerActionList { // Cache a reference to the designer host. private IDesignerHost host = null; // Cache a reference to the control. private DemoControl relatedControl = null; // Cache a reference to the designer. private DemoControlDesigner relatedDesigner = null; //The constructor associates the control //with the smart tag list. public DemoActionList(IComponent component) : base(component) { this.relatedControl = component as DemoControl; this.host = this.Component.Site.GetService(typeof(IDesignerHost)) as IDesignerHost;

Visual C# Consolidado

1033

IDesigner dcd = host.GetDesigner(this.Component); this.relatedDesigner = dcd as DemoControlDesigner; } // This method creates and populates the // DesignerActionItemCollection which is used to // display smart tag items. public override DesignerActionItemCollection GetSortedActionItems() { DesignerActionItemCollection items = new DesignerActionItemCollection(); // If the Timer component has not been created, show the // "Create Timer" DesignerAction item. // // If the Timer component exists, show the timer-related // options. if (this.relatedDesigner.createdTimer == null) { items.Add(new DesignerActionMethodItem( this, "CreateTimer", "Create Timer", true)); } else { items.Add(new DesignerActionMethodItem( this, "ShowEventHandlerCode", "Show Event Handler Code", true)); items.Add(new DesignerActionMethodItem( this, "RemoveTimer", "Remove Timer", true)); } items.Add(new DesignerActionMethodItem( this, "GetExtenderProviders", "Get Extender Providers", true)); items.Add(new DesignerActionMethodItem( this, "GetDemoControlReferences", "Get DemoControl References", true)); items.Add(new DesignerActionMethodItem( this, "GetPathOfAssembly", "Get Path of Executing Assembly", true)); items.Add(new DesignerActionMethodItem( this, "GetComponentTypes", "Get ScrollableControl Types", true)); items.Add(new DesignerActionMethodItem( this, "GetToolboxCategories", "Get Toolbox Categories", true)); items.Add(new DesignerActionMethodItem( this, "SetBackColor", "Set Back Color", true)); return items; } // This method creates a Timer component using the // IDesignerHost.CreateComponent method. It also // creates an event handler for the Timer component's // tick event. private void CreateTimer() { if (this.host != null) { if (this.relatedDesigner.createdTimer == null) { // Create and configure the Timer object. this.relatedDesigner.createdTimer = this.host.CreateComponent(typeof(Timer)) as Timer; Timer t = this.relatedDesigner.createdTimer; t.Interval = 1000; t.Enabled = true; EventDescriptorCollection eventColl = TypeDescriptor.GetEvents(t, new Attribute[0]); if (eventColl != null) { EventDescriptor ed = eventColl["Tick"] as EventDescriptor; if (ed != null) { PropertyDescriptor epd = this.relatedDesigner.eventBindingService.GetEventProperty(ed); epd.SetValue(t, "timer_Tick"); } } this.relatedDesigner.actionUiService.Refresh(this.relatedControl); } } } // This method uses the IEventBindingService.ShowCode // method to start the Code Editor. It places the caret // in the timer_tick method created by the CreateTimer method. private void ShowEventHandlerCode() { Timer t = this.relatedDesigner.createdTimer; if (t != null) { EventDescriptorCollection eventColl = TypeDescriptor.GetEvents(t, new Attribute[0]); if (eventColl != null) { EventDescriptor ed = eventColl["Tick"] as EventDescriptor; if (ed != null) { this.relatedDesigner.eventBindingService.ShowCode(t, ed); } } } } // This method uses the IDesignerHost.DestroyComponent method // to remove the Timer component from the design environment. private void RemoveTimer() { if (this.host != null) { if (this.relatedDesigner.createdTimer != null) { this.host.DestroyComponent( this.relatedDesigner.createdTimer); this.relatedDesigner.createdTimer = null; this.relatedDesigner.actionUiService.Refresh( this.relatedControl); } } } // This method uses IExtenderListService.GetExtenderProviders // to enumerate all the extender providers and display them // in a MessageBox. private void GetExtenderProviders() { if (this.relatedDesigner.listService != null) { StringBuilder sb = new StringBuilder(); IExtenderProvider[] providers = this.relatedDesigner.listService.GetExtenderProviders(); for (int i = 0; i < providers.Length; i++) { sb.Append(providers[i].ToString()); sb.Append("\r\n"); } MessageBox.Show( sb.ToString(), "Extender Providers"); } } // This method uses the IReferenceService.GetReferences method // to enumerate all the instances of DemoControl on the // design surface. private void GetDemoControlReferences() { if (this.relatedDesigner.referenceService != null) { StringBuilder sb = new StringBuilder(); object[] refs = this.relatedDesigner.referenceService.GetReferences(typeof(DemoControl)); for (int i = 0; i < refs.Length; i++) { sb.Append(refs[i].ToString()); sb.Append("\r\n"); } MessageBox.Show( sb.ToString(), "DemoControl References"); } } // This method uses the ITypeResolutionService.GetPathOfAssembly // method to display the path of the executing assembly. private void GetPathOfAssembly() { if

Visual C# Consolidado

1034

(this.relatedDesigner.typeResService != null) { System.Reflection.AssemblyName name = System.Reflection.Assembly.GetExecutingAssembly().GetName(); MessageBox.Show( this.relatedDesigner.typeResService.GetPathOfAssembly(name), "Path of executing assembly"); } } // This method uses the IComponentDiscoveryService.GetComponentTypes // method to find all the types that derive from // ScrollableControl. private void GetComponentTypes() { if (this.relatedDesigner.componentDiscoveryService != null) { ICollection components = this.relatedDesigner.componentDiscoveryService.GetComponentTypes(host, typeof(ScrollableControl)); if (components != null) { if (components.Count > 0) { StringBuilder sb = new StringBuilder(); IEnumerator e = components.GetEnumerator(); while (e.MoveNext()) { sb.Append(e.Current.ToString()); sb.Append("\r\n"); } MessageBox.Show( sb.ToString(), "Controls derived from ScrollableControl"); } } } } // This method uses the IToolboxService.CategoryNames // method to enumerate all the categories that appear // in the Toolbox. private void GetToolboxCategories() { if (this.relatedDesigner.toolboxService != null) { StringBuilder sb = new StringBuilder(); CategoryNameCollection names = this.relatedDesigner.toolboxService.CategoryNames; foreach (string name in names) { sb.Append(name.ToString()); sb.Append("\r\n"); } MessageBox.Show(sb.ToString(), "Toolbox Categories"); } } // This method sets the shadowed BackColor property on the // designer. This is the value that is serialized by the // design environment. private void SetBackColor() { ColorDialog d = new ColorDialog(); if (d.ShowDialog() == DialogResult.OK) { this.relatedDesigner.BackColor = d.Color; } } } }

Voc pode criar e configurar um componente, solicitando uma instncia do ambiente de desenvolvimento e definindo suas propriedades. Voc tambm pode configurar um componente quando ela criada da Toolbox. Criando e configurando um componente programaticamente O exemplo de cdigo a seguir chama o CreateComponent mtodo para criar um Timer componente. O Timer componente inicializado, definindo e Enabled Propriedades. seu Interval Este exemplo tambm usa o GetEventProperty mtodo para anexar um manipulador de eventos. C#
// This method creates a Timer component using the // IDesignerHost.CreateComponent method. It also // creates an event handler for the Timer component's // tick event. private void CreateTimer() { if (this.host != null) { if (this.relatedDesigner.createdTimer == null) { // Create and configure the Timer object. this.relatedDesigner.createdTimer = this.host.CreateComponent(typeof(Timer)) as Timer; Timer t = this.relatedDesigner.createdTimer; t.Interval = 1000; t.Enabled = true; EventDescriptorCollection eventColl = TypeDescriptor.GetEvents(t, new Attribute[0]); if (eventColl != null) { EventDescriptor ed = eventColl["Tick"] as EventDescriptor; if (ed != null) { PropertyDescriptor epd = this.relatedDesigner.eventBindingService.GetEventProperty(ed); epd.SetValue(t, "timer_Tick"); } } this.relatedDesigner.actionUiService.Refresh(this.relatedControl); } } }

Remover um componente programaticamente O exemplo de cdigo a seguir chama o DestroyComponent mtodo para remover um Timer componente do ambiente de design. C#
// This method uses the IDesignerHost.DestroyComponent method // to remove the Timer component from the design environment. private void RemoveTimer() { if (this.host != null) { if

Visual C# Consolidado

1035

(this.relatedDesigner.createdTimer != null) { this.host.DestroyComponent( this.relatedDesigner.createdTimer); this.relatedDesigner.createdTimer = null; this.relatedDesigner.actionUiService.Refresh( this.relatedControl); } } }

Inicializar um componente criado por caixa de ferramentas Voc tambm pode configurar componentes quando eles so criados pela Toolbox. Voc implementar um personalizado ToolboxItem e substituir o CreateComponentsCore mtodo. C#
// Toolbox items must be serializable. [Serializable] [System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Inheritan ceDemand, Name="FullTrust")] [System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDem and, Name="FullTrust")] class DemoToolboxItem : ToolboxItem { // The add components dialog in VS looks for a public // ctor that takes a type. public DemoToolboxItem(Type toolType) : base(toolType) { } // And you must provide this special constructor for serialization. // If you add additional data to MyToolboxItem that you // want to serialize, you may override Deserialize and // Serialize methods to add that data. DemoToolboxItem(SerializationInfo info, StreamingContext context) { Deserialize(info, context); } // This implementation sets the new control's Text and // AutoSize properties. protected override IComponent[] CreateComponentsCore( IDesignerHost host, IDictionary defaultValues) { IComponent[] comps = base.CreateComponentsCore(host, defaultValues); // The returned IComponent array contains a single // component, which is an instance of DemoControl. ((DemoControl)comps[0]).Text = "This text was set by CreateComponentsCore."; ((DemoControl)comps[0]).AutoSize = true; return comps; } }

Anexar o componente a sua ToolboxItem Classe usando ToolboxItemAttribute. C#


[DesignerAttribute(typeof(DemoControlDesigner))] [ToolboxItem(typeof(DemoToolboxItem))] public class DemoControl : Label {

Compilando o cdigo Quando voc faz alteraes aos aspectos em tempo de criao de um componente, voc precisar recriar o projeto de controle. Alm disso, se no houver outro projeto Windows Forms que aberto e usa esse componente, voc provavelmente precisar atualizar o projeto para ver as alteraes. Normalmente, voc precisar fechar e reabrir a janela de design que contm o componente.

Como: Acessar suporte em tempo de design no Windows Forms


Componentes personalizados e controles so designable, que significa tm configuraes que os usurios podem configurar com uma interface grfica do usurio (UI) em tempo de design. Essas configuraes geralmente afetam instncias do componente em tempo de execuo. Se sua classe implementa a IComponent interface, ele pode participar de um ambiente de criao como Visual Studio.

Visual C# Consolidado

1036

Para acessar o suporte em tempo de criao fornecido pelo .NET Framework, voc precisa concluir as etapas a seguir. Para acessar suporte Design-time 1. 2. Adicione uma referncia ao conjunto System.Design. Se voc estiver implementando ou PropertyGrid controle, importar espao para nome System.Drawing.Design. ou se o componente est interagindo com um UITypeEditor um Toolbox

C#
using System.Drawing.Design;

1. C#

Se voc estiver implementando uma experincia em tempo de design personalizada para o componente, importar espao para nome System.ComponentModel.Design.

using System.ComponentModel.Design;

1.

Se voc estiver implementando uma experincia em tempo de design personalizada para o controle Windows Forms, importar espao para nome System.Windows.Forms.Design. Voc pode criar marcas inteligentes ou um designer personalizado para o componente COM tipos no espao para esse nome.

C#
using System.Windows.Forms.Design;

Consulte tambm

COMO: Implementar um provedor Extender HelpLabel


Um Provedor Extender um componente que fornece propriedades para outros componentes. Por exemplo, o ToolTip controle implementado como um provedor Extender. Quando voc adiciona um ToolTip controle para a Form, todos. outros controles na Form ter uma ToolTip propriedade adicionada sua lista Propriedades O exemplo a seguir demonstra como criar um provedor Extender ao criar o HelpLabel controle. Ela mostra a implementao de mtodo CanExtend e a HelpText propriedade. O CanExtend mtodo usado pelo Windows Forms Designer para determinar se deve estender essa propriedade para um determinado controle. O HelpLabel controle estende a HelpText propriedade para uso com os controles em um formulrio. O texto de ajuda para um controle exibido em um painel quando o controle tem foco. O exemplo inclui um designer aninhada que descrita em COMO: Implementar um designer para um controle. O exemplo demonstra os seguintes itens:

O provedor HelpLabel Extender implementa IExtenderProvider. Do ProvidePropertyAttribute o HelpLabel controle utiliza para especificar o nome de propriedade fornecida,, assim como o tipo de componentes que podem receber a propriedade. HelpLabel prprio Um controle Windows Forms e da derivar de Control. O CanExtend mtodo retorna true para qualquer controle exceto HelpLabel, porque ele no significativo para estender uma propriedade no prprio.

Visual C# Consolidado

1037

tem HelpLabel um mtodo denominado GetHelpText que obtm a propriedade que HelpLabel torna disponvel para outros controles. O SetHelpText mtodo define o valor da propriedade.

Exemplo A HostApp classe usa o HelpLabel controle em um formulrio. C#


namespace Microsoft.Samples.WinForms.Cs.HelpLabel { using System; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing; using System.Windows.Forms; using System.Windows.Forms.Design; // // <doc> // <desc> // Help Label offers an extender property called // "HelpText". It monitors the active control // and displays the help text for the active control. // </desc> // </doc> // [ ProvideProperty("HelpText",typeof(Control)), Designer(typeof(HelpLabel.HelpLabelDesigner)) ] public class HelpLabel : Control, System.ComponentModel.IExtenderProvider { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components; private Hashtable helpTexts; private System.Windows.Forms.Control activeControl; // // <doc> // <desc> // Creates a new help label object. // </desc> // </doc> // public HelpLabel() { // // Required for Windows Form Designer support // InitializeComponent(); helpTexts = new Hashtable(); } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose(bool disposing) { if (disposing) { components.Dispose(); } base.Dispose(disposing); } /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.components = new System.ComponentModel.Container (); this.BackColor = System.Drawing.SystemColors.Info; this.ForeColor = System.Drawing.SystemColors.InfoText; this.TabStop = false; } // // <doc> // <desc> // Overrides the text property of Control. This label ignores // the text property, so we add additional attributes here so the // property does not show up in the properties window and is not // persisted. // </desc> // </doc> // [ Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden) ] public override string Text { get { return base.Text; } set { base.Text = value; } } // // <doc> // <desc> // This implements the IExtenderProvider.CanExtend method. The // help label provides an extender property, and the design time // framework will call this method once for each component to determine // if we are interested in providing our extended properties for the // component. We return true here if the object is a control and is // not a HelpLabel (since it would be silly to add this property to // ourselves). // </desc> // </doc> // bool IExtenderProvider.CanExtend(object target) { if (target is Control && !(target is HelpLabel)) { return true; } return false; } // // <doc> // <desc> // This is the extended property for the HelpText property. Extended // properties are actual methods because they take an additional parameter // that is the object or control to provide the property for. // </desc> // </doc> // [ DefaultValue(""), ] public string GetHelpText(Control control) { string text = (string)helpTexts[control]; if (text == null) { text = string.Empty; } return text; } // // <doc> // <desc> // This is an event handler that responds to the OnControlEnter // event. We attach this to each control we are providing help // text for. // </desc> // </doc> // private void OnControlEnter(object sender, EventArgs e) { activeControl = (Control)sender; Invalidate(); } // // <doc> // <desc> // This is an event handler that responds to the OnControlLeave // event. We attach this to each control we are providing help // text for. // </desc> // </doc> // private void OnControlLeave(object sender, EventArgs e) { if (sender == activeControl) { activeControl = null; Invalidate(); } } // // <doc> // <desc> // This is the extended property for the HelpText property. // </desc> // </doc> // public void SetHelpText(Control control, string value) { if (value == null) { value = string.Empty; } if (value.Length == 0) {

Visual C# Consolidado

1038

helpTexts.Remove(control); control.Enter -= new EventHandler(OnControlEnter); control.Leave -= new EventHandler(OnControlLeave); } else { helpTexts[control] = value; control.Enter += new EventHandler(OnControlEnter); control.Leave += new EventHandler(OnControlLeave); } if (control == activeControl) { Invalidate(); } } // // <doc> // <desc> // Overrides Control.OnPaint. Here we draw our // label. // </desc> // </doc> // protected override void OnPaint(PaintEventArgs pe) { // Let the base draw. This will cover our back // color and set any image that the user may have // provided. // base.OnPaint(pe); // Draw a rectangle around our control. // Rectangle rect = ClientRectangle; Pen borderPen = new Pen(ForeColor); pe.Graphics.DrawRectangle(borderPen, rect); borderPen.Dispose(); // Finally, draw the text over the top of the // rectangle. // if (activeControl != null) { string text = (string)helpTexts[activeControl]; if (text != null && text.Length > 0) { rect.Inflate(-2, -2); Brush brush = new SolidBrush(ForeColor); pe.Graphics.DrawString(text, Font, brush, rect); brush.Dispose(); } } } // <doc> // <desc> // Returns true if the backColor should be persisted in code gen. We // override this because we change the default back color. // </desc> // <retvalue> // true if the backColor should be persisted. // </retvalue> // </doc> // public bool ShouldSerializeBackColor() { return(!BackColor.Equals(SystemColors.Info)); } // <doc> // <desc> // Returns true if the foreColor should be persisted in code gen. We // override this because we change the default foreground color. // </desc> // <retvalue> // true if the foreColor should be persisted. // </retvalue> // </doc> // public bool ShouldSerializeForeColor() { return(!ForeColor.Equals(SystemColors.InfoText)); } // // <doc> // <desc> // This is a designer for the HelpLabel. This designer provides // design time feedback for the label. The help label responds // to changes in the active control, but these events do not // occur at design time. In order to provide some usable feedback // that the control is working the right way, this designer listens // to selection change events and uses those events to trigger active // control changes. // </desc> // </doc> // [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] public class HelpLabelDesigner : System.Windows.Forms.Design.ControlDesigner { private bool trackSelection = true; /// <summary> /// This property is added to the control's set of properties in the method /// PreFilterProperties below. Note that on designers, properties that are /// explictly declared by TypeDescriptor.CreateProperty can be declared as /// private on the designer. This helps to keep the designer's publi /// object model clean. /// </summary> private bool TrackSelection { get { return trackSelection; } set { trackSelection = value; if (trackSelection) { ISelectionService ss = (ISelectionService)GetService(typeof(ISelectionService)); if (ss != null) { UpdateHelpLabelSelection(ss); } } else { HelpLabel helpLabel = (HelpLabel)Control; if (helpLabel.activeControl != null) { helpLabel.activeControl = null; helpLabel.Invalidate(); } } } } public override DesignerVerbCollection Verbs { get { DesignerVerb[] verbs = new DesignerVerb[] { new DesignerVerb("Sample Verb", new EventHandler(OnSampleVerb)) }; return new DesignerVerbCollection(verbs); } } // // <doc> // <desc> // Overrides Dispose. Here we remove our handler for the selection changed // event. With designers, it is critical that they clean up any events they // have attached. Otherwise, during the course of an editing session many // designers may get created and never destroyed. // </desc> // </doc> // protected override void Dispose(bool disposing) { if (disposing) { ISelectionService ss = (ISelectionService)GetService(typeof(ISelectionService)); if (ss != null) { ss.SelectionChanged -= new EventHandler(OnSelectionChanged); } } base.Dispose(disposing); } // // <doc> // <desc> // Overrides initialize. Here we add an event handler to the selection service. // Notice that we are very careful not to assume that the selection service is // available. It is entirely optional that a service is available and you should // always degrade gracefully if a service could not be found. // </desc> // </doc> // public override void Initialize(IComponent component) { base.Initialize(component); ISelectionService ss = (ISelectionService)GetService(typeof(ISelectionService)); if (ss != null) { ss.SelectionChanged += new EventHandler(OnSelectionChanged); } } private void OnSampleVerb(object sender, EventArgs e) {

Visual C# Consolidado

1039

MessageBox.Show("You have just invoked a sample verb. Normally, this would do something interesting."); } // // <doc> // <desc> // Our handler for the selection change event. Here we update the active control within // the help label. // </desc> // </doc> // private void OnSelectionChanged(object sender, EventArgs e) { if (trackSelection) { ISelectionService ss = (ISelectionService)sender; UpdateHelpLabelSelection(ss); } } protected override void PreFilterProperties(IDictionary properties) { // Always call base first in PreFilter* methods, and last in PostFilter* // methods. base.PreFilterProperties(properties); // We add a design-time property called "TrackSelection" that is used to track // the active selection. If the user sets this to true (the default), then // we will listen to selection change events and update the control's active // control to point to the current primary selection. properties["TrackSelection"] = TypeDescriptor.CreateProperty( this.GetType(), // the type this property is defined on "TrackSelection", // the name of the property typeof(bool), // the type of the property new Attribute[] {CategoryAttribute.Design}); // attributes } /// <summary> /// This is a helper method that, given a selection service, will update the active control /// of our help label with the currently active selection. /// </summary> /// <param name="ss"></param> private void UpdateHelpLabelSelection(ISelectionService ss) { Control c = ss.PrimarySelection as Control; HelpLabel helpLabel = (HelpLabel)Control; if (c != null) { helpLabel.activeControl = c; helpLabel.Invalidate(); } else { if (helpLabel.activeControl != null) { helpLabel.activeControl = null; helpLabel.Invalidate(); } } } } } }

C#
namespace Microsoft.Samples.WinForms.Cs.HostApp { using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; using Microsoft.Samples.WinForms.Cs.HelpLabel; public class HostApp : System.Windows.Forms.Form { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components; private System.Windows.Forms.Label label1; private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.Button button1; private Microsoft.Samples.WinForms.Cs.HelpLabel.HelpLabel helpLabel1; public HostApp() { // // Required for Windows Form Designer support // InitializeComponent(); } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose(bool disposing) { if (disposing) { components.Dispose(); } base.Dispose(disposing); } /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.label1 = new System.Windows.Forms.Label(); this.button1 = new System.Windows.Forms.Button(); this.textBox1 = new System.Windows.Forms.TextBox(); this.helpLabel1 = new Microsoft.Samples.WinForms.Cs.HelpLabel.HelpLabel(); label1.Location = new System.Drawing.Point(16, 16); label1.Text = "Name:"; label1.Size = new System.Drawing.Size(56, 24); label1.TabIndex = 3; helpLabel1.Dock = System.Windows.Forms.DockStyle.Bottom; helpLabel1.Size = new System.Drawing.Size(448, 40); helpLabel1.TabIndex = 0; helpLabel1.Location = new System.Drawing.Point(0, 117); button1.Anchor = AnchorStyles.Right | AnchorStyles.Bottom; button1.Size = new System.Drawing.Size(104, 40); button1.TabIndex = 1; helpLabel1.SetHelpText(button1, "This is the Save Button. Press the Save Button to save your work."); button1.Text = "&Save"; button1.Location = new System.Drawing.Point(336, 56); this.Text = "Control Example"; this.ClientSize = new System.Drawing.Size(448, 157); textBox1.Anchor = AnchorStyles.Left| AnchorStyles.Right | AnchorStyles.Top; textBox1.Location = new System.Drawing.Point(80, 16); textBox1.Text = "<Name>"; helpLabel1.SetHelpText(textBox1, "This is the name field. Please enter your name here."); textBox1.TabIndex = 2; textBox1.Size = new System.Drawing.Size(360, 20); this.Controls.Add(label1); this.Controls.Add(textBox1); this.Controls.Add(button1); this.Controls.Add(helpLabel1); } /// <summary>

Visual C# Consolidado

1040

/// The main entry point for the application. /// </summary> [STAThread] public static void Main(string[] args) { Application.Run(new HostApp()); } } }

COMO: Acessar servios em tempo de criao


O exemplo de cdigo a seguir descreve como para obter acesso ao conjunto de servios .NET Framework Rich para que possa integrar a componentes e controles ao ambiente de desenvolvimento. Exemplo Este exemplo de cdigo demonstra como acessar servios no seu designer personalizado. Uma classe chamada DemoControlDesigner Designer est conectado a uma DemoControl classe e executa as seguintes operaes:

Cria um Timer componente usando o CreateComponent mtodo. Do Code Editor usa o ShowCode mtodo para iniciar e exibir um manipulador de eventos que criado quando o Timer componente criado. Usa o DestroyComponent mtodo para remover um Timer componente do ambiente de design. Usa GetExtenderProviders para enumerar todos os provedores Extender e exibi-los em um MessageBox. Usa o GetReferences mtodo para enumerar todas as instncias DemoControl na superfcie do design. Usa o GetPathOfAssembly mtodo para exibir o caminho do conjunto de execuo. Usa o GetComponentTypes mtodo para localizar todos os tipos que derivar de ScrollableControl. Usa o CategoryNames mtodo para enumerar todas as categorias que aparecem no Toolbox. Define uma propriedade sombreada BackColor no designer, que for serializado, o ambiente de desenvolvimento em vez do valor BackColor do DemoControl. Adiciona e remove usando PreFilterProperties propriedades e PostFilterProperties mtodos.

C#
using System; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Diagnostics; using System.Drawing; using System.Drawing.Design; using System.Data; using System.Reflection; using System.Runtime.Serialization; using System.Text; using System.Windows.Forms; using System.Windows.Forms.Design; using System.Windows.Forms.Design.Behavior; public class Form1 : Form { private DemoControl demoControl1; private System.ComponentModel.IContainer components = null; public Form1() { InitializeComponent(); } protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new Form1()); } #region Windows Form Designer generated code private void InitializeComponent() { this.demoControl1 = new DemoControl(); this.SuspendLayout(); // // demoControl1 // this.demoControl1.AutoSize = true; this.demoControl1.BackColor = System.Drawing.Color.Chartreuse; this.demoControl1.Location = new System.Drawing.Point(0, 0); this.demoControl1.Name = "demoControl1"; this.demoControl1.Size = new

Visual C# Consolidado

1041

System.Drawing.Size(232, 14); this.demoControl1.TabIndex = 0; this.demoControl1.Text = "This text was set by CreateComponentsCore."; // // Form1 // this.ClientSize = new System.Drawing.Size(492, 482); this.Controls.Add(this.demoControl1); this.Name = "Form1"; this.Text = "r"; this.ResumeLayout(false); this.PerformLayout(); } #endregion } // This control is derived from UserControl, with only a little // added logic for the Toolbox interaction. // // All of the custom designer code is implemented in the // DemoControlDesigner class. [DesignerAttribute(typeof(DemoControlDesigner))] [ToolboxItem(typeof(DemoToolboxItem))] public class DemoControl : Label { private System.ComponentModel.IContainer components = null; public DemoControl() { InitializeComponent(); MessageBox.Show("DemoControl", "Constructor"); } protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } private void InitializeComponent() { // // DemoControl // this.Name = "DemoControl"; } // Toolbox items must be serializable. [Serializable] [System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Inheritan ceDemand, Name="FullTrust")] [System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDem and, Name="FullTrust")] class DemoToolboxItem : ToolboxItem { // The add components dialog in VS looks for a public // ctor that takes a type. public DemoToolboxItem(Type toolType) : base(toolType) { } // And you must provide this special constructor for serialization. // If you add additional data to MyToolboxItem that you // want to serialize, you may override Deserialize and // Serialize methods to add that data. DemoToolboxItem(SerializationInfo info, StreamingContext context) { Deserialize(info, context); } // This implementation sets the new control's Text and // AutoSize properties. protected override IComponent[] CreateComponentsCore( IDesignerHost host, IDictionary defaultValues) { IComponent[] comps = base.CreateComponentsCore(host, defaultValues); // The returned IComponent array contains a single // component, which is an instance of DemoControl. ((DemoControl)comps[0]).Text = "This text was set by CreateComponentsCore."; ((DemoControl)comps[0]).AutoSize = true; return comps; } } } // This class demonstrates a designer that attaches to various // services and changes the properties exposed by the control // being designed. [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] public class DemoControlDesigner : ControlDesigner { // This member backs the Locked property. private bool lockedValue = false; // This is the collection of DesignerActionLists that // defines the smart tags offered on the control. private DesignerActionListCollection actionLists = null; // This Timer is created when you select the Create Timer // smart tag item. private Timer createdTimer = null; // These are the services which DemoControlDesigner will use. private DesignerActionService actionService = null; private DesignerActionUIService actionUiService = null; private IComponentChangeService changeService = null; private IDesignerEventService eventService = null; private IDesignerHost host = null; private IDesignerOptionService optionService = null; private IEventBindingService eventBindingService = null; private IExtenderListService listService = null; private IReferenceService referenceService = null; private ISelectionService selectionService = null; private ITypeResolutionService typeResService = null; private IComponentDiscoveryService componentDiscoveryService = null; private IToolboxService toolboxService = null; private UndoEngine undoEng = null; public DemoControlDesigner() { MessageBox.Show("DemoControlDesigner", "Constructor"); } // The Dispose method override is implemented so event handlers // can be removed. This prevents objects from lingering in // memory beyond the desired lifespan. protected override void Dispose(bool disposing) { if (disposing) { if (this.changeService != null) { // Unhook event handlers. this.changeService.ComponentChanged -= new ComponentChangedEventHandler( ChangeService_ComponentChanged); this.changeService.ComponentAdded -= new ComponentEventHandler( ChangeService_ComponentAdded);

Visual C# Consolidado

1042

this.changeService.ComponentRemoved -= new ComponentEventHandler( changeService_ComponentRemoved); } if (this.eventService != null) { this.eventService.ActiveDesignerChanged -= new ActiveDesignerEventHandler( eventService_ActiveDesignerChanged); } if (this.selectionService != null) { this.selectionService.SelectionChanged -= new EventHandler( selectionService_SelectionChanged); } } base.Dispose(disposing); } // This method initializes the designer. public override void Initialize(IComponent component) { base.Initialize(component); // Connect to various designer services. InitializeServices(); // Set up the BackColor value that will be serialized. // This is the shadowed property on the designer. this.BackColor = Color.Chartreuse; // Set up the BackColor value that will be displayed. this.Control.BackColor = Color.AliceBlue; } // This method creates the DesignerActionList on demand, causing // smart tags to appear on the control being designed. public override DesignerActionListCollection ActionLists { get { if (null == actionLists) { actionLists = new DesignerActionListCollection(); actionLists.Add( new DemoActionList(this.Component)); } return actionLists; } } // This utility method connects the designer to various // services it will use. private void InitializeServices() { // Acquire a reference to DesignerActionService. this.actionService = GetService(typeof(DesignerActionService)) as DesignerActionService; // Acquire a reference to DesignerActionUIService. this.actionUiService = GetService(typeof(DesignerActionUIService)) as DesignerActionUIService; // Acquire a reference to IComponentChangeService. this.changeService = GetService(typeof(IComponentChangeService)) as IComponentChangeService; // Hook the IComponentChangeService events. if (this.changeService != null) { this.changeService.ComponentChanged += new ComponentChangedEventHandler( ChangeService_ComponentChanged); this.changeService.ComponentAdded += new ComponentEventHandler( ChangeService_ComponentAdded); this.changeService.ComponentRemoved += new ComponentEventHandler( changeService_ComponentRemoved); } // Acquire a reference to ISelectionService. this.selectionService = GetService(typeof(ISelectionService)) as ISelectionService; // Hook the SelectionChanged event. if (this.selectionService != null) { this.selectionService.SelectionChanged += new EventHandler(selectionService_SelectionChanged); } // Acquire a reference to IDesignerEventService. this.eventService = GetService(typeof(IDesignerEventService)) as IDesignerEventService; if (this.eventService != null) { this.eventService.ActiveDesignerChanged += new ActiveDesignerEventHandler( eventService_ActiveDesignerChanged); } // Acquire a reference to IDesignerHost. this.host = GetService(typeof(IDesignerHost)) as IDesignerHost; // Acquire a reference to IDesignerOptionService. this.optionService = GetService(typeof(IDesignerOptionService)) as IDesignerOptionService; // Acquire a reference to IEventBindingService. this.eventBindingService = GetService(typeof(IEventBindingService)) as IEventBindingService; // Acquire a reference to IExtenderListService. this.listService = GetService(typeof(IExtenderListService)) as IExtenderListService; // Acquire a reference to IReferenceService. this.referenceService = GetService(typeof(IReferenceService)) as IReferenceService; // Acquire a reference to ITypeResolutionService. this.typeResService = GetService(typeof(ITypeResolutionService)) as ITypeResolutionService; // Acquire a reference to IComponentDiscoveryService. this.componentDiscoveryService = GetService(typeof(IComponentDiscoveryService)) as IComponentDiscoveryService; // Acquire a reference to IToolboxService. this.toolboxService = GetService(typeof(IToolboxService)) as IToolboxService; // Acquire a reference to UndoEngine. this.undoEng = GetService(typeof(UndoEngine)) as UndoEngine; if (this.undoEng != null) { MessageBox.Show("UndoEngine"); } } // This is the shadowed property on the designer. // This value will be serialized instead of the // value of the control's property. public Color BackColor { get { return (Color)ShadowProperties["BackColor"]; } set { if (this.changeService != null) { PropertyDescriptor backColorDesc = TypeDescriptor.GetProperties(this.Control)["BackColor"]; this.changeService.OnComponentChanging( this.Control, backColorDesc);

Visual C# Consolidado

1043

this.ShadowProperties["BackColor"] = value; this.changeService.OnComponentChanged( this.Control, backColorDesc, null, null); } } } // This is the property added by the designer in the // PreFilterProperties method. private bool Locked { get { return lockedValue; } set { lockedValue = value; } } // The PreFilterProperties method is where you can add or remove // properties from the component being designed. // // In this implementation, the Visible property is removed, // the BackColor property is shadowed by the designer, and // the a new property, called Locked, is added. protected override void PreFilterProperties(IDictionary properties) { // Always call the base PreFilterProperties implementation // before you modify the properties collection. base.PreFilterProperties(properties); // Remove the visible property. properties.Remove("Visible"); // Shadow the BackColor property. PropertyDescriptor propertyDesc = TypeDescriptor.CreateProperty( typeof(DemoControlDesigner), (PropertyDescriptor)properties["BackColor"], new Attribute[0]); properties["BackColor"] = propertyDesc; // Create the Locked property. properties["Locked"] = TypeDescriptor.CreateProperty( typeof(DemoControlDesigner), "Locked", typeof(bool), CategoryAttribute.Design, DesignOnlyAttribute.Yes); } // The PostFilterProperties method is where you modify existing // properties. You must only use this method to modify existing // items. Do not add or remove items here. Also, be sure to // call base.PostFilterProperties(properties) after your filtering // logic. // // In this implementation, the Enabled property is hidden from // any PropertyGrid or Properties window. This is done by // creating a copy of the existing PropertyDescriptor and // attaching two new Attributes: Browsable and EditorBrowsable. protected override void PostFilterProperties(IDictionary properties) { PropertyDescriptor pd = properties["Enabled"] as PropertyDescriptor; pd = TypeDescriptor.CreateProperty( pd.ComponentType, pd, new Attribute[2] { new BrowsableAttribute(false), new EditorBrowsableAttribute(EditorBrowsableState.Never)}); properties[pd.Name] = pd; // Always call the base PostFilterProperties implementation // after you modify the properties collection. base.PostFilterProperties(properties); } #region Event Handlers void eventService_ActiveDesignerChanged( object sender, ActiveDesignerEventArgs e) { if (e.NewDesigner != null) { MessageBox.Show( e.NewDesigner.ToString(), "ActiveDesignerChanged"); } } void ChangeService_ComponentChanged( object sender, ComponentChangedEventArgs e) { string msg = String.Format( "{0}, {1}", e.Component, e.Member); MessageBox.Show(msg, "ComponentChanged"); } void ChangeService_ComponentAdded( object sender, ComponentEventArgs e) { MessageBox.Show( e.Component.ToString(), "ComponentAdded"); } void changeService_ComponentRemoved( object sender, ComponentEventArgs e) { MessageBox.Show( e.Component.ToString(), "ComponentRemoved"); } void selectionService_SelectionChanged( object sender, EventArgs e) { if (this.selectionService != null) { if (this.selectionService.PrimarySelection == this.Control) { MessageBox.Show( this.Control.ToString(), "SelectionChanged"); } } } #endregion // This class defines the smart tags that appear on the control // that is being designed. internal class DemoActionList : System.ComponentModel.Design.DesignerActionList { // Cache a reference to the designer host. private IDesignerHost host = null; // Cache a reference to the control. private DemoControl relatedControl = null; // Cache a reference to the designer. private DemoControlDesigner relatedDesigner = null; //The constructor associates the control //with the smart tag list. public DemoActionList(IComponent component) : base(component) { this.relatedControl = component as DemoControl; this.host = this.Component.Site.GetService(typeof(IDesignerHost)) as IDesignerHost; IDesigner dcd = host.GetDesigner(this.Component); this.relatedDesigner = dcd as DemoControlDesigner; } // This method creates and populates the // DesignerActionItemCollection which is used to // display smart tag items. public override DesignerActionItemCollection GetSortedActionItems() { DesignerActionItemCollection items = new DesignerActionItemCollection(); // If the Timer component has not been created, show the // "Create Timer" DesignerAction item. // // If the Timer component exists, show the timer-related // options. if (this.relatedDesigner.createdTimer == null) { items.Add(new DesignerActionMethodItem( this, "CreateTimer", "Create Timer", true)); } else { items.Add(new

Visual C# Consolidado

1044

DesignerActionMethodItem( this, "ShowEventHandlerCode", "Show Event Handler Code", true)); items.Add(new DesignerActionMethodItem( this, "RemoveTimer", "Remove Timer", true)); } items.Add(new DesignerActionMethodItem( this, "GetExtenderProviders", "Get Extender Providers", true)); items.Add(new DesignerActionMethodItem( this, "GetDemoControlReferences", "Get DemoControl References", true)); items.Add(new DesignerActionMethodItem( this, "GetPathOfAssembly", "Get Path of Executing Assembly", true)); items.Add(new DesignerActionMethodItem( this, "GetComponentTypes", "Get ScrollableControl Types", true)); items.Add(new DesignerActionMethodItem( this, "GetToolboxCategories", "Get Toolbox Categories", true)); items.Add(new DesignerActionMethodItem( this, "SetBackColor", "Set Back Color", true)); return items; } // This method creates a Timer component using the // IDesignerHost.CreateComponent method. It also // creates an event handler for the Timer component's // tick event. private void CreateTimer() { if (this.host != null) { if (this.relatedDesigner.createdTimer == null) { // Create and configure the Timer object. this.relatedDesigner.createdTimer = this.host.CreateComponent(typeof(Timer)) as Timer; Timer t = this.relatedDesigner.createdTimer; t.Interval = 1000; t.Enabled = true; EventDescriptorCollection eventColl = TypeDescriptor.GetEvents(t, new Attribute[0]); if (eventColl != null) { EventDescriptor ed = eventColl["Tick"] as EventDescriptor; if (ed != null) { PropertyDescriptor epd = this.relatedDesigner.eventBindingService.GetEventProperty(ed); epd.SetValue(t, "timer_Tick"); } } this.relatedDesigner.actionUiService.Refresh(this.relatedControl); } } } // This method uses the IEventBindingService.ShowCode // method to start the Code Editor. It places the caret // in the timer_tick method created by the CreateTimer method. private void ShowEventHandlerCode() { Timer t = this.relatedDesigner.createdTimer; if (t != null) { EventDescriptorCollection eventColl = TypeDescriptor.GetEvents(t, new Attribute[0]); if (eventColl != null) { EventDescriptor ed = eventColl["Tick"] as EventDescriptor; if (ed != null) { this.relatedDesigner.eventBindingService.ShowCode(t, ed); } } } } // This method uses the IDesignerHost.DestroyComponent method // to remove the Timer component from the design environment. private void RemoveTimer() { if (this.host != null) { if (this.relatedDesigner.createdTimer != null) { this.host.DestroyComponent( this.relatedDesigner.createdTimer); this.relatedDesigner.createdTimer = null; this.relatedDesigner.actionUiService.Refresh( this.relatedControl); } } } // This method uses IExtenderListService.GetExtenderProviders // to enumerate all the extender providers and display them // in a MessageBox. private void GetExtenderProviders() { if (this.relatedDesigner.listService != null) { StringBuilder sb = new StringBuilder(); IExtenderProvider[] providers = this.relatedDesigner.listService.GetExtenderProviders(); for (int i = 0; i < providers.Length; i++) { sb.Append(providers[i].ToString()); sb.Append("\r\n"); } MessageBox.Show( sb.ToString(), "Extender Providers"); } } // This method uses the IReferenceService.GetReferences method // to enumerate all the instances of DemoControl on the // design surface. private void GetDemoControlReferences() { if (this.relatedDesigner.referenceService != null) { StringBuilder sb = new StringBuilder(); object[] refs = this.relatedDesigner.referenceService.GetReferences(typeof(DemoControl)); for (int i = 0; i < refs.Length; i++) { sb.Append(refs[i].ToString()); sb.Append("\r\n"); } MessageBox.Show( sb.ToString(), "DemoControl References"); } } // This method uses the ITypeResolutionService.GetPathOfAssembly // method to display the path of the executing assembly. private void GetPathOfAssembly() { if (this.relatedDesigner.typeResService != null) { System.Reflection.AssemblyName name = System.Reflection.Assembly.GetExecutingAssembly().GetName(); MessageBox.Show( this.relatedDesigner.typeResService.GetPathOfAssembly(name), "Path of executing assembly"); } } // This method uses the IComponentDiscoveryService.GetComponentTypes // method to find all the types that derive from // ScrollableControl. private void GetComponentTypes() { if (this.relatedDesigner.componentDiscoveryService != null) { ICollection components = this.relatedDesigner.componentDiscoveryService.GetComponentTypes(host, typeof(ScrollableControl)); if

Visual C# Consolidado

1045

(components != null) { if (components.Count > 0) { StringBuilder sb = new StringBuilder(); IEnumerator e = components.GetEnumerator(); while (e.MoveNext()) { sb.Append(e.Current.ToString()); sb.Append("\r\n"); } MessageBox.Show( sb.ToString(), "Controls derived from ScrollableControl"); } } } } // This method uses the IToolboxService.CategoryNames // method to enumerate all the categories that appear // in the Toolbox. private void GetToolboxCategories() { if (this.relatedDesigner.toolboxService != null) { StringBuilder sb = new StringBuilder(); CategoryNameCollection names = this.relatedDesigner.toolboxService.CategoryNames; foreach (string name in names) { sb.Append(name.ToString()); sb.Append("\r\n"); } MessageBox.Show(sb.ToString(), "Toolbox Categories"); } } // This method sets the shadowed BackColor property on the // designer. This is the value that is serialized by the // design environment. private void SetBackColor() { ColorDialog d = new ColorDialog(); if (d.ShowDialog() == DialogResult.OK) { this.relatedDesigner.BackColor = d.Color; } } } }

A DemoControl classe derivada da UserControl classe, mas exige nenhuma lgica especial para estender sua interface do usurio em tempo de design. A interface de usurio em tempo de design implementada pela classe DemoControlDesigner. A conexo com servios A DemoControl classe adquire referncias a vrios servios em seu InitializeServices mtodo. C#
// These are the services which DemoControlDesigner will use. private DesignerActionService actionService = null; private DesignerActionUIService actionUiService = null; private IComponentChangeService changeService = null; private IDesignerEventService eventService = null; private IDesignerHost host = null; private IDesignerOptionService optionService = null; private IEventBindingService eventBindingService = null; private IExtenderListService listService = null; private IReferenceService referenceService = null; private ISelectionService selectionService = null; private ITypeResolutionService typeResService = null; private IComponentDiscoveryService componentDiscoveryService = null; private IToolboxService toolboxService = null; private UndoEngine undoEng = null;

C#
// This utility method connects the designer to various // services it will use. private void InitializeServices() { // Acquire a reference to DesignerActionService. this.actionService = GetService(typeof(DesignerActionService)) as DesignerActionService; // Acquire a reference to DesignerActionUIService. this.actionUiService = GetService(typeof(DesignerActionUIService)) as DesignerActionUIService; // Acquire a reference to IComponentChangeService. this.changeService = GetService(typeof(IComponentChangeService)) as IComponentChangeService; // Hook the IComponentChangeService events. if (this.changeService != null) { this.changeService.ComponentChanged += new ComponentChangedEventHandler( ChangeService_ComponentChanged); this.changeService.ComponentAdded += new ComponentEventHandler( ChangeService_ComponentAdded); this.changeService.ComponentRemoved += new ComponentEventHandler( changeService_ComponentRemoved); } // Acquire a reference to ISelectionService. this.selectionService = GetService(typeof(ISelectionService)) as ISelectionService; // Hook the SelectionChanged event. if (this.selectionService != null) { this.selectionService.SelectionChanged += new EventHandler(selectionService_SelectionChanged); } // Acquire a reference to IDesignerEventService. this.eventService = GetService(typeof(IDesignerEventService)) as IDesignerEventService; if (this.eventService != null) { this.eventService.ActiveDesignerChanged += new ActiveDesignerEventHandler(

Visual C# Consolidado

1046

eventService_ActiveDesignerChanged); } // Acquire a reference to IDesignerHost. this.host = GetService(typeof(IDesignerHost)) as IDesignerHost; // Acquire a reference to IDesignerOptionService. this.optionService = GetService(typeof(IDesignerOptionService)) as IDesignerOptionService; // Acquire a reference to IEventBindingService. this.eventBindingService = GetService(typeof(IEventBindingService)) as IEventBindingService; // Acquire a reference to IExtenderListService. this.listService = GetService(typeof(IExtenderListService)) as IExtenderListService; // Acquire a reference to IReferenceService. this.referenceService = GetService(typeof(IReferenceService)) as IReferenceService; // Acquire a reference to ITypeResolutionService. this.typeResService = GetService(typeof(ITypeResolutionService)) as ITypeResolutionService; // Acquire a reference to IComponentDiscoveryService. this.componentDiscoveryService = GetService(typeof(IComponentDiscoveryService)) as IComponentDiscoveryService; // Acquire a reference to IToolboxService. this.toolboxService = GetService(typeof(IToolboxService)) as IToolboxService; // Acquire a reference to UndoEngine. this.undoEng = GetService(typeof(UndoEngine)) as UndoEngine; if (this.undoEng != null) { MessageBox.Show("UndoEngine"); } }

Eventos servio Alguns servios eventos de oferta ao qual o designer pode anexar. Por exemplo, a DemoControlDesigner classe anexa manipuladores de eventos para o ComponentChanged, ComponentAdded., e ComponentRemoved eventos C#
// Hook the IComponentChangeService events. if (this.changeService != null) { this.changeService.ComponentChanged += new ComponentChangedEventHandler( ChangeService_ComponentChanged); this.changeService.ComponentAdded += new ComponentEventHandler( ChangeService_ComponentAdded); this.changeService.ComponentRemoved += new ComponentEventHandler( changeService_ComponentRemoved); }

C#
void ChangeService_ComponentChanged( object sender, ComponentChangedEventArgs e) { string msg = String.Format( "{0}, {1}", e.Component, e.Member); MessageBox.Show(msg, "ComponentChanged"); } void ChangeService_ComponentAdded( object sender, ComponentEventArgs e) { MessageBox.Show( e.Component.ToString(), "ComponentAdded"); } void changeService_ComponentRemoved( object sender, ComponentEventArgs e) { MessageBox.Show( e.Component.ToString(), "ComponentRemoved"); }

Implementar o mtodo Dispose no criador Tenha cuidado ao desanexar o manipuladores de eventos no mtodo seu designer Dispose. Isso evita comportamento indesejado quando seu designer sai do escopo. C#
// The Dispose method override is implemented so event handlers // can be removed. This prevents objects from lingering in // memory beyond the desired lifespan. protected override void Dispose(bool disposing) { if (disposing) { if (this.changeService != null) { // Unhook event handlers. this.changeService.ComponentChanged -= new ComponentChangedEventHandler( ChangeService_ComponentChanged); this.changeService.ComponentAdded -= new ComponentEventHandler( ChangeService_ComponentAdded); this.changeService.ComponentRemoved -= new ComponentEventHandler( changeService_ComponentRemoved); } if (this.eventService != null) { this.eventService.ActiveDesignerChanged -= new ActiveDesignerEventHandler(

Visual C# Consolidado

1047

eventService_ActiveDesignerChanged); } if (this.selectionService != null) { this.selectionService.SelectionChanged -= new EventHandler( selectionService_SelectionChanged); } } base.Dispose(disposing); }

Usando servios A DemoControl classe usa vrios servios no seu Painel marca inteligente. Uma classe interno chamado DemoActionList derivada da DesignerActionList classe. Essa classe tem mtodos que permitem que voc se criar, excluir, e enumerar vrios objetos que esto disponveis no ambiente de desenvolvimento. Ela expe esses mtodos como marcas inteligentes. Por exemplo, o exemplo de cdigo a seguir utiliza o GetExtenderProviders mtodo para enumerar todos os provedores Extender presentes no ambiente de desenvolvimento. C#
// This method uses IExtenderListService.GetExtenderProviders // to enumerate all the extender providers and display them // in a MessageBox. private void GetExtenderProviders() { if (this.relatedDesigner.listService != null) { StringBuilder sb = new StringBuilder(); IExtenderProvider[] providers = this.relatedDesigner.listService.GetExtenderProviders(); for (int i = 0; i < providers.Length; i++) { sb.Append(providers[i].ToString()); sb.Append("\r\n"); } MessageBox.Show( sb.ToString(), "Extender Providers"); } }

Compilando o cdigo Quando voc faz alteraes aos aspectos em tempo de criao de um componente, voc precisar recriar o projeto de controle. Alm disso, se no houver outro projeto Windows Forms que aberto e usa esse componente, voc provavelmente precisar atualizar o projeto para ver as alteraes. Normalmente, voc precisar fechar e reabrir a janela de design que contm o componente.

COMO: Serializar colees de tipos padro com o DesignerSerializationVisibilityAttribute


Quando os controles personalizados expor uma coleo como uma propriedade, voc pode serializar a coleta no horrio de design. Exemplo Este exemplo demonstra como usar a DesignerSerializationVisibilityAttribute classe para controlar como uma coleo for serializada em tempo de design. Aplicar o Content valor a sua propriedade coleo garante que a propriedade ser ser serializada. H suporte para esta tarefa no Visual Studio abrangente. C#
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Text; using System.Windows.Forms; // This sample demonstrates the use of the // DesignerSerializationVisibility attribute // to serialize a collection of strings // at design time. namespace SerializationDemo { class Form1 : Form { private SerializationDemoControl serializationDemoControl1; public Form1() { InitializeComponent(); } // The Windows Forms Designer emits code to this method. // If an instance of SerializationDemoControl is added // to the form, the Strings will be serialized here. private void InitializeComponent() { this.serializationDemoControl1 = new

Visual C# Consolidado

1048

SerializationDemo.SerializationDemoControl(); this.SuspendLayout(); // // serializationDemoControl1 // this.serializationDemoControl1.Location = new System.Drawing.Point(0, 0); this.serializationDemoControl1.Name = "serializationDemoControl1"; this.serializationDemoControl1.Padding = new System.Windows.Forms.Padding(5); this.serializationDemoControl1.TabIndex = 0; // // Form1 // this.ClientSize = new System.Drawing.Size(292, 273); this.Controls.Add(this.serializationDemoControl1); this.Name = "Form1"; this.Text = "Form1"; this.ResumeLayout(false); } [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new Form1()); } } public class SerializationDemoControl : UserControl { // This is the TextBox contained by // the SerializationDemoControl. private System.Windows.Forms.TextBox textBox1; // This field backs the Strings property. private String[] stringsValue = new String[1]; public SerializationDemoControl() { InitializeComponent(); } // When the DesignerSerializationVisibility attribute has // a value of "Content" or "Visible" the designer will // serialize the property. This property can also be edited // at design time with a CollectionEditor. [DesignerSerializationVisibility( DesignerSerializationVisibility.Content )] public String[] Strings { get { return this.stringsValue; } set { this.stringsValue = value; // Populate the contained TextBox with the values // in the stringsValue array. StringBuilder sb = new StringBuilder(this.stringsValue.Length); for (int i = 0; i < this.stringsValue.Length; i++) { sb.Append(this.stringsValue[i]); sb.Append("\r\n"); } this.textBox1.Text = sb.ToString(); } } private void InitializeComponent() { this.textBox1 = new System.Windows.Forms.TextBox(); this.SuspendLayout(); // Settings for the contained TextBox control. this.textBox1.AutoSize = false; this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill; this.textBox1.Location = new System.Drawing.Point(5, 5); this.textBox1.Margin = new System.Windows.Forms.Padding(0); this.textBox1.Multiline = true; this.textBox1.Name = "textBox1"; this.textBox1.ReadOnly = true; this.textBox1.ScrollBars = ScrollBars.Vertical; this.textBox1.Size = new System.Drawing.Size(140, 140); this.textBox1.TabIndex = 0; // Settings for SerializationDemoControl. this.Controls.Add(this.textBox1); this.Name = "SerializationDemoControl"; this.Padding = new System.Windows.Forms.Padding(5); this.ResumeLayout(false); } } }

Como: Executar inicializao personalizada para controles no modo de design


Voc pode usar o designer personalizado para inicializar componentes e controles como elas so criadas pelo ambiente de desenvolvimento. Exemplo O exemplo de cdigo a seguir demonstra como inicializar um controle quando ele criado pelo ambiente de desenvolvimento. Esta criao ocorre quando voc arrastar uma instncia do controle para o formulrio, e ele tambm ocorre quando voc inicia o designer para o formulrio. Para obter uma explicao sobre neste exemplo, de cdigo completa Consulte Como: Estender a aparncia e comportamento de controles no modo de design. C#
// This demonstrates changing the appearance of a control while // it is being designed. In this case, the BackColor property is // set to LightBlue. public override void InitializeNewComponent(IDictionary defaultValues) { base.InitializeNewComponent(defaultValues); PropertyDescriptor colorPropDesc = TypeDescriptor.GetProperties(Component)["BackColor"]; if (colorPropDesc != null &&

Visual C# Consolidado

1049

colorPropDesc.PropertyType == typeof(Color) && !colorPropDesc.IsReadOnly && colorPropDesc.IsBrowsable) { colorPropDesc.SetValue(Component, Color.LightBlue); } }

Quando o ambiente de desenvolvimento cria uma instncia do controle ou componente, ele chama mtodo seu designer InitializeNewComponent. No exemplo de cdigo anterior, a propriedade do controle BackColor definida usando um PropertyDescriptor. Compilando o cdigo Quando voc faz alteraes aos aspectos em tempo de criao de um componente, voc precisar recriar o projeto de controle. Alm disso, se no houver outro projeto Windows Forms que aberto e usa esse componente, voc provavelmente precisar atualizar o projeto para ver as alteraes. Normalmente, voc precisar fechar e reabrir a janela de design que contm o componente.

COMO: Implementar um conversor de tipo


Um conversor tipo pode ser usado para converter valores entre tipos de dados, e para ajudar configurao propriedade em tempo de design, fornecendo uma lista drop-down de valores para selecionar de converso de texto para valor-ou. Se configurado corretamente, um conversor tipo poder produzir Propriedade configurao cdigo utilizando e System.Reflection objetos para fornecer o sistema de serializao Designer as informaes necessrias para gerar cdigo que inicializa a propriedade em tempo de execuo. um InstanceDescriptor Conversores tipo para traduo valor Conversores tipo podem ser usados para converses valor seqncia-para-ou converso para ou de tipos de dados com suporte em tempo de criao quanto no tempo de execuo. Em um host como um navegador propriedade em um designer de formulrios, tipo Os conversores permitem que um valor de propriedade para ser representado como texto para o usurio, e eles podem converter um texto inserido pelo usurio em um valor do tipo de dados apropriado. Mais nativos tipos de dados (Int32. tipos de enumerao, e outros) ter conversores tipo padro que fornecem valor seqncia-para-converses e executar verificaes de validao, String Os conversores tipo padro esto no espao para nome System.ComponentModel e so nomeados TypeConverterNameConverter. Voc pode estender um conversor tipo quando a funcionalidade padro no adequada para seu fins ou implementar um conversor Tipo personalizado quando voc define um tipo personalizado que no tenha um conversor de tipos associados. Observao Um TypeConverterAttribute Atributo geralmente aplicado a uma propriedade ou um membro de dados para associ-lo a um conversor tipo. Se a um tipo, no necessrio para ser reaplicada aos membros propriedades ou dados do tipo. aplicada uma TypeConverterAttribute A implementao de um conversor tipo independente de qualquer funcionalidade da interface do usurio. Portanto, o mesmo conversor tipo pode ser aplicado no Windows Forms e em formulrios da Web. Para implementar um conversor de tipo simples que pode converter uma seqncia para um ponto 1. Definir uma classe que deriva de TypeConverter.

Visual C# Consolidado

1050

2. 3. 4.

Substituir o CanConvertFrom mtodo que especifica o tipo o conversor pode converter do. Este mtodo est sobrecarregado. Substituir o ConvertFrom mtodo que implementa a converso. Este mtodo est sobrecarregado. Substituir o CanConvertTo mtodo que especifica o tipo o conversor pode converter para. No necessrio para substituir esse mtodo para converso para um tipo de seqncia. Este mtodo est sobrecarregado. Substituir o ConvertTo mtodo que implementa a converso. Este mtodo est sobrecarregado. Substituir o IsValid mtodo que realiza validao. Este mtodo est sobrecarregado.

5. 6.

O exemplo de cdigo a seguir implementa um conversor tipo que converte um String tipo em um Point tipo e a Point. em um String O CanConvertTo e IsValid mtodos no so substitudos, neste exemplo. C#
using System; using System.ComponentModel; using System.Globalization; using System.Drawing; public class PointConverter : TypeConverter { // Overrides the CanConvertFrom method of TypeConverter. // The ITypeDescriptorContext interface provides the context for the // conversion. Typically, this interface is used at design time to // provide information about the design-time container. public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { if (sourceType == typeof(string)) { return true; } return base.CanConvertFrom(context, sourceType); } // Overrides the ConvertFrom method of TypeConverter. public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string) { string[] v = ((string)value).Split(new char[] {','}); return new Point(int.Parse(v[0]), int.Parse(v[1])); } return base.ConvertFrom(context, culture, value); } // Overrides the ConvertTo method of TypeConverter. public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(string)) { return ((Point)value).X + "," + ((Point)value).Y; } return base.ConvertTo(context, culture, value, destinationType); } }

Conversores tipo que fornecer uma lista de valores padro para uma janela Propriedades Um conversor tipo pode fornecer uma lista de valores para um tipo em um controle janela Propriedades. Quando um conversor tipo fornece um conjunto de valores padro para um tipo, o campo de entrada valor de uma propriedade do tipo associado em um controle janela Propriedades exibe uma seta para baixo que exibe uma lista de valores para definir o valor da propriedade para quando clicado. Quando uma propriedade do tipo est associado a este conversor tipo selecionada em um navegador Propriedade de ambiente em tempo de design, o campo de entrada Valor conter um boto que exibe uma lista drop-down dos valores padro para o tipo de propriedade que voc pode selecionar de. Para implementar um conversor de tipo simples que fornece uma lista drop-down de valores padro em um navegador Propriedade 1. 2. 3. Definir uma classe que deriva de TypeConverter. Substituir o GetStandardValuesSupported mtodo e retornar true. Substituir o GetStandardValues mtodo e retornar os valores padro para o tipo de propriedade com StandardValuesCollection. Os valores padro para uma propriedade deve ser do mesmo tipo que a propriedade prprio.

Visual C# Consolidado

1051

4. 5. 6.

Substituir o CanConvertFrom mtodo e retornar true para um sourceType valor de parmetro do tipo seqncia. Substituir o ConvertFrom mtodo e retornar o valor adequado para a propriedade com base no parmetro value. Aplicar uma TypeConverterAttribute que indica o tipo de seu conversor tipo para o tipo que voc est fornecendo um conjunto de valores padro para.

O exemplo a seguir demonstra um conversor tipo que fornece uma lista de valores padro para um controle janela Propriedades para uma propriedade do tipo ele est associado. O conversor tipo exemplo oferece suporte propriedades do tipo inteiro com o qual ele foi associado. Para usar o exemplo no Visual Studio .NET, compilar o cdigo para uma biblioteca de classe, e adicione o IntStandardValuesControl componente para o Toolbox. Do IntStandardValuesControl adicionar uma instncia da um formulrio no modo de design, e rolar para a TestInt propriedade na janela Propriedades enquanto o controle esteja selecionado. Selecione o campo de entrada de valor para a propriedade exibir uma seta para baixo que exibe uma lista drop-down de valores padro quando clicado. Inserir um valor inteiro ser adicione o valor para a lista de valores padro, e defina a propriedade para o valor especificado. C#
using System; using System.ComponentModel; using System.Collections; using System.Drawing; using System.Windows.Forms; namespace StandardValuesTest { public class StandardValuesIntConverter : System.ComponentModel.TypeConverter { private ArrayList values; public StandardValuesIntConverter() { // Initializes the standard values list with defaults. values = new ArrayList(new int[] { 1, 2, 3, 4, 5 }); } // Indicates this converter provides a list of standard values. public override bool GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext context) { return true; } // Returns a StandardValuesCollection of standard value objects. public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(System.ComponentModel.ITypeDescriptorContext context) { // Passes the local integer array. StandardValuesCollection svc = new StandardValuesCollection(values); return svc; } // Returns true for a sourceType of string to indicate that // conversions from string to integer are supported. (The // GetStandardValues method requires a string to native type // conversion because the items in the drop-down list are // translated to string.) public override bool CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType) { if( sourceType == typeof(string) ) return true; else return base.CanConvertFrom(context, sourceType); } // If the type of the value to convert is string, parses the string // and returns the integer to set the value of the property to. // This example first extends the integer array that supplies the // standard values collection if the user-entered value is not // already in the array. public override object ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { if( value.GetType() == typeof(string) ) { // Parses the string to get the integer to set to the property. int newVal = int.Parse((string)value); // Tests whether new integer is already in the list. if( !values.Contains(newVal) ) { // If the integer is not in list, adds it in order. values.Add(newVal); values.Sort(); } // Returns the integer value to assign to the property. return newVal; } else return base.ConvertFrom(context, culture, value); } } // Provides a test control with an integer property associated with // the StandardValuesIntConverter type converter. public class IntStandardValuesControl : System.Windows.Forms.UserControl { [TypeConverter(typeof(StandardValuesIntConverter))] public int TestInt { get { return this.integer_field; } set { if(value.GetType() == typeof(int)) this.integer_field = value; } } private int integer_field = 0; public IntStandardValuesControl() { this.BackColor = Color.White; this.Size =

Visual C# Consolidado

1052

new Size(472, 80); } // OnPaint override displays instructions for the example. protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) { if(this.DesignMode) { e.Graphics.DrawString("TypeConverter.GetStandardValues Example Control", new Font(FontFamily.GenericMonospace, 10), new SolidBrush(Color.Blue), 5, 5); e.Graphics.DrawString("The type converter for the TestInt property of this", new Font(FontFamily.GenericMonospace, 10), new SolidBrush(Color.Black), 5, 20); e.Graphics.DrawString("component provides a list of standard values to the", new Font(FontFamily.GenericMonospace, 10), new SolidBrush(Color.Black), 5, 30); e.Graphics.DrawString("Properties window. Setting a value through a property", new Font(FontFamily.GenericMonospace, 10), new SolidBrush(Color.Black), 5, 40); e.Graphics.DrawString("grid adds it to the list of standard values.", new Font(FontFamily.GenericMonospace, 10), new SolidBrush(Color.Black), 5, 50); } else { e.Graphics.DrawString("TypeConverter.GetStandardValues Example Control", new Font(FontFamily.GenericMonospace, 10), new SolidBrush(Color.Blue), 5, 5); e.Graphics.DrawString("This control was intended for use in design mode.", new Font(FontFamily.GenericMonospace, 10), new SolidBrush(Color.Black), 5, 20); } } } }

Horrio conversores tipo que gerar cdigo para inicializao Propriedade em execuo O.NET Framework fornece a capacidade para gerar cdigo de inicializao dinmica propriedade em tempo de design que ser inicializar uma propriedade em tempo de execuo. Os desenvolvedores podem criar cdigo de inicializao baseado no construtor-que produz um conversor tipo. Esses conversores tipo podem gerar cdigos de construtor dinamicamente usando valores definidos em tempo de design a fim de configurar propriedades de um tipo em tempo de execuo. O conversor tipo implementa a lgica para configurar o tipo e valores de um construtor para a propriedade. Caso voc precise produzir cdigo alm um construtor para inicializar uma propriedade, possvel fazer dinamicamente gerar cdigo por implementar uma personalizada CodeDomSerializer e aplicar uma DesignerSerializerAttribute que associa para um tipo com o tipo. seu CodeDomSerializer Essa abordagem normalmente usada somente para cenrios nos quais a gerao de cdigo dinamicamente controlado ou personalizados para inicializao componente importante. Para obter mais informaes sobre essa abordagem, consulte a documentao para CodeDomSerializer. Para criar um inicializador-baseado no Construtor de propriedades personalizadas, voc deve associar um conversor tipo com o tipo da propriedade Ao inicializar, e o conversor tipo deve ser capaz para converter em uma InstanceDescriptor. Para implementar um conversor tipo que produz Propriedade baseado no construtorcdigo de inicializao 1. 2. 3. Definir uma classe que deriva de TypeConverter. Substituir o CanConvertTo mtodo. Se igual tipo, o destinationType Parmetro a InstanceDescriptor retornar true. Substituir o ConvertTo mtodo. Se o destinationType Parmetro igual o InstanceDescriptor tipo, construir e retornar um InstanceDescriptor que representa o construtor e argumentos de construtor para gerar cdigo para. Para criar um InstanceDescriptor que representa o construtor apropriado e parmetros, obter ou GetConstructors mtodo com a assinatura a mtodo apropriado do construtor voc est procurando. da propriedade voc estiver inicializando, chamando um ConstructorInfo o Type o GetConstructor Criar um novo descritor da instncia e passar para o tipo que representa o tipo de construtor a ser usado, juntamente com uma matriz de objetos de parmetro que corresponde assinatura de construtor. o ConstructorInfo

Visual C# Consolidado

1053

O exemplo a seguir implementa um conversor tipo que pode gerar cdigo de inicializao Propriedade-baseado no Construtor de propriedades do tipo Point. C#
public class PointConverter : TypeConverter { public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if (destinationType == typeof(InstanceDescriptor)) return true; return base.CanConvertTo(context, destinationType); } public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { // Insert other ConvertTo operations here. // if (destinationType == typeof(InstanceDescriptor) && value is Point) { Point pt = (Point)value; ConstructorInfo ctor = typeof(Point).GetConstructor( new Type[] {typeof(int), typeof(int)}); if (ctor != null) { return new InstanceDescriptor(ctor, new object[] {pt.X, pt.Y}); } } return base.ConvertTo(context, culture, value, destinationType); }

Compilando o cdigo

Quando voc desenvolver seu personalizadas TypeConverter, recomendvel que voc definir o nmero de criao para incrementar com cada compilao. Isso impede que verses mais antigas, armazenadas em cache de sendo criada no ambiente de desenvolvimento. seu TypeConverter

COMO: Implementar um editor UI de tipo


Em algumas situaes, uma converso de valor para seqncia-simples que permite uma propriedade a ser exibido como texto em um navegador propriedade pode no adequada. Alm disso, um estilo de configurao valor seqncia-para-talvez no adequado para alguns tipos. Por exemplo, no caso de uma propriedade de cores, uma representao visual mais desejvel. Um editor tipo UI pode fornecer uma representao visual de um valor propriedade em um controle de grade propriedade, como um navegador Propriedade Design-time. Um editor tipo UI tambm pode fornecer uma interface de usurio personalizada para configurar o valor ou valores de um objeto de um tipo especfico. Observao Um EditorAttribute aplicada a um tipo ou como uma propriedade para associar o tipo ou a propriedade com um editor tipo UI. Para implementar um editor tipo UI personalizado para Windows Forms 1. 2. 3. Definir uma classe que deriva de System.Drawing.Design.UITypeEditor. Substituir o EditValue mtodo para configurar propriedades da interface do usurio. Este mtodo est sobrecarregado. Substituir o GetEditStyle mtodo para informar o navegador Propriedade sobre o suporte de edio que voc fornecer.

Para uma amostra completa, consulte Passo-a-passo: Implementando um Editor de Tipos de Interface do Usurio. Compilando o cdigo

Quando voc desenvolver seu personalizadas UITypeEditor, recomendvel que voc definir o nmero de criao para incrementar com cada compilao. Isso impede que verses mais antigas, armazenadas em cache de sendo criada no ambiente de desenvolvimento. seu UITypeEditor

Visual C# Consolidado

1054

Como: Estender a aparncia e comportamento de controles no modo de design


Voc pode estender o ambiente em tempo de design, criando seus prprios designer personalizado. O designer personalizado pode alterar a aparncia e comportamento do seu controle enquanto o usurio criar o controle. Exemplo O exemplo de cdigo a seguir demonstra como criar um designer personalizado que estende a interface de usurio (UI) para criar um controle personalizado. Uma classe chamada DemoControlDesigner Designer conectado a uma DemoControl classe, ativando Recursos os seguir:

Inicializao personalizada do novas DemoControl instncias; Representao visual do controle Margin e Padding Propriedades; Interao mouse e teclado para definir a Anchor propriedade; Interface de marca inteligente para definir a Anchor propriedade.

C#
using System; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing; using System.Drawing.Design; using System.Windows.Forms; using System.Windows.Forms.Design; using System.Windows.Forms.Design.Behavior; public class Form1 : Form { private DemoControl demoControl1; private DemoControl demoControl2; private System.ComponentModel.IContainer components = null; public Form1() { InitializeComponent(); } protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new Form1()); } private void InitializeComponent() { this.demoControl2 = new DemoControl(); this.demoControl1 = new DemoControl(); this.SuspendLayout(); // // demoControl2 // this.demoControl2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.demoControl2.BackColor = System.Drawing.Color.LightBlue; this.demoControl2.Location = new System.Drawing.Point(40, 40); this.demoControl2.Margin = new System.Windows.Forms.Padding(20); this.demoControl2.Name = "demoControl2"; this.demoControl2.Padding = new System.Windows.Forms.Padding(20); this.demoControl2.Size = new System.Drawing.Size(284, 177); this.demoControl2.TabIndex = 1; // // demoControl1 // this.demoControl1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left))); this.demoControl1.BackColor = System.Drawing.Color.LightBlue; this.demoControl1.Location = new System.Drawing.Point(354, 21); this.demoControl1.Margin = new System.Windows.Forms.Padding(10); this.demoControl1.Name = "demoControl1"; this.demoControl1.Padding = new System.Windows.Forms.Padding(10); this.demoControl1.Size = new System.Drawing.Size(184, 207); this.demoControl1.TabIndex = 0; // // Form1 // this.ClientSize = new System.Drawing.Size(594, 352); this.Controls.Add(this.demoControl2); this.Controls.Add(this.demoControl1); this.Name = "Form1"; this.Padding = new System.Windows.Forms.Padding(20); this.Text = "a"; this.ResumeLayout(false); } } // This control demonstrates the use of a custom designer. [DesignerAttribute(typeof(DemoControlDesigner))]

Visual C# Consolidado

1055

public class DemoControl : UserControl { private System.ComponentModel.IContainer components = null; public DemoControl() { InitializeComponent(); } protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } private void InitializeComponent() { // // DemoControl // this.Name = "DemoControl"; } } // This class demonstrates how to build a custom designer. // When an instance of the associated control type is created // in a design environment like Visual Studio, this designer // provides custom design-time behavior. // // When you drop an instance of DemoControl onto a form, // this designer creates two adorner windows: one is used // for glyphs that represent the Margin and Padding properties // of the control, and the other is used for glyphs that // represent the Anchor property. // // The AnchorGlyph type defines an AnchorBehavior type that // allows you to change the value of the Anchor property // by double-clicking on an AnchorGlyph. // // This designer also offers a smart tag for changing the // Anchor property. [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] public class DemoControlDesigner : ControlDesigner { // This adorner holds the glyphs that represent the Anchor property. private Adorner anchorAdorner = null; // This adorner holds the glyphs that represent the Margin and // Padding properties. private Adorner marginAndPaddingAdorner = null; // This defines the size of the anchor glyphs. private const int glyphSize = 6; // This defines the size of the hit bounds for an AnchorGlyph. private const int hitBoundSize = glyphSize + 4; // References to designer services, for convenience. private IComponentChangeService changeService = null; private ISelectionService selectionService = null; private BehaviorService behaviorSvc = null; // This is the collection of DesignerActionLists that // defines the smart tags offered on the control. private DesignerActionListCollection actionLists = null; public DemoControlDesigner() { } protected override void Dispose(bool disposing) { if (disposing) { if (this.behaviorSvc != null) { // Remove the adorners added by this designer from // the BehaviorService.Adorners collection. this.behaviorSvc.Adorners.Remove(this.marginAndPaddingAdorner); this.behaviorSvc.Adorners.Remove(this.anchorAdorner); } } base.Dispose(disposing); } // This method is where the designer initializes its state when // it is created. public override void Initialize(IComponent component) { base.Initialize(component); // Connect to various designer services. InitializeServices(); // Initialize adorners. this.InitializeMarginAndPaddingAdorner(); this.InitializeAnchorAdorner(); } // This demonstrates changing the appearance of a control while // it is being designed. In this case, the BackColor property is // set to LightBlue. public override void InitializeNewComponent(IDictionary defaultValues) { base.InitializeNewComponent(defaultValues); PropertyDescriptor colorPropDesc = TypeDescriptor.GetProperties(Component)["BackColor"]; if (colorPropDesc != null && colorPropDesc.PropertyType == typeof(Color) && !colorPropDesc.IsReadOnly && colorPropDesc.IsBrowsable) { colorPropDesc.SetValue(Component, Color.LightBlue); } } // This utility method creates an adorner for the anchor glyphs. // It then creates four AnchorGlyph objects and adds them to // the adorner's Glyphs collection. private void InitializeAnchorAdorner() { this.anchorAdorner = new Adorner(); this.behaviorSvc.Adorners.Add(this.anchorAdorner); this.anchorAdorner.Glyphs.Add(new AnchorGlyph( AnchorStyles.Left, this.behaviorSvc, this.changeService, this.selectionService, this, this.anchorAdorner) ); this.anchorAdorner.Glyphs.Add(new AnchorGlyph( AnchorStyles.Top, this.behaviorSvc, this.changeService, this.selectionService, this, this.anchorAdorner) ); this.anchorAdorner.Glyphs.Add(new AnchorGlyph( AnchorStyles.Right, this.behaviorSvc, this.changeService, this.selectionService, this, this.anchorAdorner) ); this.anchorAdorner.Glyphs.Add(new AnchorGlyph( AnchorStyles.Bottom, this.behaviorSvc, this.changeService, this.selectionService, this, this.anchorAdorner) ); } // This utility method creates an adorner for the margin and // padding glyphs. It then creates a MarginAndPaddingGlyph and // adds it to the adorner's Glyphs collection. private void InitializeMarginAndPaddingAdorner() { this.marginAndPaddingAdorner = new Adorner();

Visual C# Consolidado

1056

this.behaviorSvc.Adorners.Add(this.marginAndPaddingAdorner); this.marginAndPaddingAdorner.Glyphs.Add(new MarginAndPaddingGlyph( this.behaviorSvc, this.changeService, this.selectionService, this, this.marginAndPaddingAdorner)); } // This utility method connects the designer to various services. // These references are cached for convenience. private void InitializeServices() { // Acquire a reference to IComponentChangeService. this.changeService = GetService(typeof(IComponentChangeService)) as IComponentChangeService; // Acquire a reference to ISelectionService. this.selectionService = GetService(typeof(ISelectionService)) as ISelectionService; // Acquire a reference to BehaviorService. this.behaviorSvc = GetService(typeof(BehaviorService)) as BehaviorService; } // This method creates the DesignerActionList on demand, causing // smart tags to appear on the control being designed. public override DesignerActionListCollection ActionLists { get { if (null == actionLists) { actionLists = new DesignerActionListCollection(); actionLists.Add( new AnchorActionList(this.Component)); } return actionLists; } } // This class defines the smart tags that appear on the control // being designed. In this case, the Anchor property appears // on the smart tag and its value can be changed through a // UI Type Editor created automatically by the // DesignerActionService. public class AnchorActionList : System.ComponentModel.Design.DesignerActionList { // Cache a reference to the control. private DemoControl relatedControl; //The constructor associates the control //with the smart tag list. public AnchorActionList(IComponent component): base(component) { this.relatedControl = component as DemoControl; } // Properties that are targets of DesignerActionPropertyItem entries. public AnchorStyles Anchor { get { return this.relatedControl.Anchor; } set { PropertyDescriptor pdAnchor = TypeDescriptor.GetProperties(this.relatedControl)["Anchor"]; pdAnchor.SetValue(this.relatedControl, value); } } // This method creates and populates the // DesignerActionItemCollection which is used to // display smart tag items. public override DesignerActionItemCollection GetSortedActionItems() { DesignerActionItemCollection items = new DesignerActionItemCollection(); // Add a descriptive header. items.Add(new DesignerActionHeaderItem("Anchor Styles")); // Add a DesignerActionPropertyItem for the Anchor // property. This will be displayed in a panel using // the AnchorStyles UI Type Editor. items.Add(new DesignerActionPropertyItem( "Anchor", "Anchor Style") ); return items; } } #region Glyph Implementations // This class implements a MarginAndPaddingGlyph, which draws // borders highlighting the value of the control's Margin // property and the value of the control's Padding property. // // This glyph has no mouse or keyboard interaction, so its // related behavior class, MarginAndPaddingBehavior, has no // implementation. public class MarginAndPaddingGlyph : Glyph { private BehaviorService behaviorService = null; private IComponentChangeService changeService = null; private ISelectionService selectionService = null; private IDesigner relatedDesigner = null; private Adorner marginAndPaddingAdorner = null; private Control relatedControl = null; public MarginAndPaddingGlyph( BehaviorService behaviorService, IComponentChangeService changeService, ISelectionService selectionService, IDesigner relatedDesigner, Adorner marginAndPaddingAdorner) : base(new MarginAndPaddingBehavior()) { this.behaviorService = behaviorService; this.changeService = changeService; this.selectionService = selectionService; this.relatedDesigner = relatedDesigner; this.marginAndPaddingAdorner = marginAndPaddingAdorner; this.relatedControl = this.relatedDesigner.Component as Control; this.changeService.ComponentChanged += new ComponentChangedEventHandler(changeService_ComponentChanged); } void changeService_ComponentChanged(object sender, ComponentChangedEventArgs e) { if (object.ReferenceEquals( e.Component, this.relatedControl)) { if (e.Member.Name == "Margin" || e.Member.Name == "Padding" ) { this.marginAndPaddingAdorner.Invalidate(); } } } // This glyph has no mouse or keyboard interaction, so // GetHitTest can return null. public override Cursor GetHitTest(Point p) { return null; } // This method renders the glyph as a simple focus rectangle. public override void Paint(PaintEventArgs e) { ControlPaint.DrawFocusRectangle( e.Graphics, this.Bounds); ControlPaint.DrawFocusRectangle( e.Graphics, this.PaddingBounds); } // This glyph's Bounds property is a

Visual C# Consolidado

1057

Rectangle defined by // the value of the control's Margin property. public override Rectangle Bounds { get { Control c = this.relatedControl; Rectangle controlRect = this.behaviorService.ControlRectInAdornerWindow(this.relatedControl); Rectangle boundsVal = new Rectangle( controlRect.Left - c.Margin.Left, controlRect.Top - c.Margin.Top, controlRect.Width + c.Margin.Right*2, controlRect.Height + c.Margin.Bottom*2); return boundsVal; } } // The PaddingBounds property is a Rectangle defined by // the value of the control's Padding property. public Rectangle PaddingBounds { get { Control c = this.relatedControl; Rectangle controlRect = this.behaviorService.ControlRectInAdornerWindow(this.relatedControl); Rectangle boundsVal = new Rectangle( controlRect.Left + c.Padding.Left, controlRect.Top + c.Padding.Top, controlRect.Width c.Padding.Right * 2, controlRect.Height - c.Padding.Bottom * 2); return boundsVal; } } // There are no keyboard or mouse behaviors associated with // this glyph, but you could add them to this class. internal class MarginAndPaddingBehavior : Behavior { } } // This class implements an AnchorGlyph, which draws grab handles // that represent the value of the control's Anchor property. // // This glyph has mouse and keyboard interactions, which are // handled by the related behavior class, AnchorBehavior. // Doubleclicking on an AnchorGlyph causes its value to be // toggled between enabled and disable states. public class AnchorGlyph : Glyph { // This defines the bounds of the anchor glyph. protected Rectangle boundsValue; // This defines the bounds used for hit testing. // These bounds are typically different than the bounds // of the glyph itself. protected Rectangle hitBoundsValue; // This is the cursor returned if hit test is positive. protected Cursor hitTestCursor = Cursors.Hand; // Cache references to services that will be needed. private BehaviorService behaviorService = null; private IComponentChangeService changeService = null; private ISelectionService selectionService = null; // Keep a reference to the designer for convenience. private IDesigner relatedDesigner = null; // Keep a reference to the adorner for convenience. private Adorner anchorAdorner = null; // Keep a reference to the control being designed. private Control relatedControl = null; // This defines the AnchorStyle which this glyph represents. private AnchorStyles anchorStyle; public AnchorGlyph( AnchorStyles anchorStyle, BehaviorService behaviorService, IComponentChangeService changeService, ISelectionService selectionService, IDesigner relatedDesigner, Adorner anchorAdorner) : base(new AnchorBehavior(relatedDesigner)) { // Cache references for convenience. this.anchorStyle = anchorStyle; this.behaviorService = behaviorService; this.changeService = changeService; this.selectionService = selectionService; this.relatedDesigner = relatedDesigner; this.anchorAdorner = anchorAdorner; // Cache a reference to the control being designed. this.relatedControl = this.relatedDesigner.Component as Control; // Hook the SelectionChanged event. this.selectionService.SelectionChanged += new EventHandler(selectionService_SelectionChanged); // Hook the ComponentChanged event so the anchor glyphs // can correctly track the control's bounds. this.changeService.ComponentChanged += new ComponentChangedEventHandler(changeService_ComponentChanged); } #region Overrides public override Rectangle Bounds { get { return this.boundsValue; } } // This method renders the AnchorGlyph as a filled rectangle // if the glyph is enabled, or as an open rectangle if the // glyph is disabled. public override void Paint(PaintEventArgs e) { if (this.IsEnabled) { using (Brush b = new SolidBrush(Color.Tomato)) { e.Graphics.FillRectangle(b, this.Bounds); } } else { using (Pen p = new Pen(Color.Tomato)) { e.Graphics.DrawRectangle(p, this.Bounds); } } } // An AnchorGlyph has keyboard and mouse interaction, so it's // important to return a cursor when the mouse is located in // the glyph's hit region. When this occurs, the // AnchorBehavior becomes active. public override Cursor GetHitTest(Point p) { if (hitBoundsValue.Contains(p)) { return hitTestCursor; } return null; } #endregion #region Event Handlers // The AnchorGlyph objects should mimic the resize glyphs; // they should only be visible when the control is the // primary selection. The adorner is enabled when the // control is the primary selection and disabled when // it is not. void selectionService_SelectionChanged(object sender, EventArgs e) { if

Visual C# Consolidado

1058

(object.ReferenceEquals( this.selectionService.PrimarySelection, this.relatedControl)) { this.ComputeBounds(); this.anchorAdorner.Enabled = true; } else { this.anchorAdorner.Enabled = false; } } // If any of several properties change, the bounds of the // AnchorGlyph must be computed again. void changeService_ComponentChanged( object sender, ComponentChangedEventArgs e) { if (object.ReferenceEquals( e.Component, this.relatedControl)) { if (e.Member.Name == "Anchor" || e.Member.Name == "Size" || e.Member.Name == "Height" || e.Member.Name == "Width" || e.Member.Name == "Location") { // Compute the bounds of this glyph. this.ComputeBounds(); // Tell the adorner to repaint itself. this.anchorAdorner.Invalidate(); } } } #endregion #region Implementation // This utility method computes the position and size of // the AnchorGlyph in the Adorner window's coordinates. // It also computes the hit test bounds, which are // slightly larger than the glyph's bounds. private void ComputeBounds() { Rectangle translatedBounds = new Rectangle( this.behaviorService.ControlToAdornerWindow(this.relatedControl), this.relatedControl.Size); if ((this.anchorStyle & AnchorStyles.Top) == AnchorStyles.Top) { this.boundsValue = new Rectangle( translatedBounds.X + (translatedBounds.Width / 2) - (glyphSize / 2), translatedBounds.Y + glyphSize, glyphSize, glyphSize); } if ((this.anchorStyle & AnchorStyles.Bottom) == AnchorStyles.Bottom) { this.boundsValue = new Rectangle( translatedBounds.X + (translatedBounds.Width / 2) - (glyphSize / 2), translatedBounds.Bottom - 2*glyphSize, glyphSize, glyphSize); } if ((this.anchorStyle & AnchorStyles.Left) == AnchorStyles.Left) { this.boundsValue = new Rectangle( translatedBounds.X + glyphSize, translatedBounds.Y + (translatedBounds.Height / 2) - (glyphSize / 2), glyphSize, glyphSize); } if ((this.anchorStyle & AnchorStyles.Right) == AnchorStyles.Right) { this.boundsValue = new Rectangle( translatedBounds.Right - 2*glyphSize, translatedBounds.Y + (translatedBounds.Height / 2) - (glyphSize / 2), glyphSize, glyphSize); } this.hitBoundsValue = new Rectangle( this.Bounds.Left - hitBoundSize / 2, this.Bounds.Top - hitBoundSize / 2, hitBoundSize, hitBoundSize ); } // This utility property determines if the AnchorGlyph is // enabled, according to the value specified by the // control's Anchor property. private bool IsEnabled { get { return ((this.anchorStyle & this.relatedControl.Anchor) == this.anchorStyle); } } #endregion #region Behavior Implementation // This Behavior specifies mouse and keyboard handling when // an AnchorGlyph is active. This happens when // AnchorGlyph.GetHitTest returns a non-null value. internal class AnchorBehavior : Behavior { private IDesigner relatedDesigner = null; private Control relatedControl = null; internal AnchorBehavior(IDesigner relatedDesigner) { this.relatedDesigner = relatedDesigner; this.relatedControl = relatedDesigner.Component as Control; } // When you double-click on an AnchorGlyph, the value of // the control's Anchor property is toggled. // // Note that the value of the Anchor property is not set // by direct assignment. Instead, the // PropertyDescriptor.SetValue method is used. This // enables notification of the design environment, so // related events can be raised, for example, the // IComponentChangeService.ComponentChanged event. public override bool OnMouseDoubleClick( Glyph g, MouseButtons button, Point mouseLoc) { base.OnMouseDoubleClick(g, button, mouseLoc); if (button == MouseButtons.Left) { AnchorGlyph ag = g as AnchorGlyph; PropertyDescriptor pdAnchor = TypeDescriptor.GetProperties(ag.relatedControl)["Anchor"]; if (ag.IsEnabled) { // The glyph is enabled. // Clear the AnchorStyle flag to disable the Glyph. pdAnchor.SetValue( ag.relatedControl, ag.relatedControl.Anchor ^ ag.anchorStyle ); } else { // The glyph is disabled. // Set the AnchorStyle flag to enable the Glyph. pdAnchor.SetValue( ag.relatedControl, ag.relatedControl.Anchor | ag.anchorStyle); } } return true; } } #endregion } #endregion }

A DemoControl classe derivada da UserControl classe, mas exige nenhuma lgica especial para estender sua interface do usurio em tempo de design. A interface de usurio em tempo de design implementada pela classe DemoControlDesigner.

Visual C# Consolidado

1059

Os DemoControlDesigner usos de classe a Glyph, Behavior., e Adorner classes para estender a experincia em tempo de design para DemoControl Do Glyph so implementados com os aspectos visuais da interface de usurio estendida e Adorner Classes. As interaes mouse e teclado so implementadas na classe Behavior. Voc pode estender a aparncia Design-time e o comportamento do seu designer, substituindo apenas ControlDesigner mtodos como OnPaintAdornments e OnMouseEnter. mas a Glyph classe fornece uma maneira conveniente de aparncia e comportamento lgica fora do seu designer fator Estendendo a aparncia Voc estender a aparncia do seu projeto personalizado UI, implementar uma Glyph classe. A MarginAndPaddingGlyph classe deriva da classe Glyph. Ele pinta dois retngulos que representam os valores do controle Margin e Padding Propriedades. A MarginAndPaddingGlyph classe manipula o ComponentChanged evento para atualizar a exibio quando os valores das propriedades do controle Margin ou Padding a alterao. O exemplo de cdigo a seguir mostra como implementar uma MarginAndPaddingGlyph classe que deriva de Glyph. C#
// This class implements a MarginAndPaddingGlyph, which draws // borders highlighting the value of the control's Margin // property and the value of the control's Padding property. // // This glyph has no mouse or keyboard interaction, so its // related behavior class, MarginAndPaddingBehavior, has no // implementation. public class MarginAndPaddingGlyph : Glyph { private BehaviorService behaviorService = null; private IComponentChangeService changeService = null; private ISelectionService selectionService = null; private IDesigner relatedDesigner = null; private Adorner marginAndPaddingAdorner = null; private Control relatedControl = null; public MarginAndPaddingGlyph( BehaviorService behaviorService, IComponentChangeService changeService, ISelectionService selectionService, IDesigner relatedDesigner, Adorner marginAndPaddingAdorner) : base(new MarginAndPaddingBehavior()) { this.behaviorService = behaviorService; this.changeService = changeService; this.selectionService = selectionService; this.relatedDesigner = relatedDesigner; this.marginAndPaddingAdorner = marginAndPaddingAdorner; this.relatedControl = this.relatedDesigner.Component as Control; this.changeService.ComponentChanged += new ComponentChangedEventHandler(changeService_ComponentChanged); } void changeService_ComponentChanged(object sender, ComponentChangedEventArgs e) { if (object.ReferenceEquals( e.Component, this.relatedControl)) { if (e.Member.Name == "Margin" || e.Member.Name == "Padding" ) { this.marginAndPaddingAdorner.Invalidate(); } } } // This glyph has no mouse or keyboard interaction, so // GetHitTest can return null. public override Cursor GetHitTest(Point p) { return null; } // This method renders the glyph as a simple focus rectangle. public override void Paint(PaintEventArgs e) { ControlPaint.DrawFocusRectangle( e.Graphics, this.Bounds); ControlPaint.DrawFocusRectangle( e.Graphics, this.PaddingBounds); } // This glyph's Bounds property is a Rectangle defined by // the value of the control's Margin property. public override Rectangle Bounds { get { Control c = this.relatedControl; Rectangle controlRect = this.behaviorService.ControlRectInAdornerWindow(this.relatedControl); Rectangle boundsVal = new Rectangle( controlRect.Left - c.Margin.Left, controlRect.Top - c.Margin.Top, controlRect.Width + c.Margin.Right*2, controlRect.Height + c.Margin.Bottom*2); return boundsVal; } } // The PaddingBounds property is a Rectangle defined by // the value of the control's Padding property. public Rectangle PaddingBounds { get { Control c = this.relatedControl; Rectangle controlRect =

Visual C# Consolidado

1060

this.behaviorService.ControlRectInAdornerWindow(this.relatedControl); Rectangle boundsVal = new Rectangle( controlRect.Left + c.Padding.Left, controlRect.Top + c.Padding.Top, controlRect.Width c.Padding.Right * 2, controlRect.Height - c.Padding.Bottom * 2); return boundsVal; } } // There are no keyboard or mouse behaviors associated with // this glyph, but you could add them to this class. internal class MarginAndPaddingBehavior : Behavior { } }

Estender o comportamento Voc estender o comportamento do seu projeto personalizado UI, implementar uma Behavior classe. A Behavior classe subordinado Glyph Classe. Cuidado O ambiente de desenvolvimento no permite Behavior objetos que no esto conectados a um Glyph objeto. Voc anexar um Behavior objeto a um Glyph objeto no construtor seu Glyph do tipo. O exemplo de cdigo a seguir mostra como implementar o AnchorGlyph Construtor. C#
public AnchorGlyph( AnchorStyles anchorStyle, BehaviorService behaviorService, IComponentChangeService changeService, ISelectionService selectionService, IDesigner relatedDesigner, Adorner anchorAdorner) : base(new AnchorBehavior(relatedDesigner)) { // Cache references for convenience. this.anchorStyle = anchorStyle; this.behaviorService = behaviorService; this.changeService = changeService; this.selectionService = selectionService; this.relatedDesigner = relatedDesigner; this.anchorAdorner = anchorAdorner; // Cache a reference to the control being designed. this.relatedControl = this.relatedDesigner.Component as Control; // Hook the SelectionChanged event. this.selectionService.SelectionChanged += new EventHandler(selectionService_SelectionChanged); // Hook the ComponentChanged event so the anchor glyphs // can correctly track the control's bounds. this.changeService.ComponentChanged += new ComponentChangedEventHandler(changeService_ComponentChanged); }

A AnchorGlyph classe pinta alas de seleo que correspondem ao valor da propriedade do controle Anchor. Voc substituir o GetHitTest mtodo para retornar um Cursor objeto quando o ponteiro do mouse est sobre o glifo o ponto de acesso. Quando o ambiente de desenvolvimento recebe um valor do GetHitTest mtodo que no null estiver, ele ativa o Behavior objeto associado com o Glyph. O exemplo de cdigo a seguir mostra como implementar a AnchorGlyph classe. C#
// This class implements an AnchorGlyph, which draws grab handles // that represent the value of the control's Anchor property. // // This glyph has mouse and keyboard interactions, which are // handled by the related behavior class, AnchorBehavior. // Double-clicking on an AnchorGlyph causes its value to be // toggled between enabled and disable states. public class AnchorGlyph : Glyph { // This defines the bounds of the anchor glyph. protected Rectangle boundsValue; // This defines the bounds used for hit testing. // These bounds are typically different than the bounds // of the glyph itself. protected Rectangle hitBoundsValue; //

Visual C# Consolidado

1061

This is the cursor returned if hit test is positive. protected Cursor hitTestCursor = Cursors.Hand; // Cache references to services that will be needed. private BehaviorService behaviorService = null; private IComponentChangeService changeService = null; private ISelectionService selectionService = null; // Keep a reference to the designer for convenience. private IDesigner relatedDesigner = null; // Keep a reference to the adorner for convenience. private Adorner anchorAdorner = null; // Keep a reference to the control being designed. private Control relatedControl = null; // This defines the AnchorStyle which this glyph represents. private AnchorStyles anchorStyle; public AnchorGlyph( AnchorStyles anchorStyle, BehaviorService behaviorService, IComponentChangeService changeService, ISelectionService selectionService, IDesigner relatedDesigner, Adorner anchorAdorner) : base(new AnchorBehavior(relatedDesigner)) { // Cache references for convenience. this.anchorStyle = anchorStyle; this.behaviorService = behaviorService; this.changeService = changeService; this.selectionService = selectionService; this.relatedDesigner = relatedDesigner; this.anchorAdorner = anchorAdorner; // Cache a reference to the control being designed. this.relatedControl = this.relatedDesigner.Component as Control; // Hook the SelectionChanged event. this.selectionService.SelectionChanged += new EventHandler(selectionService_SelectionChanged); // Hook the ComponentChanged event so the anchor glyphs // can correctly track the control's bounds. this.changeService.ComponentChanged += new ComponentChangedEventHandler(changeService_ComponentChanged); } #region Overrides public override Rectangle Bounds { get { return this.boundsValue; } } // This method renders the AnchorGlyph as a filled rectangle // if the glyph is enabled, or as an open rectangle if the // glyph is disabled. public override void Paint(PaintEventArgs e) { if (this.IsEnabled) { using (Brush b = new SolidBrush(Color.Tomato)) { e.Graphics.FillRectangle(b, this.Bounds); } } else { using (Pen p = new Pen(Color.Tomato)) { e.Graphics.DrawRectangle(p, this.Bounds); } } } // An AnchorGlyph has keyboard and mouse interaction, so it's // important to return a cursor when the mouse is located in // the glyph's hit region. When this occurs, the // AnchorBehavior becomes active. public override Cursor GetHitTest(Point p) { if (hitBoundsValue.Contains(p)) { return hitTestCursor; } return null; } #endregion #region Event Handlers // The AnchorGlyph objects should mimic the resize glyphs; // they should only be visible when the control is the // primary selection. The adorner is enabled when the // control is the primary selection and disabled when // it is not. void selectionService_SelectionChanged(object sender, EventArgs e) { if (object.ReferenceEquals( this.selectionService.PrimarySelection, this.relatedControl)) { this.ComputeBounds(); this.anchorAdorner.Enabled = true; } else { this.anchorAdorner.Enabled = false; } } // If any of several properties change, the bounds of the // AnchorGlyph must be computed again. void changeService_ComponentChanged( object sender, ComponentChangedEventArgs e) { if (object.ReferenceEquals( e.Component, this.relatedControl)) { if (e.Member.Name == "Anchor" || e.Member.Name == "Size" || e.Member.Name == "Height" || e.Member.Name == "Width" || e.Member.Name == "Location") { // Compute the bounds of this glyph. this.ComputeBounds(); // Tell the adorner to repaint itself. this.anchorAdorner.Invalidate(); } } } #endregion #region Implementation // This utility method computes the position and size of // the AnchorGlyph in the Adorner window's coordinates. // It also computes the hit test bounds, which are // slightly larger than the glyph's bounds. private void ComputeBounds() { Rectangle translatedBounds = new Rectangle( this.behaviorService.ControlToAdornerWindow(this.relatedControl), this.relatedControl.Size); if ((this.anchorStyle & AnchorStyles.Top) == AnchorStyles.Top) { this.boundsValue = new Rectangle( translatedBounds.X + (translatedBounds.Width / 2) - (glyphSize / 2), translatedBounds.Y + glyphSize, glyphSize, glyphSize); } if ((this.anchorStyle & AnchorStyles.Bottom) == AnchorStyles.Bottom) { this.boundsValue = new Rectangle( translatedBounds.X + (translatedBounds.Width / 2) - (glyphSize / 2), translatedBounds.Bottom - 2*glyphSize, glyphSize, glyphSize); } if ((this.anchorStyle & AnchorStyles.Left) == AnchorStyles.Left) { this.boundsValue = new Rectangle( translatedBounds.X + glyphSize,

Visual C# Consolidado

1062

translatedBounds.Y + (translatedBounds.Height / 2) - (glyphSize / 2), glyphSize, glyphSize); } if ((this.anchorStyle & AnchorStyles.Right) == AnchorStyles.Right) { this.boundsValue = new Rectangle( translatedBounds.Right - 2*glyphSize, translatedBounds.Y + (translatedBounds.Height / 2) - (glyphSize / 2), glyphSize, glyphSize); } this.hitBoundsValue = new Rectangle( this.Bounds.Left - hitBoundSize / 2, this.Bounds.Top - hitBoundSize / 2, hitBoundSize, hitBoundSize ); } // This utility property determines if the AnchorGlyph is // enabled, according to the value specified by the // control's Anchor property. private bool IsEnabled { get { return ((this.anchorStyle & this.relatedControl.Anchor) == this.anchorStyle); } } #endregion

A AnchorBehavior classe implementa a interao de mouse personalizado. Voc substituir Behavior mtodos de classe como OnMouseEnter Para definir a UI personalizado. O exemplo de cdigo a seguir mostra como implementar a AnchorBehavior classe. C#
// This Behavior specifies mouse and keyboard handling when // an AnchorGlyph is active. This happens when // AnchorGlyph.GetHitTest returns a non-null value. internal class AnchorBehavior : Behavior { private IDesigner relatedDesigner = null; private Control relatedControl = null; internal AnchorBehavior(IDesigner relatedDesigner) { this.relatedDesigner = relatedDesigner; this.relatedControl = relatedDesigner.Component as Control; } // When you double-click on an AnchorGlyph, the value of // the control's Anchor property is toggled. // // Note that the value of the Anchor property is not set // by direct assignment. Instead, the // PropertyDescriptor.SetValue method is used. This // enables notification of the design environment, so // related events can be raised, for example, the // IComponentChangeService.ComponentChanged event. public override bool OnMouseDoubleClick( Glyph g, MouseButtons button, Point mouseLoc) { base.OnMouseDoubleClick(g, button, mouseLoc); if (button == MouseButtons.Left) { AnchorGlyph ag = g as AnchorGlyph; PropertyDescriptor pdAnchor = TypeDescriptor.GetProperties(ag.relatedControl)["Anchor"]; if (ag.IsEnabled) { // The glyph is enabled. // Clear the AnchorStyle flag to disable the Glyph. pdAnchor.SetValue( ag.relatedControl, ag.relatedControl.Anchor ^ ag.anchorStyle ); } else { // The glyph is disabled. // Set the AnchorStyle flag to enable the Glyph. pdAnchor.SetValue( ag.relatedControl, ag.relatedControl.Anchor | ag.anchorStyle); } } return true; } }

Ativar A interface do usurio em tempo de criao Ativar o glifos, criando uma Adorner janela e adicion-los para a Glyphs coleo. Ativar a UI Design-time personalizada adicionando a Adorner janela coleo Adorners da BehaviorService. Executar essas aes no mtodo seu designer Initialize. O exemplo de cdigo a seguir mostra como ativar a interface Design-time. C#
// This method is where the designer initializes its state when // it is created. public override void Initialize(IComponent component) { base.Initialize(component); // Connect to various designer services. InitializeServices(); // Initialize adorners. this.InitializeMarginAndPaddingAdorner(); this.InitializeAnchorAdorner(); }

C#

Visual C# Consolidado

1063

// This utility method creates an adorner for the anchor glyphs. // It then creates four AnchorGlyph objects and adds them to // the adorner's Glyphs collection. private void InitializeAnchorAdorner() { this.anchorAdorner = new Adorner(); this.behaviorSvc.Adorners.Add(this.anchorAdorner); this.anchorAdorner.Glyphs.Add(new AnchorGlyph( AnchorStyles.Left, this.behaviorSvc, this.changeService, this.selectionService, this, this.anchorAdorner) ); this.anchorAdorner.Glyphs.Add(new AnchorGlyph( AnchorStyles.Top, this.behaviorSvc, this.changeService, this.selectionService, this, this.anchorAdorner) ); this.anchorAdorner.Glyphs.Add(new AnchorGlyph( AnchorStyles.Right, this.behaviorSvc, this.changeService, this.selectionService, this, this.anchorAdorner) ); this.anchorAdorner.Glyphs.Add(new AnchorGlyph( AnchorStyles.Bottom, this.behaviorSvc, this.changeService, this.selectionService, this, this.anchorAdorner) ); }

C#
// This utility method creates an adorner for the margin and // padding glyphs. It then creates a MarginAndPaddingGlyph and // adds it to the adorner's Glyphs collection. private void InitializeMarginAndPaddingAdorner() { this.marginAndPaddingAdorner = new Adorner(); this.behaviorSvc.Adorners.Add(this.marginAndPaddingAdorner); this.marginAndPaddingAdorner.Glyphs.Add(new MarginAndPaddingGlyph( this.behaviorSvc, this.changeService, this.selectionService, this, this.marginAndPaddingAdorner)); }

Compilando o cdigo Quando voc faz alteraes aos aspectos em tempo de criao de um componente, voc precisar recriar o projeto de controle. Alm disso, se no houver outro projeto Windows Forms que aberto e usa esse componente, voc provavelmente precisar atualizar o projeto para ver as alteraes. Normalmente, voc precisar fechar e reabrir a janela de design que contm o componente.

COMO: Criar um controle de formulrios do Windows que tira vantagem de recursos em tempo de criao
O exemplo a seguir ilustra como criar um controle personalizado e um designer personalizado associado. Quando essa biblioteca criada, voc pode criar implementaes personalizadas MarqueeControl que executados em um formulrio. H suporte para esta tarefa no Visual Studio abrangente. Exemplo C#
using System; namespace MarqueeControlLibrary { // This interface defines the contract for any class that is to // be used in constructing a MarqueeControl. public interface IMarqueeWidget { // This method starts the animation. If the control can // contain other classes that implement IMarqueeWidget as // children, the control should call StartMarquee on all // its IMarqueeWidget child controls. void StartMarquee(); // This method stops the animation. If the control can // contain other classes that implement IMarqueeWidget as // children, the control should call StopMarquee on all // its IMarqueeWidget child controls. void StopMarquee(); // This method specifies the refresh rate for the animation, // in milliseconds. int UpdatePeriod { get; set; } } }

C#

Visual C# Consolidado

1064

using System; using System.ComponentModel; using System.ComponentModel.Design; using System.Diagnostics; using System.Drawing; using System.Drawing.Design; using System.Threading; using System.Windows.Forms; using System.Windows.Forms.Design; namespace MarqueeControlLibrary { // This defines the possible values for the MarqueeBorder // control's SpinDirection property. public enum MarqueeSpinDirection { CW, CCW } // This defines the possible values for the MarqueeBorder // control's LightShape property. public enum MarqueeLightShape { Square, Circle } [Designer(typeof(MarqueeControlLibrary.Design.MarqueeBorderDesigner ))] [ToolboxItemFilter("MarqueeControlLibrary.MarqueeBorder", ToolboxItemFilterType.Require)] public class MarqueeBorder : Panel, IMarqueeWidget { public static int MaxLightSize = 10; // These fields back the public properties. private int updatePeriodValue = 50; private int lightSizeValue = 5; private int lightPeriodValue = 3; private int lightSpacingValue = 1; private Color lightColorValue; private Color darkColorValue; private MarqueeSpinDirection spinDirectionValue = MarqueeSpinDirection.CW; private MarqueeLightShape lightShapeValue = MarqueeLightShape.Square; // These brushes are used to paint the light and dark // colors of the marquee lights. private Brush lightBrush; private Brush darkBrush; // This field tracks the progress of the "first" light as it // "travels" around the marquee border. private int currentOffset = 0; // This component updates the control asynchronously. private System.ComponentModel.BackgroundWorker backgroundWorker1; public MarqueeBorder() { // This call is required by the Windows.Forms Form Designer. InitializeComponent(); // Initialize light and dark colors // to the control's default values. this.lightColorValue = this.ForeColor; this.darkColorValue = this.BackColor; this.lightBrush = new SolidBrush(this.lightColorValue); this.darkBrush = new SolidBrush(this.darkColorValue); // The MarqueeBorder control manages its own padding, // because it requires that any contained controls do // not overlap any of the marquee lights. int pad = 2 * (this.lightSizeValue + this.lightSpacingValue); this.Padding = new Padding(pad, pad, pad, pad); SetStyle(ControlStyles.OptimizedDoubleBuffer, true); } /////////////////////////////////////////////////////////////////////// #region IMarqueeWidget implementation public virtual void StartMarquee() { // The MarqueeBorder control may contain any number of // controls that implement IMarqueeWidget, so find // each IMarqueeWidget child and call its StartMarquee // method. foreach (Control cntrl in this.Controls) { if (cntrl is IMarqueeWidget) { IMarqueeWidget widget = cntrl as IMarqueeWidget; widget.StartMarquee(); } } // Start the updating thread and pass it the UpdatePeriod. this.backgroundWorker1.RunWorkerAsync(this.UpdatePeriod); } public virtual void StopMarquee() { // The MarqueeBorder control may contain any number of // controls that implement IMarqueeWidget, so find // each IMarqueeWidget child and call its StopMarquee // method. foreach (Control cntrl in this.Controls) { if (cntrl is IMarqueeWidget) { IMarqueeWidget widget = cntrl as IMarqueeWidget; widget.StopMarquee(); } } // Stop the updating thread. this.backgroundWorker1.CancelAsync(); } [Category("Marquee")] [Browsable(true)] public virtual int UpdatePeriod { get { return this.updatePeriodValue; } set { if (value > 0) { this.updatePeriodValue = value; } else { throw new ArgumentOutOfRangeException("UpdatePeriod", "must be > 0"); } } } #endregion /////////////////////////////////////////////////////////////////////// #region Public Properties [Category("Marquee")] [Browsable(true)] public int LightSize { get { return this.lightSizeValue; } set { if (value > 0 && value <= MaxLightSize) { this.lightSizeValue = value; this.DockPadding.All = 2 * value; } else { throw new ArgumentOutOfRangeException("LightSize", "must be > 0 and < MaxLightSize"); } } } [Category("Marquee")] [Browsable(true)] public int LightPeriod { get { return this.lightPeriodValue; } set { if (value > 0) { this.lightPeriodValue = value; } else { throw new ArgumentOutOfRangeException("LightPeriod", "must be > 0 "); } } } [Category("Marquee")] [Browsable(true)] public Color LightColor { get { return this.lightColorValue; } set { // The LightColor property is only changed if the // client provides a different value. Comparing values // from the ToArgb

Visual C# Consolidado

1065

method is the recommended test for // equality between Color structs. if (this.lightColorValue.ToArgb() != value.ToArgb()) { this.lightColorValue = value; this.lightBrush = new SolidBrush(value); } } } [Category("Marquee")] [Browsable(true)] public Color DarkColor { get { return this.darkColorValue; } set { // The DarkColor property is only changed if the // client provides a different value. Comparing values // from the ToArgb method is the recommended test for // equality between Color structs. if (this.darkColorValue.ToArgb() != value.ToArgb()) { this.darkColorValue = value; this.darkBrush = new SolidBrush(value); } } } [Category("Marquee")] [Browsable(true)] public int LightSpacing { get { return this.lightSpacingValue; } set { if (value >= 0) { this.lightSpacingValue = value; } else { throw new ArgumentOutOfRangeException("LightSpacing", "must be >= 0"); } } } [Category("Marquee")] [Browsable(true)] [EditorAttribute(typeof(LightShapeEditor), typeof(System.Drawing.Design.UITypeEditor))] public MarqueeLightShape LightShape { get { return this.lightShapeValue; } set { this.lightShapeValue = value; } } [Category("Marquee")] [Browsable(true)] public MarqueeSpinDirection SpinDirection { get { return this.spinDirectionValue; } set { this.spinDirectionValue = value; } } #endregion /////////////////////////////////////////////////////////////////////// #region Implementation protected override void OnLayout(LayoutEventArgs levent) { base.OnLayout(levent); // Repaint when the layout has changed. this.Refresh(); } // This method paints the lights around the border of the // control. It paints the top row first, followed by the // right side, the bottom row, and the left side. The color // of each light is determined by the IsLit method and // depends on the light's position relative to the value // of currentOffset. protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; g.Clear(this.BackColor); base.OnPaint(e); // If the control is large enough, draw some lights. if (this.Width > MaxLightSize && this.Height > MaxLightSize) { // The position of the next light will be incremented // by this value, which is equal to the sum of the // light size and the space between two lights. int increment = this.lightSizeValue + this.lightSpacingValue; // Compute the number of lights to be drawn along the // horizontal edges of the control. int horizontalLights = (this.Width - increment) / increment; // Compute the number of lights to be drawn along the // vertical edges of the control. int verticalLights = (this.Height increment) / increment; // These local variables will be used to position and // paint each light. int xPos = 0; int yPos = 0; int lightCounter = 0; Brush brush; // Draw the top row of lights. for (int i = 0; i < horizontalLights; i++) { brush = IsLit(lightCounter) ? this.lightBrush : this.darkBrush; DrawLight(g, brush, xPos, yPos); xPos += increment; lightCounter++; } // Draw the lights flush with the right edge of the control. xPos = this.Width - this.lightSizeValue; // Draw the right column of lights. for (int i = 0; i < verticalLights; i++) { brush = IsLit(lightCounter) ? this.lightBrush : this.darkBrush; DrawLight(g, brush, xPos, yPos); yPos += increment; lightCounter++; } // Draw the lights flush with the bottom edge of the control. yPos = this.Height - this.lightSizeValue; // Draw the bottom row of lights. for (int i = 0; i < horizontalLights; i++) { brush = IsLit(lightCounter) ? this.lightBrush : this.darkBrush; DrawLight(g, brush, xPos, yPos); xPos -= increment; lightCounter++; } // Draw the lights flush with the left edge of the control. xPos = 0; // Draw the left column of lights. for (int i = 0; i < verticalLights; i++) { brush = IsLit(lightCounter) ? this.lightBrush : this.darkBrush; DrawLight(g, brush, xPos, yPos); yPos -= increment; lightCounter++; } } } // This method determines if the marquee light at lightIndex // should be lit. The currentOffset field specifies where // the "first" light is located, and the "position" of the // light given by lightIndex is computed relative to this // offset. If this position modulo lightPeriodValue is zero, // the light is considered to be on, and it will be painted // with the control's lightBrush. protected virtual bool IsLit(int lightIndex) { int directionFactor = (this.spinDirectionValue == MarqueeSpinDirection.CW ? -1 : 1); return ( (lightIndex + directionFactor * this.currentOffset) % this.lightPeriodValue == 0 ); } protected virtual void DrawLight( Graphics g, Brush brush, int xPos, int yPos) { switch (this.lightShapeValue) { case MarqueeLightShape.Square: { g.FillRectangle(brush, xPos, yPos, this.lightSizeValue, this.lightSizeValue); break; } case

Visual C# Consolidado

1066

MarqueeLightShape.Circle: { g.FillEllipse(brush, xPos, yPos, this.lightSizeValue, this.lightSizeValue); break; } default: { Trace.Assert(false, "Unknown value for light shape."); break; } } } // This method is called in the worker thread's context, // so it must not make any calls into the MarqueeBorder // control. Instead, it communicates to the control using // the ProgressChanged event. // // The only work done in this event handler is // to sleep for the number of milliseconds specified // by UpdatePeriod, then raise the ProgressChanged event. private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; // This event handler will run until the client cancels // the background task by calling CancelAsync. while (!worker.CancellationPending) { // The Argument property of the DoWorkEventArgs // object holds the value of UpdatePeriod, which // was passed as the argument to the RunWorkerAsync // method. Thread.Sleep((int)e.Argument); // The DoWork eventhandler does not actually report // progress; the ReportProgress event is used to // periodically alert the control to update its state. worker.ReportProgress(0); } } // The ProgressChanged event is raised by the DoWork method. // This event handler does work that is internal to the // control. In this case, the currentOffset is incremented, // and the control is told to repaint itself. private void backgroundWorker1_ProgressChanged( object sender, System.ComponentModel.ProgressChangedEventArgs e) { this.currentOffset++; this.Refresh(); } // This class demonstrates the use of a custom UITypeEditor. // It allows the MarqueeBorder control's LightShape property // to be changed at design time using a customized UI element // that is invoked by the Properties window. The UI is provided // by the LightShapeSelectionControl class. internal class LightShapeEditor : UITypeEditor { private IWindowsFormsEditorService editorService = null; public override UITypeEditorEditStyle GetEditStyle( System.ComponentModel.ITypeDescriptorContext context) { return UITypeEditorEditStyle.DropDown; } public override object EditValue( ITypeDescriptorContext context, IServiceProvider provider, object value) { if (provider != null) { editorService = provider.GetService( typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService; } if (editorService != null) { LightShapeSelectionControl selectionControl = new LightShapeSelectionControl( (MarqueeLightShape)value, editorService); editorService.DropDownControl(selectionControl); value = selectionControl.LightShape; } return value; } // This method indicates to the design environment that // the type editor will paint additional content in the // LightShape entry in the PropertyGrid. public override bool GetPaintValueSupported( ITypeDescriptorContext context) { return true; } // This method paints a graphical representation of the // selected value of the LightShpae property. public override void PaintValue(PaintValueEventArgs e) { MarqueeLightShape shape = (MarqueeLightShape)e.Value; using (Pen p = Pens.Black) { if (shape == MarqueeLightShape.Square) { e.Graphics.DrawRectangle(p, e.Bounds); } else { e.Graphics.DrawEllipse(p, e.Bounds); } } } } private void InitializeComponent() { this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker(); // // backgroundWorker1 // this.backgroundWorker1.WorkerReportsProgress = true; this.backgroundWorker1.WorkerSupportsCancellation = true; this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged); this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork); } #endregion } }

C#
using System; using System.ComponentModel; using System.ComponentModel.Design; using System.Diagnostics; using System.Drawing; using System.Threading; using System.Windows.Forms; using System.Windows.Forms.Design; namespace MarqueeControlLibrary { [ToolboxItemFilter("MarqueeControlLibrary.MarqueeText", ToolboxItemFilterType.Require)] public class MarqueeText : Label, IMarqueeWidget { // When isLit is true, the text is painted in the light color; // When

Visual C# Consolidado

1067

isLit is false, the text is painted in the dark color. // This value changes whenever the BackgroundWorker component // raises the ProgressChanged event. private bool isLit = true; // These fields back the public properties. private int updatePeriodValue = 50; private Color lightColorValue; private Color darkColorValue; // These brushes are used to paint the light and dark // colors of the text. private Brush lightBrush; private Brush darkBrush; // This component updates the control asynchronously. private BackgroundWorker backgroundWorker1; public MarqueeText() { // This call is required by the Windows.Forms Form Designer. InitializeComponent(); // Initialize light and dark colors // to the control's default values. this.lightColorValue = this.ForeColor; this.darkColorValue = this.BackColor; this.lightBrush = new SolidBrush(this.lightColorValue); this.darkBrush = new SolidBrush(this.darkColorValue); } /////////////////////////////////////////////////////////////////////// #region IMarqueeWidget implementation public virtual void StartMarquee() { // Start the updating thread and pass it the UpdatePeriod. this.backgroundWorker1.RunWorkerAsync(this.UpdatePeriod); } public virtual void StopMarquee() { // Stop the updating thread. this.backgroundWorker1.CancelAsync(); } [Category("Marquee")] [Browsable(true)] public int UpdatePeriod { get { return this.updatePeriodValue; } set { if (value > 0) { this.updatePeriodValue = value; } else { throw new ArgumentOutOfRangeException("UpdatePeriod", "must be > 0"); } } } #endregion /////////////////////////////////////////////////////////////////////// #region Public Properties [Category("Marquee")] [Browsable(true)] public Color LightColor { get { return this.lightColorValue; } set { // The LightColor property is only changed if the // client provides a different value. Comparing values // from the ToArgb method is the recommended test for // equality between Color structs. if (this.lightColorValue.ToArgb() != value.ToArgb()) { this.lightColorValue = value; this.lightBrush = new SolidBrush(value); } } } [Category("Marquee")] [Browsable(true)] public Color DarkColor { get { return this.darkColorValue; } set { // The DarkColor property is only changed if the // client provides a different value. Comparing values // from the ToArgb method is the recommended test for // equality between Color structs. if (this.darkColorValue.ToArgb() != value.ToArgb()) { this.darkColorValue = value; this.darkBrush = new SolidBrush(value); } } } #endregion /////////////////////////////////////////////////////////////////////// #region Implementation protected override void OnPaint(PaintEventArgs e) { // The text is painted in the light or dark color, // depending on the current value of isLit. this.ForeColor = this.isLit ? this.lightColorValue : this.darkColorValue; base.OnPaint(e); } // This method is called in the worker thread's context, // so it must not make any calls into the MarqueeText control. // Instead, it communicates to the control using the // ProgressChanged event. // // The only work done in this event handler is // to sleep for the number of milliseconds specified // by UpdatePeriod, then raise the ProgressChanged event. private void backgroundWorker1_DoWork( object sender, System.ComponentModel.DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; // This event handler will run until the client cancels // the background task by calling CancelAsync. while (!worker.CancellationPending) { // The Argument property of the DoWorkEventArgs // object holds the value of UpdatePeriod, which // was passed as the argument to the RunWorkerAsync // method. Thread.Sleep((int)e.Argument); // The DoWork eventhandler does not actually report // progress; the ReportProgress event is used to // periodically alert the control to update its state. worker.ReportProgress(0); } } // The ProgressChanged event is raised by the DoWork method. // This event handler does work that is internal to the // control. In this case, the text is toggled between its // light and dark state, and the control is told to // repaint itself. private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) { this.isLit = !this.isLit; this.Refresh(); } private void InitializeComponent() { this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker(); // // backgroundWorker1 //

Visual C# Consolidado

1068

this.backgroundWorker1.WorkerReportsProgress = true; this.backgroundWorker1.WorkerSupportsCancellation = true; this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged); this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork); } #endregion } }

C#
using System; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing; using System.Windows.Forms; using System.Windows.Forms.Design; namespace MarqueeControlLibrary { [Designer( typeof( MarqueeControlLibrary.Design.MarqueeControlRootDesigner ), typeof( IRootDesigner ) )] public class MarqueeControl : UserControl { // Required designer variable. private System.ComponentModel.Container components = null; public MarqueeControl() { // This call is required by the Windows.Forms Form Designer. InitializeComponent(); // Minimize flickering during animation by enabling // double buffering. SetStyle(ControlStyles.OptimizedDoubleBuffer, true); } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if(components != null) { components.Dispose(); } } base.Dispose( disposing ); } public void Start() { // The MarqueeControl may contain any number of // controls that implement IMarqueeWidget, so // find each IMarqueeWidget child and call its // StartMarquee method. foreach( Control cntrl in this.Controls ) { if( cntrl is IMarqueeWidget ) { IMarqueeWidget widget = cntrl as IMarqueeWidget; widget.StartMarquee(); } } } public void Stop() { // The MarqueeControl may contain any number of // controls that implement IMarqueeWidget, so find // each IMarqueeWidget child and call its StopMarquee // method. foreach( Control cntrl in this.Controls ) { if( cntrl is IMarqueeWidget ) { IMarqueeWidget widget = cntrl as IMarqueeWidget; widget.StopMarquee(); } } } protected override void OnLayout(LayoutEventArgs levent) { base.OnLayout (levent); // Repaint all IMarqueeWidget children if the layout // has changed. foreach( Control cntrl in this.Controls ) { if( cntrl is IMarqueeWidget ) { Control control = cntrl as Control; control.PerformLayout(); } } } #region Component Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { components = new System.ComponentModel.Container(); } #endregion } }

C#
using System; using System.Collections; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; using System.Windows.Forms.Design; namespace MarqueeControlLibrary { // This control provides the custom UI for the LightShape property // of the MarqueeBorder. It is used by the LightShapeEditor. public class LightShapeSelectionControl : System.Windows.Forms.UserControl { private MarqueeLightShape lightShapeValue = MarqueeLightShape.Square; private IWindowsFormsEditorService editorService = null; private System.Windows.Forms.Panel squarePanel; private System.Windows.Forms.Panel circlePanel; // Required designer variable. private System.ComponentModel.Container components = null; // This constructor takes a MarqueeLightShape value from the // design-time environment, which will be used to display // the initial state. public LightShapeSelectionControl( MarqueeLightShape lightShape, IWindowsFormsEditorService editorService ) { // This call is required by the designer. InitializeComponent(); // Cache the light shape value provided by the // design-time environment. this.lightShapeValue = lightShape; // Cache the reference to the editor service. this.editorService = editorService; // Handle the Click event for the two panels. this.squarePanel.Click += new EventHandler(squarePanel_Click); this.circlePanel.Click += new

Visual C# Consolidado

1069

EventHandler(circlePanel_Click); } protected override void Dispose( bool disposing ) { if( disposing ) { // Be sure to unhook event handlers // to prevent "lapsed listener" leaks. this.squarePanel.Click -= new EventHandler(squarePanel_Click); this.circlePanel.Click -= new EventHandler(circlePanel_Click); if(components != null) { components.Dispose(); } } base.Dispose( disposing ); } // LightShape is the property for which this control provides // a custom user interface in the Properties window. public MarqueeLightShape LightShape { get { return this.lightShapeValue; } set { if( this.lightShapeValue != value ) { this.lightShapeValue = value; } } } protected override void OnPaint(PaintEventArgs e) { base.OnPaint (e); using( Graphics gSquare = this.squarePanel.CreateGraphics(), gCircle = this.circlePanel.CreateGraphics() ) { // Draw a filled square in the client area of // the squarePanel control. gSquare.FillRectangle( Brushes.Red, 0, 0, this.squarePanel.Width, this.squarePanel.Height ); // If the Square option has been selected, draw a // border inside the squarePanel. if( this.lightShapeValue == MarqueeLightShape.Square ) { gSquare.DrawRectangle( Pens.Black, 0, 0, this.squarePanel.Width-1, this.squarePanel.Height-1); } // Draw a filled circle in the client area of // the circlePanel control. gCircle.Clear( this.circlePanel.BackColor ); gCircle.FillEllipse( Brushes.Blue, 0, 0, this.circlePanel.Width, this.circlePanel.Height ); // If the Circle option has been selected, draw a // border inside the circlePanel. if( this.lightShapeValue == MarqueeLightShape.Circle ) { gCircle.DrawRectangle( Pens.Black, 0, 0, this.circlePanel.Width-1, this.circlePanel.Height-1); } } } private void squarePanel_Click(object sender, EventArgs e) { this.lightShapeValue = MarqueeLightShape.Square; this.Invalidate( false ); this.editorService.CloseDropDown(); } private void circlePanel_Click(object sender, EventArgs e) { this.lightShapeValue = MarqueeLightShape.Circle; this.Invalidate( false ); this.editorService.CloseDropDown(); } #region Component Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.squarePanel = new System.Windows.Forms.Panel(); this.circlePanel = new System.Windows.Forms.Panel(); this.SuspendLayout(); // // squarePanel // this.squarePanel.Location = new System.Drawing.Point(8, 10); this.squarePanel.Name = "squarePanel"; this.squarePanel.Size = new System.Drawing.Size(60, 60); this.squarePanel.TabIndex = 2; // // circlePanel // this.circlePanel.Location = new System.Drawing.Point(80, 10); this.circlePanel.Name = "circlePanel"; this.circlePanel.Size = new System.Drawing.Size(60, 60); this.circlePanel.TabIndex = 3; // // LightShapeSelectionControl // this.Controls.Add(this.squarePanel); this.Controls.Add(this.circlePanel); this.Name = "LightShapeSelectionControl"; this.Size = new System.Drawing.Size(150, 80); this.ResumeLayout(false); } #endregion } }

C#
using System; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Diagnostics; using System.Windows.Forms; using System.Windows.Forms.Design; namespace MarqueeControlLibrary.Design { [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] public class MarqueeBorderDesigner : ParentControlDesigner { public MarqueeBorderDesigner() { Trace.WriteLine("MarqueeBorderDesigner"); } public bool Visible { get { return (bool)ShadowProperties["Visible"]; } set { this.ShadowProperties["Visible"] = value; } } public bool Enabled { get { return (bool)ShadowProperties["Enabled"]; } set { this.ShadowProperties["Enabled"] = value; } } protected override void PreFilterProperties(IDictionary properties) { base.PreFilterProperties(properties); if (properties.Contains("Padding")) { properties.Remove("Padding"); } properties["Visible"] = TypeDescriptor.CreateProperty( typeof(MarqueeBorderDesigner), (PropertyDescriptor)properties["Visible"], new Attribute[0]); properties["Enabled"] = TypeDescriptor.CreateProperty(

Visual C# Consolidado

1070

typeof(MarqueeBorderDesigner), (PropertyDescriptor)properties["Enabled"], new Attribute[0]); } private void OnVerbRunTest(object sender, EventArgs e) { IMarqueeWidget widget = this.Control as IMarqueeWidget; widget.StartMarquee(); } private void OnVerbStopTest(object sender, EventArgs e) { IMarqueeWidget widget = this.Control as IMarqueeWidget; widget.StopMarquee(); } } }

C#
using System; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Diagnostics; using System.Drawing.Design; using System.Windows.Forms; using System.Windows.Forms.Design; namespace MarqueeControlLibrary.Design { [ToolboxItemFilter("MarqueeControlLibrary.MarqueeBorder", ToolboxItemFilterType.Require)] [ToolboxItemFilter("MarqueeControlLibrary.MarqueeText", ToolboxItemFilterType.Require)] [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] public class MarqueeControlRootDesigner : DocumentDesigner { public MarqueeControlRootDesigner() { Trace.WriteLine("MarqueeControlRootDesigner ctor"); } public override void Initialize(IComponent component) { base.Initialize(component); IComponentChangeService cs = GetService(typeof(IComponentChangeService)) as IComponentChangeService; if (cs != null) { cs.ComponentChanged += new ComponentChangedEventHandler(OnComponentChanged); } this.Verbs.Add( new DesignerVerb("Run Test", new EventHandler(OnVerbRunTest)) ); this.Verbs.Add( new DesignerVerb("Stop Test", new EventHandler(OnVerbStopTest)) ); } private void OnComponentChanged( object sender, ComponentChangedEventArgs e) { if (e.Component is IMarqueeWidget) { this.Control.Refresh(); } } private void OnVerbRunTest(object sender, EventArgs e) { MarqueeControl c = this.Control as MarqueeControl; c.Start(); } private void OnVerbStopTest(object sender, EventArgs e) { MarqueeControl c = this.Control as MarqueeControl; c.Stop(); } } }

Compilando o cdigo

COMO: Anexar marcas inteligentes para um componente de formulrios do Windows


Este exemplo mostra como adicionar suporte a marcas inteligentes para componentes e controles personalizados. Para obter uma explicao sobre neste exemplo, de cdigo completa Consulte Passo-a-passo: Adicionando Marcas Inteligentes a um Componente do Windows Forms. Exemplo C#
///////////////////////////////////////////////////////////////////// // Pull model smart tag example. // Need references to System.dll, System.Windows.Forms.dll, // System.Design.dll, and System.Drawing.dll. ///////////////////////////////////////////////////////////////////// using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Windows.Forms; using System.Text; using System.Reflection; namespace SmartTags { public class Form1 : System.Windows.Forms.Form { private ColorLabel colorLabel2; public Form1() { InitializeComponent(); } // VS Forms Designer generated method private void InitializeComponent() { this.colorLabel2 = new SmartTags.ColorLabel(); this.SuspendLayout(); // // colorLabel2 // this.colorLabel2.BackColor = System.Drawing.Color.Gold; this.colorLabel2.ColorLocked = false; this.colorLabel2.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.colorLabel2.Location = new

Visual C# Consolidado

1071

System.Drawing.Point(41, 42); this.colorLabel2.Name = "colorLabel2"; this.colorLabel2.Size = new System.Drawing.Size(117, 25); this.colorLabel2.TabIndex = 0; this.colorLabel2.Text = "colorLabel2"; // // Form1 // this.ClientSize = new System.Drawing.Size(292, 273); this.Controls.Add(this.colorLabel2); this.Name = "Form1"; this.ResumeLayout(false); } [STAThread] static void Main() { Form1 f1 = new Form1(); f1.ShowDialog(); } } ///////////////////////////////////////////////////////////////// // ColorLabel is a simple extension of the standard Label control, // with color property locking added. ///////////////////////////////////////////////////////////////// [Designer(typeof(ColorLabelDesigner))] public class ColorLabel : System.Windows.Forms.Label { private bool colorLockedValue = false; public bool ColorLocked { get { return colorLockedValue; } set { colorLockedValue = value; } } public override Color BackColor { get { return base.BackColor; } set { if (ColorLocked) return; else base.BackColor = value; } } public override Color ForeColor { get { return base.ForeColor; } set { if (ColorLocked) return; else base.ForeColor = value; } } } ///////////////////////////////////////////////////////////////// // Designer for the ColorLabel control with support for a smart // tag panel. // Must add reference to System.Design.dll ///////////////////////////////////////////////////////////////// [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] public class ColorLabelDesigner : System.Windows.Forms.Design.ControlDesigner { private DesignerActionListCollection actionLists; // Use pull model to populate smart tag menu. public override DesignerActionListCollection ActionLists { get { if (null == actionLists) { actionLists = new DesignerActionListCollection(); actionLists.Add( new ColorLabelActionList(this.Component)); } return actionLists; } } } ///////////////////////////////////////////////////////////////// // DesignerActionListderived class defines smart tag entries and // resultant actions. ///////////////////////////////////////////////////////////////// public class ColorLabelActionList : System.ComponentModel.Design.DesignerActionList { private ColorLabel colLabel; private DesignerActionUIService designerActionUISvc = null; //The constructor associates the control //with the smart tag list. public ColorLabelActionList( IComponent component ) : base(component) { this.colLabel = component as ColorLabel; // Cache a reference to DesignerActionUIService, so the // DesigneractionList can be refreshed. this.designerActionUISvc = GetService(typeof(DesignerActionUIService)) as DesignerActionUIService; } // Helper method to retrieve control properties. Use of // GetProperties enables undo and menu updates to work properly. private PropertyDescriptor GetPropertyByName(String propName) { PropertyDescriptor prop; prop = TypeDescriptor.GetProperties(colLabel)[propName]; if (null == prop) throw new ArgumentException( "Matching ColorLabel property not found!", propName); else return prop; } // Properties that are targets of DesignerActionPropertyItem entries. public Color BackColor { get { return colLabel.BackColor; } set { GetPropertyByName("BackColor").SetValue(colLabel, value); } } public Color ForeColor { get { return colLabel.ForeColor; } set { GetPropertyByName("ForeColor").SetValue(colLabel, value); } } // Boolean properties are automatically displayed with binary // UI (such as a checkbox). public bool LockColors { get { return colLabel.ColorLocked; } set { GetPropertyByName("ColorLocked").SetValue(colLabel, value); // Refresh the list. this.designerActionUISvc.Refresh(this.Component); } } public String Text { get { return colLabel.Text; } set { GetPropertyByName("Text").SetValue(colLabel, value); } } // Method that is target of a DesignerActionMethodItem public void InvertColors() { Color currentBackColor = colLabel.BackColor; BackColor = Color.FromArgb( 255 - currentBackColor.R, 255 - currentBackColor.G, 255 currentBackColor.B); Color currentForeColor = colLabel.ForeColor; ForeColor = Color.FromArgb( 255 currentForeColor.R, 255 - currentForeColor.G, 255 - currentForeColor.B); } // Implementation of this abstract method creates smart tag // items, associates their targets, and collects into list. public override DesignerActionItemCollection GetSortedActionItems() { DesignerActionItemCollection items = new

Visual C# Consolidado

1072

DesignerActionItemCollection(); //Define static section header entries. items.Add(new DesignerActionHeaderItem("Appearance")); items.Add(new DesignerActionHeaderItem("Information")); //Boolean property for locking color selections. items.Add(new DesignerActionPropertyItem("LockColors", "Lock Colors", "Appearance", "Locks the color properties.")); if (!LockColors) { items.Add(new DesignerActionPropertyItem("BackColor", "Back Color", "Appearance", "Selects the background color.")); items.Add(new DesignerActionPropertyItem("ForeColor", "Fore Color", "Appearance", "Selects the foreground color.")); //This next method item is also added to the context menu // (as a designer verb). items.Add(new DesignerActionMethodItem(this, "InvertColors", "Invert Colors", "Appearance", "Inverts the fore and background colors.", true)); } items.Add(new DesignerActionPropertyItem("Text", "Text String", "Appearance", "Sets the display text.")); //Create entries for static Information section. StringBuilder location = new StringBuilder("Location: "); location.Append(colLabel.Location); StringBuilder size = new StringBuilder("Size: "); size.Append(colLabel.Size); items.Add(new DesignerActionTextItem(location.ToString(), "Information")); items.Add(new DesignerActionTextItem(size.ToString(), "Information")); return items; } } }

Compilar o cdigo Sempre que fizer alteraes aos aspectos em tempo de criao de um componente, voc precisar recriar o projeto de controle. Alm disso, se no houver outro projeto Windows Forms que aberto e usa esse componente, ento voc provavelmente precisar atualizar o projeto para ver as alteraes. Normalmente, voc precisar fechar e reabrir a janela de design que contm o componente.

COMO: Ajustar atributos, eventos e propriedades de um componente no modo Design


Voc pode usar o designer personalizado para modificar o atributos, eventos, e propriedades de seu componente no modo Design. Exemplo O exemplo de cdigo a seguir demonstra como criar um designer personalizado que ajusta um componente na atributos, eventos, e propriedades. Uma classe chamada DemoControlDesigner Designer est conectado a uma DemoControl classe e executa as seguintes operaes:

Adiciona uma propriedade para a DemoControl classe. Remove uma propriedade de classe DemoControl. As sombras uma propriedade de classe DemoControl. Atributos alteraes de uma DemoControl propriedade de classe Cria um componente na superfcie do design e anexa um manipulador de eventos.

C#
using System; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Diagnostics; using System.Drawing; using System.Drawing.Design; using System.Data; using System.Reflection; using System.Runtime.Serialization; using System.Text; using System.Windows.Forms; using System.Windows.Forms.Design; using System.Windows.Forms.Design.Behavior; public class Form1 : Form { private DemoControl demoControl1; private System.ComponentModel.IContainer components = null; public Form1() { InitializeComponent(); } protected override void Dispose(bool disposing) { if (disposing && (components != null)) {

Visual C# Consolidado

1073

components.Dispose(); } base.Dispose(disposing); } [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new Form1()); } #region Windows Form Designer generated code private void InitializeComponent() { this.demoControl1 = new DemoControl(); this.SuspendLayout(); // // demoControl1 // this.demoControl1.AutoSize = true; this.demoControl1.BackColor = System.Drawing.Color.Chartreuse; this.demoControl1.Location = new System.Drawing.Point(0, 0); this.demoControl1.Name = "demoControl1"; this.demoControl1.Size = new System.Drawing.Size(232, 14); this.demoControl1.TabIndex = 0; this.demoControl1.Text = "This text was set by CreateComponentsCore."; // // Form1 // this.ClientSize = new System.Drawing.Size(492, 482); this.Controls.Add(this.demoControl1); this.Name = "Form1"; this.Text = "r"; this.ResumeLayout(false); this.PerformLayout(); } #endregion } // This control is derived from UserControl, with only a little // added logic for the Toolbox interaction. // // All of the custom designer code is implemented in the // DemoControlDesigner class. [DesignerAttribute(typeof(DemoControlDesigner))] [ToolboxItem(typeof(DemoToolboxItem))] public class DemoControl : Label { private System.ComponentModel.IContainer components = null; public DemoControl() { InitializeComponent(); MessageBox.Show("DemoControl", "Constructor"); } protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } private void InitializeComponent() { // // DemoControl // this.Name = "DemoControl"; } // Toolbox items must be serializable. [Serializable] [System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Inheritan ceDemand, Name="FullTrust")] [System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDem and, Name="FullTrust")] class DemoToolboxItem : ToolboxItem { // The add components dialog in VS looks for a public // ctor that takes a type. public DemoToolboxItem(Type toolType) : base(toolType) { } // And you must provide this special constructor for serialization. // If you add additional data to MyToolboxItem that you // want to serialize, you may override Deserialize and // Serialize methods to add that data. DemoToolboxItem(SerializationInfo info, StreamingContext context) { Deserialize(info, context); } // This implementation sets the new control's Text and // AutoSize properties. protected override IComponent[] CreateComponentsCore( IDesignerHost host, IDictionary defaultValues) { IComponent[] comps = base.CreateComponentsCore(host, defaultValues); // The returned IComponent array contains a single // component, which is an instance of DemoControl. ((DemoControl)comps[0]).Text = "This text was set by CreateComponentsCore."; ((DemoControl)comps[0]).AutoSize = true; return comps; } } } // This class demonstrates a designer that attaches to various // services and changes the properties exposed by the control // being designed. [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] public class DemoControlDesigner : ControlDesigner { // This member backs the Locked property. private bool lockedValue = false; // This is the collection of DesignerActionLists that // defines the smart tags offered on the control. private DesignerActionListCollection actionLists = null; // This Timer is created when you select the Create Timer // smart tag item. private Timer createdTimer = null; // These are the services which DemoControlDesigner will use. private DesignerActionService actionService = null; private DesignerActionUIService actionUiService = null; private IComponentChangeService changeService = null; private IDesignerEventService eventService = null; private IDesignerHost host = null; private IDesignerOptionService optionService = null; private IEventBindingService eventBindingService = null; private IExtenderListService listService = null; private IReferenceService referenceService = null; private ISelectionService selectionService = null; private ITypeResolutionService typeResService = null; private IComponentDiscoveryService componentDiscoveryService = null; private IToolboxService toolboxService = null; private UndoEngine undoEng = null; public DemoControlDesigner() {

Visual C# Consolidado

1074

MessageBox.Show("DemoControlDesigner", "Constructor"); } // The Dispose method override is implemented so event handlers // can be removed. This prevents objects from lingering in // memory beyond the desired lifespan. protected override void Dispose(bool disposing) { if (disposing) { if (this.changeService != null) { // Unhook event handlers. this.changeService.ComponentChanged -= new ComponentChangedEventHandler( ChangeService_ComponentChanged); this.changeService.ComponentAdded -= new ComponentEventHandler( ChangeService_ComponentAdded); this.changeService.ComponentRemoved -= new ComponentEventHandler( changeService_ComponentRemoved); } if (this.eventService != null) { this.eventService.ActiveDesignerChanged -= new ActiveDesignerEventHandler( eventService_ActiveDesignerChanged); } if (this.selectionService != null) { this.selectionService.SelectionChanged -= new EventHandler( selectionService_SelectionChanged); } } base.Dispose(disposing); } // This method initializes the designer. public override void Initialize(IComponent component) { base.Initialize(component); // Connect to various designer services. InitializeServices(); // Set up the BackColor value that will be serialized. // This is the shadowed property on the designer. this.BackColor = Color.Chartreuse; // Set up the BackColor value that will be displayed. this.Control.BackColor = Color.AliceBlue; } // This method creates the DesignerActionList on demand, causing // smart tags to appear on the control being designed. public override DesignerActionListCollection ActionLists { get { if (null == actionLists) { actionLists = new DesignerActionListCollection(); actionLists.Add( new DemoActionList(this.Component)); } return actionLists; } } // This utility method connects the designer to various // services it will use. private void InitializeServices() { // Acquire a reference to DesignerActionService. this.actionService = GetService(typeof(DesignerActionService)) as DesignerActionService; // Acquire a reference to DesignerActionUIService. this.actionUiService = GetService(typeof(DesignerActionUIService)) as DesignerActionUIService; // Acquire a reference to IComponentChangeService. this.changeService = GetService(typeof(IComponentChangeService)) as IComponentChangeService; // Hook the IComponentChangeService events. if (this.changeService != null) { this.changeService.ComponentChanged += new ComponentChangedEventHandler( ChangeService_ComponentChanged); this.changeService.ComponentAdded += new ComponentEventHandler( ChangeService_ComponentAdded); this.changeService.ComponentRemoved += new ComponentEventHandler( changeService_ComponentRemoved); } // Acquire a reference to ISelectionService. this.selectionService = GetService(typeof(ISelectionService)) as ISelectionService; // Hook the SelectionChanged event. if (this.selectionService != null) { this.selectionService.SelectionChanged += new EventHandler(selectionService_SelectionChanged); } // Acquire a reference to IDesignerEventService. this.eventService = GetService(typeof(IDesignerEventService)) as IDesignerEventService; if (this.eventService != null) { this.eventService.ActiveDesignerChanged += new ActiveDesignerEventHandler( eventService_ActiveDesignerChanged); } // Acquire a reference to IDesignerHost. this.host = GetService(typeof(IDesignerHost)) as IDesignerHost; // Acquire a reference to IDesignerOptionService. this.optionService = GetService(typeof(IDesignerOptionService)) as IDesignerOptionService; // Acquire a reference to IEventBindingService. this.eventBindingService = GetService(typeof(IEventBindingService)) as IEventBindingService; // Acquire a reference to IExtenderListService. this.listService = GetService(typeof(IExtenderListService)) as IExtenderListService; // Acquire a reference to IReferenceService. this.referenceService = GetService(typeof(IReferenceService)) as IReferenceService; // Acquire a reference to ITypeResolutionService. this.typeResService = GetService(typeof(ITypeResolutionService)) as ITypeResolutionService; // Acquire a reference to IComponentDiscoveryService. this.componentDiscoveryService = GetService(typeof(IComponentDiscoveryService)) as IComponentDiscoveryService; // Acquire a reference to IToolboxService. this.toolboxService = GetService(typeof(IToolboxService)) as IToolboxService; // Acquire a

Visual C# Consolidado

1075

reference to UndoEngine. this.undoEng = GetService(typeof(UndoEngine)) as UndoEngine; if (this.undoEng != null) { MessageBox.Show("UndoEngine"); } } // This is the shadowed property on the designer. // This value will be serialized instead of the // value of the control's property. public Color BackColor { get { return (Color)ShadowProperties["BackColor"]; } set { if (this.changeService != null) { PropertyDescriptor backColorDesc = TypeDescriptor.GetProperties(this.Control)["BackColor"]; this.changeService.OnComponentChanging( this.Control, backColorDesc); this.ShadowProperties["BackColor"] = value; this.changeService.OnComponentChanged( this.Control, backColorDesc, null, null); } } } // This is the property added by the designer in the // PreFilterProperties method. private bool Locked { get { return lockedValue; } set { lockedValue = value; } } // The PreFilterProperties method is where you can add or remove // properties from the component being designed. // // In this implementation, the Visible property is removed, // the BackColor property is shadowed by the designer, and // the a new property, called Locked, is added. protected override void PreFilterProperties(IDictionary properties) { // Always call the base PreFilterProperties implementation // before you modify the properties collection. base.PreFilterProperties(properties); // Remove the visible property. properties.Remove("Visible"); // Shadow the BackColor property. PropertyDescriptor propertyDesc = TypeDescriptor.CreateProperty( typeof(DemoControlDesigner), (PropertyDescriptor)properties["BackColor"], new Attribute[0]); properties["BackColor"] = propertyDesc; // Create the Locked property. properties["Locked"] = TypeDescriptor.CreateProperty( typeof(DemoControlDesigner), "Locked", typeof(bool), CategoryAttribute.Design, DesignOnlyAttribute.Yes); } // The PostFilterProperties method is where you modify existing // properties. You must only use this method to modify existing // items. Do not add or remove items here. Also, be sure to // call base.PostFilterProperties(properties) after your filtering // logic. // // In this implementation, the Enabled property is hidden from // any PropertyGrid or Properties window. This is done by // creating a copy of the existing PropertyDescriptor and // attaching two new Attributes: Browsable and EditorBrowsable. protected override void PostFilterProperties(IDictionary properties) { PropertyDescriptor pd = properties["Enabled"] as PropertyDescriptor; pd = TypeDescriptor.CreateProperty( pd.ComponentType, pd, new Attribute[2] { new BrowsableAttribute(false), new EditorBrowsableAttribute(EditorBrowsableState.Never)}); properties[pd.Name] = pd; // Always call the base PostFilterProperties implementation // after you modify the properties collection. base.PostFilterProperties(properties); } #region Event Handlers void eventService_ActiveDesignerChanged( object sender, ActiveDesignerEventArgs e) { if (e.NewDesigner != null) { MessageBox.Show( e.NewDesigner.ToString(), "ActiveDesignerChanged"); } } void ChangeService_ComponentChanged( object sender, ComponentChangedEventArgs e) { string msg = String.Format( "{0}, {1}", e.Component, e.Member); MessageBox.Show(msg, "ComponentChanged"); } void ChangeService_ComponentAdded( object sender, ComponentEventArgs e) { MessageBox.Show( e.Component.ToString(), "ComponentAdded"); } void changeService_ComponentRemoved( object sender, ComponentEventArgs e) { MessageBox.Show( e.Component.ToString(), "ComponentRemoved"); } void selectionService_SelectionChanged( object sender, EventArgs e) { if (this.selectionService != null) { if (this.selectionService.PrimarySelection == this.Control) { MessageBox.Show( this.Control.ToString(), "SelectionChanged"); } } } #endregion // This class defines the smart tags that appear on the control // that is being designed. internal class DemoActionList : System.ComponentModel.Design.DesignerActionList { // Cache a reference to the designer host. private IDesignerHost host = null; // Cache a reference to the control. private DemoControl relatedControl = null; // Cache a reference to the designer. private DemoControlDesigner relatedDesigner = null; //The constructor associates the control //with the smart tag list. public DemoActionList(IComponent component) : base(component) { this.relatedControl = component as DemoControl; this.host = this.Component.Site.GetService(typeof(IDesignerHost)) as IDesignerHost; IDesigner dcd = host.GetDesigner(this.Component); this.relatedDesigner = dcd as DemoControlDesigner; }

Visual C# Consolidado

1076

// This method creates and populates the // DesignerActionItemCollection which is used to // display smart tag items. public override DesignerActionItemCollection GetSortedActionItems() { DesignerActionItemCollection items = new DesignerActionItemCollection(); // If the Timer component has not been created, show the // "Create Timer" DesignerAction item. // // If the Timer component exists, show the timer-related // options. if (this.relatedDesigner.createdTimer == null) { items.Add(new DesignerActionMethodItem( this, "CreateTimer", "Create Timer", true)); } else { items.Add(new DesignerActionMethodItem( this, "ShowEventHandlerCode", "Show Event Handler Code", true)); items.Add(new DesignerActionMethodItem( this, "RemoveTimer", "Remove Timer", true)); } items.Add(new DesignerActionMethodItem( this, "GetExtenderProviders", "Get Extender Providers", true)); items.Add(new DesignerActionMethodItem( this, "GetDemoControlReferences", "Get DemoControl References", true)); items.Add(new DesignerActionMethodItem( this, "GetPathOfAssembly", "Get Path of Executing Assembly", true)); items.Add(new DesignerActionMethodItem( this, "GetComponentTypes", "Get ScrollableControl Types", true)); items.Add(new DesignerActionMethodItem( this, "GetToolboxCategories", "Get Toolbox Categories", true)); items.Add(new DesignerActionMethodItem( this, "SetBackColor", "Set Back Color", true)); return items; } // This method creates a Timer component using the // IDesignerHost.CreateComponent method. It also // creates an event handler for the Timer component's // tick event. private void CreateTimer() { if (this.host != null) { if (this.relatedDesigner.createdTimer == null) { // Create and configure the Timer object. this.relatedDesigner.createdTimer = this.host.CreateComponent(typeof(Timer)) as Timer; Timer t = this.relatedDesigner.createdTimer; t.Interval = 1000; t.Enabled = true; EventDescriptorCollection eventColl = TypeDescriptor.GetEvents(t, new Attribute[0]); if (eventColl != null) { EventDescriptor ed = eventColl["Tick"] as EventDescriptor; if (ed != null) { PropertyDescriptor epd = this.relatedDesigner.eventBindingService.GetEventProperty(ed); epd.SetValue(t, "timer_Tick"); } } this.relatedDesigner.actionUiService.Refresh(this.relatedControl); } } } // This method uses the IEventBindingService.ShowCode // method to start the Code Editor. It places the caret // in the timer_tick method created by the CreateTimer method. private void ShowEventHandlerCode() { Timer t = this.relatedDesigner.createdTimer; if (t != null) { EventDescriptorCollection eventColl = TypeDescriptor.GetEvents(t, new Attribute[0]); if (eventColl != null) { EventDescriptor ed = eventColl["Tick"] as EventDescriptor; if (ed != null) { this.relatedDesigner.eventBindingService.ShowCode(t, ed); } } } } // This method uses the IDesignerHost.DestroyComponent method // to remove the Timer component from the design environment. private void RemoveTimer() { if (this.host != null) { if (this.relatedDesigner.createdTimer != null) { this.host.DestroyComponent( this.relatedDesigner.createdTimer); this.relatedDesigner.createdTimer = null; this.relatedDesigner.actionUiService.Refresh( this.relatedControl); } } } // This method uses IExtenderListService.GetExtenderProviders // to enumerate all the extender providers and display them // in a MessageBox. private void GetExtenderProviders() { if (this.relatedDesigner.listService != null) { StringBuilder sb = new StringBuilder(); IExtenderProvider[] providers = this.relatedDesigner.listService.GetExtenderProviders(); for (int i = 0; i < providers.Length; i++) { sb.Append(providers[i].ToString()); sb.Append("\r\n"); } MessageBox.Show( sb.ToString(), "Extender Providers"); } } // This method uses the IReferenceService.GetReferences method // to enumerate all the instances of DemoControl on the // design surface. private void GetDemoControlReferences() { if (this.relatedDesigner.referenceService != null) { StringBuilder sb = new StringBuilder(); object[] refs = this.relatedDesigner.referenceService.GetReferences(typeof(DemoControl)); for (int i = 0; i < refs.Length; i++) { sb.Append(refs[i].ToString()); sb.Append("\r\n"); } MessageBox.Show( sb.ToString(), "DemoControl References"); } } // This method uses the ITypeResolutionService.GetPathOfAssembly // method to display the path of the executing assembly. private void GetPathOfAssembly() { if (this.relatedDesigner.typeResService != null) { System.Reflection.AssemblyName name =

Visual C# Consolidado

1077

System.Reflection.Assembly.GetExecutingAssembly().GetName(); MessageBox.Show( this.relatedDesigner.typeResService.GetPathOfAssembly(name), "Path of executing assembly"); } } // This method uses the IComponentDiscoveryService.GetComponentTypes // method to find all the types that derive from // ScrollableControl. private void GetComponentTypes() { if (this.relatedDesigner.componentDiscoveryService != null) { ICollection components = this.relatedDesigner.componentDiscoveryService.GetComponentTypes(host, typeof(ScrollableControl)); if (components != null) { if (components.Count > 0) { StringBuilder sb = new StringBuilder(); IEnumerator e = components.GetEnumerator(); while (e.MoveNext()) { sb.Append(e.Current.ToString()); sb.Append("\r\n"); } MessageBox.Show( sb.ToString(), "Controls derived from ScrollableControl"); } } } } // This method uses the IToolboxService.CategoryNames // method to enumerate all the categories that appear // in the Toolbox. private void GetToolboxCategories() { if (this.relatedDesigner.toolboxService != null) { StringBuilder sb = new StringBuilder(); CategoryNameCollection names = this.relatedDesigner.toolboxService.CategoryNames; foreach (string name in names) { sb.Append(name.ToString()); sb.Append("\r\n"); } MessageBox.Show(sb.ToString(), "Toolbox Categories"); } } // This method sets the shadowed BackColor property on the // designer. This is the value that is serialized by the // design environment. private void SetBackColor() { ColorDialog d = new ColorDialog(); if (d.ShowDialog() == DialogResult.OK) { this.relatedDesigner.BackColor = d.Color; } } } }

Para alterar os atributos, eventos e propriedades de seu componente no modo de design, substituindo os seguintes mtodos no seu designer:

PreFilterAttributes PostFilterAttributes PreFilterEvents PostFilterEvents PreFilterProperties PostFilterProperties

O exemplo de cdigo a seguir demonstra como substituir o PreFilterProperties e Mtodos PostFilterProperties para alterar as propriedades e atributos de classe DemoControl. C#
// The PreFilterProperties method is where you can add or remove // properties from the component being designed. // // In this implementation, the Visible property is removed, // the BackColor property is shadowed by the designer, and // the a new property, called Locked, is added. protected override void PreFilterProperties(IDictionary properties) { // Always call the base PreFilterProperties implementation // before you modify the properties collection. base.PreFilterProperties(properties); // Remove the visible property. properties.Remove("Visible"); // Shadow the BackColor property. PropertyDescriptor propertyDesc = TypeDescriptor.CreateProperty( typeof(DemoControlDesigner), (PropertyDescriptor)properties["BackColor"], new Attribute[0]); properties["BackColor"] = propertyDesc; // Create the Locked property. properties["Locked"] = TypeDescriptor.CreateProperty( typeof(DemoControlDesigner), "Locked", typeof(bool), CategoryAttribute.Design, DesignOnlyAttribute.Yes); }

C#

Visual C# Consolidado

1078

// The PostFilterProperties method is where you modify existing // properties. You must only use this method to modify existing // items. Do not add or remove items here. Also, be sure to // call base.PostFilterProperties(properties) after your filtering // logic. // // In this implementation, the Enabled property is hidden from // any PropertyGrid or Properties window. This is done by // creating a copy of the existing PropertyDescriptor and // attaching two new Attributes: Browsable and EditorBrowsable. protected override void PostFilterProperties(IDictionary properties) { PropertyDescriptor pd = properties["Enabled"] as PropertyDescriptor; pd = TypeDescriptor.CreateProperty( pd.ComponentType, pd, new Attribute[2] { new BrowsableAttribute(false), new EditorBrowsableAttribute(EditorBrowsableState.Never)}); properties[pd.Name] = pd; // Always call the base PostFilterProperties implementation // after you modify the properties collection. base.PostFilterProperties(properties); }

Compilando o cdigo Quando voc faz alteraes aos aspectos em tempo de criao de um componente, voc precisar recriar o projeto de controle. Alm disso, se no houver outro projeto Windows Forms que aberto e usa esse componente, voc provavelmente precisar atualizar o projeto para ver as alteraes. Normalmente, voc precisar fechar e reabrir a janela de design que contm o componente.

Visual C# Consolidado

1079

Programao do Office (Como Fazer em C#)


Esta pgina fornece referncia a ajuda sobre tarefas amplamente executadas de programao do Office. Para exibir outras categorias de tarefas populares abordados na Ajuda Como Fazer em C#.

Como: Atualizar solues das Ferramentas do Visual Studio para o Office


Aps a atualizao para Microsoft Visual Studio 2005 Tools for the Microsoft Office System, voc pode abrir e executar seus projetos existentes no Visual Studio e eles sero atualizados para funcionam da mesma forma que eles tinham ao usar Visual Studio Tools for Office, Verso 2003. No entanto, para concluir a atualizao para que voc pode tirar proveito do novo sistema do projeto e ferramentas, voc deve executar algumas etapas atualizao manualmente. Para obter mais informaes, consulte Atualizando Overview solues do Office. Para atualizar um Ferramentas do Visual Studio para soluo Office 12. Abra uma soluo existente no Visual Studio com Visual Studio 2005 Tools for Office instalado. O Visual Studio Conversion Wizard aparece. 13. Leia as informaes e avisos na primeira tela, e clique em Next. 14. Se voc desejar criar um backup de sua soluo, selecione Yes, create a backup before converting e especifique um local para os arquivos de backup. Se voc no faa desejar criar um backup, selecione No. 15. Clique em Next. 16. Clique em Finish se tudo na pgina de resumo est correto. Uma caixa de dilogo aparece com informaes sobre propriedades padro para depurao do projeto. 17. Clique Yes para atualizar para o novo projeto depurao propriedades padro. O projeto se voc clicar em No, no ser compilado at que voc faa alteraes manualmente. 18. Clique no link para o relatrio de converso para ver detalhes sobre o status de converso, ou ento clique em Close. A soluo abre com o novo sistema do projeto visvel no Solution Explorer, mais os arquivos da verso antiga da soluo. 19. Mover o cdigo do arquivo classe principal antigo para o novo ThisDocument, ThisWorkbook,. e Sheet Classes 20. Excluir o arquivo classe principal antigo aps remover todo o cdigo. 21. Atualizar qualquer referncia no qualificada para aplicativos com espao para nome System.Windows.Forms.Application totalmente qualificado. Para obter mais informaes, consulte " Atualizando O cdigo " no Atualizando Overview solues do Office. 22. Substituir todos os controles ActiveX no documento ou pasta de trabalho por controles gerenciados do Visual Studio Toolbox.

Visual C# Consolidado

1080

O Excel Usando Explicaes Passo-a-passo


Walkthroughs fornecem instrues passo a passo para cenrios comuns e so um bom lugar para comear aprendendo sobre Microsoft Visual Studio 2005 Tools for the Microsoft Office System. Orientaes as seguir demonstram vrios tipos bsicos de tarefas: automatizar o Microsoft Office Excel 2003, executar anlise de dados, trabalhar com controles, solues, implantao e definindo a segurana.

Coleta de dados usando um formulrio do Windows Walkthrough:


Essa explicao passo a passo demonstra como abrir um formulrio Windows de um planilha do Microsoft Office Excel 2003, coletar informaes do usurio, e gravar essas informaes em uma clula da planilha. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Microsoft Visual Studio 2005 Tools for the Microsoft Office System Excel Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Criando um novo projeto Nesta etapa, voc ir criar um projeto de aplicativos do Excel. Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome WinFormInput. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o WinFormInput projeto para Solution Explorer. Adicionar um controle NamedRange para a planilha

Para adicionar um intervalo nomeado para Sheet1 4. 5. Selecione a clula A1 no Sheet1. Na caixa Name, digite formInput. A Name caixa est localizada esquerda da barra de frmulas, logo acima coluna A da planilha. 6. Pressione ENTER.

Visual C# Consolidado

1081

Um NamedRange controle adicionado clula A1. No h nenhuma indicao visvel na planilha, mas formInput aparece na caixa Name (logo acima a planilha no lado esquerdo). e na Properties janela quando a clula A1 selecionada Adicionar um formulrio do Windows ao projeto Criar um formulrio do Windows para o usurio fornea informaes prompt. Para adicionar um formulrio do Windows 6. 7. 8. Selecione o projeto WinFormInput no Solution Explorer. No menu Project, clique em Add Windows Form. Nome do formulrio GetInputString.vb ou GetInputString.cs. e, em seguida clique em Add O novo formulrio aberto no designer. 9. Adicionar um TextBox e um Button. para o formulrio 10. Selecione o boto, localizar a propriedade Text na janela Properties, e alterar o texto OK. Em seguida, adicione cdigo para ThisWorkbook.vb ou ThisWorkbook.cs para coletar informaes do usurio. Exibindo o formulrio do Windows e coletando informaes Criar uma instncia do formulrio GetInputString Windows e exibi-lo, e em seguida, escrever as informaes do usurio em uma clula na planilha. Para exibir o formulrio e coletar informaes 4. 5. Clique com o boto direito do mouse ThisWorkbook.vb ou ThisWorkbook.cs em Solution Explorer e selecione View Code. No manipulador Open de eventos de ThisWorkbook, adicione o seguinte cdigo para declarar uma varivel para o formulrio GetInputString e depois exibir o formulrio: Observao Em C#, voc deve adicionar um manipulador de eventos como mostrado no Startup evento abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. 6. C#

private void ThisWorkbook_Startup(object sender, System.EventArgs e) { this.Open += new Microsoft.Office.Interop.Excel.WorkbookEvents_OpenEventHandler(ThisWorkbook_Open); } private void ThisWorkbook_Open() { GetInputString inputForm = new GetInputString(); inputForm.Show(); }

7.

Criar um mtodo chamado WriteStringToCell que grave texto em um intervalo nomeado. Esse mtodo chamado do formulrio, e entrado sero passadas para o NamedRange controle, formInput o usurio,. na clula A1 C#
public void WriteStringToCell(string formData) { Globals.Sheet1.formInput.Value2 = formData; }

Prxima adicionar cdigo ao formulrio para lidar com clique o boto na evento.

Visual C# Consolidado

1082

Enviar informaes para a planilha Para enviar informaes para a planilha 4. 5. 6. Clique com o boto direito do mouse GetInputString em Solution Explorer, e selecione View Designer. Clique duas vezes no boto para abrir o arquivo de cdigo com manipulador de eventos do boto Click adicionado. Adicione cdigo ao manipulador de eventos para levar a entrada da caixa de texto, envi-lo para a funo WriteStringToCell, e depois feche o formulrio. C#
Globals.ThisWorkbook.WriteStringToCell(this.textBox1.Text); this.Dispose();

Testando Agora voc pode testar sua pasta de trabalho para certificar-se de que o formulrio Windows aparecer, e se a entrada aparece nesta planilha. Para testar sua pasta de trabalho 5. 6. 7. 8. Pressione F5 para executar o projeto. Confirme se o formulrio Windows aparece. Digite Hello World na caixa de texto e clique em OK. Confirme que Hello World aparece na clula A1 da planilha. Prximas etapas Essa explicao passo a passo mostra os fundamentos bsicos do mostrando um Windows Form e dados passagem para uma planilha. Outras tarefas pode desejar executar incluem:

Implantando o projeto. Para obter mais informaes, consulte Como: Implantar arquivos de soluo usando o Publish Wizard.

Alterando planilha formatao usando controles CheckBox Walkthrough:


Essa explicao passo a passo mostra os fundamentos bsicos do uso caixas de seleo em um planilha do Microsoft Office Excel 2003 para alterar a formatao. Voc usar Microsoft Visual Studio 2005 Tools for the Microsoft Office System para criar e adicionar cdigo ao seu projeto. Para ver o resultado como uma amostra completa, consulte Exemplo do Excel de controles. Durante este explicao passo a passo, voc aprender como:

Adicione texto e controles para uma planilha. Formate o texto quando uma opo selecionada. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte

Visual C# Consolidado

1083

Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Visual Studio Tools for Office Microsoft Office Excel 2003. Criando o projeto

Nesta etapa, voc ir criar um projeto usando Visual Studio Tools for Office pasta de trabalho do Excel. Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome My Excel Formatting. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Excel Formatting projeto para Solution Explorer. Adicionar texto e controles a planilha

Para essa explicao passo a passo, voc precisar trs CheckBox controles e algum texto em um NamedRange controle. Para adicionar trs caixas de seleo 9. Verifique se a pasta de trabalho est abra no designer visual studio e que Sheet1 est aberto.

10. Na guia Common Controls da Toolbox, arraste um CheckBox controle para ou prxima clula B2 na Sheet1. 11. No menu View, selecione Properties Janela. 12. Certifique-se de que que Checkbox1 esteja visvel na caixa de listagem Nome de objeto da janela Properties, e altere as propriedades a seguir: Propriedade Name Text Value (Valor) applyBoldFont Negrito

13. Arraste uma segunda caixa de seleo ou prxima clula B4 e alterar as seguintes propriedades: Propriedade Name Text Value (Valor) applyItalicFont Itlico

14. Arraste uma caixa de seleo terceira ou prxima clula B6 e alterar as seguintes propriedades: Propriedade Name Value (Valor) applyUnderlineFont

Visual C# Consolidado

1084

Text

Sublinhado

15. Selecione todos os controles caixa de seleo trs mantendo a tecla CTRL. 16. Na barra de ferramentas do Excel, clique em Align Lefts e, em seguida clique em Make Vertical Spacing Equal. Os controles caixa de seleo trs agora tem igual espaamento vertical e so alinhados no lado esquerdo, na posio do primeiro controle que voc selecionou. Voc em seguida, ser arrastar um NamedRange controle para a planilha. Observao Voc tambm pode adicionar o NamedRange controle digitando textFont na caixa Name. Para adicionar texto a um controle NamedRange 6. 7. 8. 9. Na guia Excel Controls da caixa de ferramentas, arraste um NamedRange controle clula B9. Verificar que $B$9 aparece na caixa de texto editvel, e essa clula B9 estiver selecionada. Se no estiver, clique em Clula B9 para selecion-lo. Clique em OK. Clula B9 se torna um intervalo nomeado NamedRange1. No h nenhuma indicao visvel na planilha, mas NamedRange1 aparece no. (logo acima a planilha no lado esquerdo) quando Clula B9 estiver selecionada a Name box 10. Certifique-se de que que NamedRange1 esteja visvel na caixa de listagem Nome de objeto da janela Properties, e altere as propriedades a seguir: Propriedade Name Value2 Value (Valor) textFont Clique em uma caixa de seleo para alterar a formatao de texto.

Em seguida, escreva o cdigo para formatar o texto quando uma opo selecionada. Formatao quando a opo um texto selecionado Voc nesta seo, vai escrever cdigo para que quando o usurio seleciona uma opo de formatao, o formato do texto na planilha for alterado.

Para alterar a formatao quando uma caixa de seleo marcada


6. 7. Clique com o boto direito do mouse Sheet1 e clique View Code no menu de atalho Adicione o seguinte cdigo ao manipulador Click de eventos da caixa applyBoldFont de seleo: C#
private void applyBoldFont_Click(object sender, EventArgs e) { this.textFont.Font.Bold = this.applyBoldFont.Checked; }

8.

Adicione o seguinte cdigo ao manipulador Click de eventos da caixa applyItalicFont de seleo: C#

Visual C# Consolidado

1085

private void applyItalicFont_Click(object sender, EventArgs e) { this.textFont.Font.Italic = this.applyItalicFont.Checked; }

9.

Adicione o seguinte cdigo ao manipulador Click de eventos da caixa applyUnderlineFont de seleo: C#


private void applyUnderlineFont_Click(object sender, EventArgs e) { if (this.applyUnderlineFont.Checked == true) { this.textFont.Font.Underline = Excel.XlUnderlineStyle.xlUnderlineStyleSingle; } else { this.textFont.Font.Underline = Excel.XlUnderlineStyle.xlUnderlineStyleNone; } }

10. Em C#, adicione manipuladores de eventos para as caixas de seleo para o Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
this.applyBoldFont.Click += new EventHandler(applyBoldFont_Click); this.applyItalicFont.Click += new EventHandler(applyItalicFont_Click); this.applyUnderlineFont.Click += new EventHandler(applyUnderlineFont_Click);

Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se que o texto est formatado corretamente quando voc marca ou desmarca uma caixa de seleo.

Para testar sua pasta de trabalho


4. 5. 6. Pressione F5 para executar o projeto. Marque ou desmarque uma caixa de seleo. Confirme que o texto est formatado corretamente. Prximas etapas Essa explicao passo a passo mostra as noes bsicas de usando caixas de seleo e formatar texto em planilhas do Excel 2003. Aqui esto algumas tarefas que podem vie em seguida:

Implantando o projeto. Para obter mais informaes, consulte Como implantar solues do Office:. Usando um boto para preencher uma caixa de texto. Para obter mais informaes, consulte Exibindo texto em uma caixa de texto em uma planilha usando um boto Walkthrough:.

Exibindo texto em uma caixa de texto em uma planilha usando um boto Walkthrough:
Essa explicao passo a passo mostra os fundamentos bsicos do uso botes e caixas de texto em planilhas Microsoft Office Excel 2003, e como criar projetos Excel usando Microsoft Visual Studio 2005 Tools for the Microsoft Office System. Para ver o resultado como uma amostra completa, consulte Exemplo do Excel de controles. Durante este explicao passo a passo, voc aprender como:

Visual C# Consolidado

1086

Adicionar controles a uma planilha. Preencher uma caixa de texto quando um boto clicado. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Visual Studio Tools for Office Excel. Criando o projeto

Nesta etapa, voc ir criar um projeto usando Visual Studio Tools for Office pasta de trabalho do Excel.

Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome My Excel Button. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Excel Button projeto para Solution Explorer. Adicionar controles a planilha

Para essa explicao passo a passo, ser necessrio um boto e uma caixa de texto na primeira planilha.

Para adicionar um boto e uma caixa de texto


6. 7. 8. 9. Verifique se a My Excel Button.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. Na guia Common Controls da caixa de ferramentas, arraste para Sheet1. um TextBox No menu View, selecione Properties Window. Certifique-que TextBox1 est visvel na caixa Properties drop-down janela e alterar a Name propriedade da caixa de texto para displayText.

10. Arraste um Button controle at Sheet1 e alterar as seguintes propriedades: Propriedade Name Value (Valor) insertText

Visual C# Consolidado

1087

Text

Inserir texto

Agora Escreva o cdigo a ser executado quando o boto clicado. Preencher a caixa de texto quando o boto Clicked Sempre que o usurio clica no boto, Hello World! acrescentada caixa de texto.

Para escrever para a caixa de texto quando o boto clicado


4. 5. Na Solution Explorer, clique com o boto direito do mouse Sheet1 e, em seguida clique View Code no menu de atalho. Adicione o seguinte cdigo ao manipulador Click de eventos do boto: C#
private void insertText_Click(object sender, EventArgs e) { this.displayText.Text += "Hello World! "; }

6.

Em C#, adicione um manipulador de eventos para o Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
this.insertText.Click += new EventHandler(insertText_Click);

Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se que a mensagem Hello World! aparece na caixa de texto quando voc clica no boto. Para testar sua pasta de trabalho 4. 5. 6. Pressione F5 para executar o projeto. Clique no boto. Confirme que Hello World! aparece na caixa de texto. Prximas etapas Essa explicao passo a passo mostra os fundamentos bsicos do uso botes e caixas de texto em planilhas do Excel. Aqui esto algumas tarefas que podem vie em seguida:

Implantando o projeto. Para obter mais informaes, consulte Como: Implantar arquivos de soluo usando o Publish Wizard. Usar caixas de seleo para alterar a formatao. Para obter mais informaes, consulte Alterando planilha formatao usando controles CheckBox Walkthrough:.

Programao contra eventos de um controle NamedRange Walkthrough:


Essa explicao passo a passo demonstra como adicionar um NamedRange controle a um planilha do Microsoft Office Excel 2003 e programa contra seus eventos usando Microsoft Visual Studio 2005 Tools for the Microsoft Office System.

Visual C# Consolidado

1088

Durante este explicao passo a passo, voc aprender como:


Adicionar um NamedRange controle para uma planilha. Programa contra NamedRange Eventos de controle. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Visual Studio Tools for Office Microsoft Office Excel 2003. Criando o projeto

Nesta etapa, voc ir criar pasta de trabalho Excel usando Visual Studio Tools for Office Um do projeto.

Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome My Named Range Events. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Named Range Events projeto para Solution Explorer. Adicionar texto e pipes intervalos para a planilha

Porque controles host so estendidos objetos do Office, voc poder adicion-los para o documento em da mesma maneira, voc adicionar o objeto nativo. Por exemplo, voc pode adicionar um controle Excel NamedRange a uma planilha ao abrir o Insert menu apontando para Name, e escolher Define. Voc tambm pode adicionar um NamedRange controle, arrastando-a partir para a planilha. o Toolbox Nesta etapa, voc ir adicionar dois controles Intervalo Nomeado da planilha usando a e adicione texto para a planilha. o Toolbox,

Para adicionar um intervalo para a planilha


8. 9. Verifique se a My Named Range Events.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. Na guia Excel Controls da caixa de ferramentas, arraste um NamedRange controle clula A1 no Sheet1. A Add NamedRange Control caixa de dilogo ser exibida.

Visual C# Consolidado

1089

10. Verificar que $A$1 aparece na caixa de texto editvel, e essa clula A1 estiver selecionada. Se no estiver, clique em Clula A1 para selecion-lo. 11. Clique em OK. Clula A1 se torna um intervalo nomeado namedRange1. No h nenhuma indicao visvel na planilha, mas namedRange1 aparece na caixa Name (localizada logo acima da planilha no lado esquerdo). Quando Clula A1 estiver selecionada 12. Adicionar um outro NamedRange controle a clula B3. 13. Verificar que $B$3 aparece na caixa de texto editvel, e essa clula B3 estiver selecionada. Se no estiver, clique em Clula B3 para selecion-lo. 14. Clique em OK. Clula B3 se torna um intervalo nomeado namedRange2.

Para adicionar texto a sua planilha


3. 4. Na clula A1, digite o seguinte texto: Este um exemplo de um controle NamedRange. Na clula A3 (para a esquerda de namedRange2), digite o seguinte texto: Eventos: Voc nas sees a seguir, ser escrever cdigo que insere texto em namedRange2 e modifica propriedades do controle namedRange2 em resposta BeforeDoubleClick, Change., e SelectionChange eventos de namedRange1 Adicionar cdigo para responder ao evento BeforeDoubleClick

Para inserir texto em NamedRange2 com base no Evento BeforeDoubleClick


4. 5. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs. e selecione View Code Adicione cdigo para o namedRange1_BeforeDoubleClick manipulador de eventos semelhante ao seguinte: C#
private void namedRange1_BeforeDoubleClick( Microsoft.Office.Interop.Excel.Range Target, ref bool Cancel) { this.namedRange2.Value2 = "The BeforeDoubleClick event occurred."; this.namedRange2.Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red); this.namedRange2.Font.Italic = true; }

6.

Em C#, voc deve adicionar manipuladores de eventos para o intervalo nomeado como mostrado no Startup evento abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
this.namedRange1.BeforeDoubleClick += new Microsoft.Office.Interop.Excel. DocEvents_BeforeDoubleClickEventHandler(namedRange1_BeforeDoubleClick); this.namedRange1.Change += new Microsoft.Office.Interop.Excel. DocEvents_ChangeEventHandler(namedRange1_Change); this.namedRange1.SelectionChange +=new Microsoft.Office.Interop.Excel. DocEvents_SelectionChangeEventHandler(namedRange1_SelectionChange);

Visual C# Consolidado

1090

Adicionar cdigo para responder ao evento de alterao

Para inserir texto em namedRange2 com base no evento Change

Adicione cdigo para o NamedRange1_Change manipulador de eventos semelhante ao seguinte: C#


private void namedRange1_Change(Microsoft.Office.Interop.Excel.Range Target) { this.namedRange2.Value2 = "The Change event occurred."; this.namedRange2.Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Blue); this.namedRange2.Font.Italic = false; }

Observao Como duas vezes em uma clula em um intervalo do Excel entra no modo de edio, um Change evento ocorre quando a seleo movida fora do intervalo mesmo que nenhuma alterao ao texto ocorreu. Adicionar cdigo para responder ao evento SelectionChange

Para inserir texto em namedRange2 com base no evento SelectionChange

Adicione cdigo para o NamedRange1_SelectionChange manipulador de eventos semelhante ao seguinte: C#


private void namedRange1_SelectionChange(Microsoft.Office.Interop.Excel.Range Target) { this.namedRange2.Value2 = "The SelectionChange event occurred."; this.namedRange2.AddComment("SelectionChange always occurs before BeforeDoubleClick."); this.namedRange2.Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black); }

Observao Porque faz duas vezes em uma clula em um intervalo do Excel com a seleo para mover para o intervalo, um SelectionChange evento ocorre antes de ocorrer o BeforeDoubleClick evento. Testar o aplicativo Agora voc pode testar sua pasta de trabalho para verificar texto que descreve os eventos de um NamedRange controle que ser inserido no outro intervalo nomeado quando os eventos so aumentados.

Para testar seu documento


7. 8. 9. Pressione F5 para executar o projeto. Coloque o cursor no namedRange1, e verificar que o texto sobre o SelectionChange evento inserido e que um comentrio inserido na planilha. Duplo clique dentro namedRange1, e verifique se o texto sobre BeforeDoubleClick eventos est inserido com texto em itlico em namedRange2 vermelho.

Visual C# Consolidado

1091

10. Clique fora do namedRange1 e observe que o evento de alterao ocorre quando sair Modo Edio mesmo que nenhuma alterao para o texto foi feita. 11. Alterar o texto dentro namedRange1. 12. Clique fora do namedRange1, e verifique se o texto sobre Change evento est inserido com texto em namedRange2 azul. Prximas etapas Essa explicao passo a passo mostra noes bsicas de programao contra eventos de um NamedRange controle. Aqui esto algumas tarefas que podem vie em seguida:

Implantando o projeto. Para obter mais informaes, consulte Como implantar solues do Office:. Programao contra eventos dos XMLNode controles modo. Para obter mais informaes, consulte Alterando o painel de aes de acordo com contexto do usurio Walkthrough:.

Passo-a-passo: Concedendo e removendo permisses para uma soluo do Office


Essa explicao passo a passo demonstra as noes bsicas de segurana no Microsoft Visual Studio 2005 Tools for the Microsoft Office System. Durante este explicao passo a passo, voc aprender como:

Remova a configurao de segurana padro. Adicionar um novo conjunto de permisses. Testar seu projeto. Pr-requisitos

Para concluir esta explicao passo a passo, ser necessrio:


Visual Studio Tools for Office Microsoft Office Excel 2003. Criando o projeto

Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel.

Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome My Security Test. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Security Test projeto para Solution Explorer. Adicionar cdigo para trs a planilha Nesta etapa, voc adicionar uma caixa de mensagem a um evento de inicializao da planilha.

Para adicionar uma caixa de mensagem a um evento de inicializao

Visual C# Consolidado

1092

12. Verifique se a My Security Test.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. 13. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs,. e, em seguida clique View Code no menu de atalho 14. Adicione o seguinte cdigo para o Startup mtodo dentro classe Sheet1 para mostrar uma caixa de mensagem durante a inicializao. C#
private void Sheet1_Startup(object sender, System.EventArgs e) { MessageBox.Show("Security settings are correct."); }

15. No menu File, clique em Save All. 16. Na caixa Save Project de dilogo, digite C:\Walkthroughs na caixa Location. 17. Clique em Save. 18. Pressione F5 para executar o projeto. O Excel iniciado e aparecer a caixa de mensagem. 19. Fechar a caixa de mensagem. 20. Feche o Excel. 21. No designer do Visual Studio, localize e selecione na guia para My Security Test.xls. 22. Feche My Security Test.xls (a superfcie do design de planilha Excel) no designer do Visual Studio. Feche todos os instncias do Excel antes de alterar a diretiva de segurana. Quando voc criado o projeto de pasta de trabalho do Excel, o assistente adicionado um novo grupo de cdigo de segurana e um grupo de cdigos filho diretiva de segurana Runtime no nvel do usurio. Em seguida, voc remover o grupo de cdigos que criou o assistente. Remover o grupo de cdigos padro Localize e remova o grupo de cdigo padro que foi criado.

Para remover um grupo de cdigos


9. No Painel de Controle, abra Administrative Tools.

10. Executar Microsoft .NET Framework 2.0 Configuration. 11. No modo de exibio de rvore no lado esquerdo, expanda .NET Framework 2.0 Configuration,, expandir Runtime Security Policy, expandir User, expandir Code Groups, Expandido All_Code e My Computer expanda VSTOProjects. No um GUID para cada projeto tenha criado. Expanda cada GUID para ver o caminho para o documento associado. 12. Clique com o boto direito do mouse o GUID de C:\Walkthroughs\My Security Test\My Security Test\bin\My Security Test.xls grupo de cdigos, e, em seguida clique Delete no menu de atalho. Ser exibida uma caixa de dilogo perguntando se voc tiver certeza que deseja excluir este grupo de cdigos. 13. Clique em Yes.

Visual C# Consolidado

1093

14. Voltar para Visual Studio, e pressione F5 para executar o projeto meu teste de segurana. Ser exibida informando a atual poltica de segurana .NET permite que no no que a personalizao para executar uma mensagem de erro. 15. Clique em OK. 16. Feche o Excel. O conjunto no pode ser executado se ele no tiver permisso explcita na Diretiva de Segurana Microsoft .NET. Em seguida, conceda permisso para o conjunto usando um nome forte em vez de uma URL para prova. Dando um nome de alta segurana para o conjunto Um nome forte geralmente mais seguro que uma URL como prova. Ser criar e atribuir um nome forte o conjunto nas prximas etapas.

Para criar um nome forte


9. No menu Project no Visual Studio, clique em My Security Test Properties.

10. Clique na Signing guia. 11. Selecione Sign the assembly. 12. No, o Choose a strong name key file list clique New. 13. Na caixa Create Strong Name Key de dilogo, digite SecurityTestKey na caixa Key file name. 14. Desmarque a Protect my key file with a password caixa de seleo. 15. Clique em OK. O arquivo SecurityTestKey.snk de chave aparece no Solution Explorer. 16. No menu Build, clique em Build Solution Para criar o conjunto contra o par de chaves nome forte. Conceder confiana com base no nome de alta segurana Agora adicionar um novo grupo de cdigo para conceder confiana total para o conjunto com base no nome forte.

Para conceder confiana com base em nome forte


10. Abra Microsoft .NET Framework 2.0 Configuration novamente. 11. Clique com o boto direito do mouse no VSTOProjects n e clique New no menu de atalho 12. Digite o nome Security Test Strong Name para o novo grupo de cdigos, e clique em Next. 13. Na lista Choose the condition type for this code group, clique Strong Name. 14. Clique em Import. 15. Procure C:\Walkthroughs\My segurana Test\My segurana Test.dll segurana Test\bin\My para Visual Basic ou C:\Walkthroughs\My segurana Test\My segurana Test.dll segurana Test\bin\debug\My no C#, e clique em Open.

Visual C# Consolidado

1094

16. Clique em Next. 17. Clique Next para aceitar o FullTrust conjunto de permisses e clique em Finish. 18. Fechar Microsoft .NET Framework 2.0 Configuration. Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se que seu cdigo seja executado quando a pasta de trabalho aberta.

Para testar sua pasta de trabalho


3. 4. Pressione F5 para executar o projeto. Confirme se a caixa de mensagem aparece.

Passo-a-passo: Ligando uma clula de planilha a um campo de banco de dados


Essa explicao passo a passo demonstra noes bsicas de vinculao um nico campo de dados em um banco de dados do SQL Server a um intervalo nomeado no Microsoft Office Excel 2003. Ele inclui adicionar controles que permitem que voc para percorrer todos os registros da tabela. Durante este explicao passo a passo, voc aprender como:

Criar uma fonte de dados para um projeto do Excel. Adicionar controles a uma planilha. Rolar pelos registros do banco de dados. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Microsoft Visual Studio 2005 Tools for the Microsoft Office System Microsoft Office Excel 2003. Acesso a um servidor com o exemplo de SQL Server do Northwind. Permisses para ler e gravar no banco de dados do SQL Server. Criando um novo projeto

Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel.

Para criar um novo projeto

Visual C# Consolidado

1095

Criar um projeto de pasta de trabalho do Excel com o nome My Simple Data Binding, usando o Visual Basic ou C#. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Simple Data Binding projeto para Solution Explorer. Criando o DataSet Use a Data Sources janela para adicionar um DataSet digitado ao seu projeto.

Para criar o DataSet


9. Se a Data Sources janela no estiver visvel, clique Show Data Sources no Data menu. Observao Se Show Data Sources clique dentro a pasta de trabalho do Excel e depois verificar novamente. no estiver disponvel, 10. Clique Add New Data Source Para iniciar o Data Source Configuration Wizard. 11. Selecione Database e, em seguida clique em Next. 12. Selecionar uma conexo de dados ao banco de dados de exemplo Northwind do SQL Server ou adicionar uma nova conexo com o New Connection boto. 13. Aps uma conexo foi selecionado ou criado, clique em Next. 14. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next. 15. Expanda o Tables n na janela Database objects. 16. Marque a caixa de seleo ao lado da Customers tabela. 17. Clique em Finish. O assistente adicionar a Customers tabela para a Data Sources janela. Ele tambm adiciona um DataSet digitado ao seu projeto que est visvel no Solution Explorer. Adicionar controles a planilha Para essa explicao passo a passo, voc precisa de dois intervalos nomeados e quatro botes na primeira planilha. Primeiro, adicione os dois intervalos nomeados a partir da Data Sources janela para que automaticamente eles so vinculados fonte de dados. Em seguida, adicione os botes da Toolbox.

Para adicionar dois intervalos nomeados


8. 9. Verifique se a My Simple Data Binding.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. Abra a Data Sources janela e expanda o Customers n.

10. Selecione a CompanyName coluna, e clique na seta suspensa que aparece. 11. Selecione NamedRange na lista drop-down, e arraste a CompanyName coluna clula A1.

Visual C# Consolidado

1096

Um NamedRange controle denominado companyNameNamedRange criado na clula A1. Ao mesmo tempo, nomeado customersBindingSource, um adaptador de tabela, e uma DataSet instncia so adicionados ao projeto. um BindingSource O controle acoplado que por sua vez est vinculado a DataSet instncia. o BindingSource, 12. Selecione a CustomerID coluna na janela Data Sources, e clique na seta suspensa que aparece. 13. Clique NamedRange na lista drop-down, e arraste a CustomerID coluna clula B1. 14. criado na clula B1, e vinculado a outro NamedRange controle chamado customerIDNamedRange o BindingSource.

Para adicionar quatro botes


3. Na guia Common Controls Da adicionar um Button controle a clula A3 da planilha. o Toolbox, nome Button1 este boto. 4. Adicionar mais trs botes s seguintes clulas nesta ordem, para que os nomes so conforme mostrado: Clula B3 C3 D3 (Nome) Button2 Button3 Button4

A prxima etapa para adicionar texto para os botes, e em C# Adicionar manipuladores de eventos. Inicializando as controles Definir o texto do boto e adicionar manipuladores de eventos durante o Startup evento.

Para inicializar os controles


4. 5. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo para o Sheet1_Startup mtodo para definir o texto para cada boto. C#
this.button1.Text = "|<"; this.button2.Text = "<"; this.button3.Text = ">"; this.button4.Text = ">|";

6.

Para C# s, adicionar manipuladores de eventos para o boto clique eventos para o


Sheet1_Startup mtodo.

C#
this.button1.Click += new EventHandler(button1_Click); this.button2.Click += new EventHandler(button2_Click); this.button3.Click += new EventHandler(button3_Click); this.button4.Click += new EventHandler(button4_Click);

Visual C# Consolidado

1097

Agora, adicione cdigo para manipular os Click eventos dos botes para que o usurio pode procurar pelos registros. Adicionar cdigo para ativar rolagem atravs dos registros Adicione cdigo ao manipulador Click de eventos de cada boto para percorrer os registros.

Para mover para o primeiro registro

Adicionar um manipulador de eventos para o Click Evento do boto Button1, e adicione o cdigo para mover para o primeiro registro a seguir: C#
private void button1_Click(object sender, System.EventArgs e) { this.customersBindingSource.MoveFirst(); }

Para mover para o registro anterior

Adicionar um manipulador de eventos para o Click Evento do boto Button2, e adicione o cdigo a seguir para mover a posio de volta em um: C#
private void button2_Click(object sender, System.EventArgs e) { this.customersBindingSource.MovePrevious(); }

Para mover para o prximo registro

Adicionar um manipulador de eventos para o Click Evento do boto Button3, e adicione o cdigo a seguir para avanar a posio em um: C#
private void button3_Click(object sender, System.EventArgs e) { this.customersBindingSource.MoveNext(); }

Para mover para o ltimo registro

Adicionar um manipulador de eventos para o Click Evento do boto Button4, e adicione o cdigo a seguir para mover para o ltimo registro: C#
private void button4_Click(object sender, System.EventArgs e) { this.customersBindingSource.MoveLast(); }

Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se que voc pode navegar atravs dos registros no banco de dados.

Para testar sua pasta de trabalho


5. 6. 7. Pressione F5 para executar o projeto. Confirme se o primeiro registro aparece nas clulas A1 e B1. Clique em e B1. (Button3) boto e confirme se o registro seguinte aparece na clula A1 a >

Visual C# Consolidado

1098

8.

Clique nos outros botes de rolagem para confirmar que o registro muda conforme o esperado. Prximas etapas

Essa explicao passo a passo mostra os fundamentos bsicos do vinculando um intervalo nomeado a um campo em um banco de dados. Aqui esto algumas tarefas que podem vie em seguida:

Cache os dados para que ele possa ser usado off-line. Para obter mais informaes, consulte Como dados de cache para uso off-line ou em um servidor:. Vincular clulas para vrias colunas em uma tabela, em vez da um campo. Para obter mais informaes, consulte Walkthrough: vinculao clulas para vrias colunas em uma tabela. Usar um BindingNavigator controle para percorrer os registros. Para obter mais informaes, consulte COMO: Navegar em dados com o controle BindingNavigator do Windows Forms.

Walkthrough: vinculao clulas para vrias colunas em uma tabela


Essa explicao passo a passo demonstra noes bsicas de vinculao vrias clulas em uma planilha do Microsoft Office Excel 2003 a campos no banco de dados Northwind do SQL Server. Durante este explicao passo a passo, voc aprender como:

Adicionar controles a uma planilha. Salva qualquer alterao de dados de volta para o banco de dados. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Microsoft Visual Studio 2005 Tools for the Microsoft Office System Microsoft Office Excel 2003. Acesso a um servidor com o exemplo de SQL Server do Northwind. Permisses para ler e gravar no banco de dados do SQL Server. Criando um novo projeto

Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel.

Para criar um novo projeto Visual C# Consolidado 1099

Criar um projeto de pasta de trabalho do Excel com o nome My Complex Data Binding, usando o Visual Basic ou C#. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Complex Data Binding projeto para Solution Explorer. Criando o DataSet

Use a Data Sources janela para adicionar um DataSet digitado ao seu projeto.

Para criar o DataSet


9. Se a Data Sources janela no estiver visvel, clique Show Data Sources no Data menu. Observao Se Show Data Sources clique dentro a pasta de trabalho do Excel e depois verificar novamente. no estiver disponvel, 10. Clique Add New Data Source Para iniciar o Data Source Configuration Wizard. 11. Selecione Database e, em seguida clique em Next. 12. Selecionar uma conexo de dados ao banco de dados de exemplo Northwind do SQL Server ou adicionar uma nova conexo com o New Connection boto. 13. Aps uma conexo foi selecionado ou criado, clique em Next. 14. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next. 15. Expanda o Tables n na janela Database objects. 16. Marque a caixa de seleo ao lado da Employees tabela. 17. Clique em Finish. O assistente adicionar a Employees tabela para a Data Sources janela. Ele tambm adiciona um DataSet digitado ao seu projeto que est visvel no Solution Explorer. Adicionar controles a planilha Para essa explicao passo a passo, voc precisa um ListObject controle e um Button controle na primeira planilha. Primeiro, adicione o ListObject controle a partir da Data Sources janela para que ela est vinculada automaticamente fonte de dados. Em seguida, adicione o Button controle da Toolbox.

Para adicionar um ListObject


5. 6. 7. 8. Verifique se a My Complex Data Binding.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. Abra a Data Sources janela e selecione o Employees n. Clique na seta suspensa que aparece. Selecione ListObject na lista drop-down, e arraste a Employees tabela clula A6. Um ListObject controle denominado EmployeesListObject criado na clula A6. Ao mesmo tempo, nomeado EmployeesBindingSource, um adaptador de tabela, e uma DataSet instncia

Visual C# Consolidado

1100

so adicionados ao projeto. um BindingSource O controle acoplado que por sua vez est vinculado a DataSet instncia. o BindingSource,

Para adicionar um boto

Na guia Common Controls Da adicionar um Button controle a clula A4 da planilha. o Toolbox,

A prxima etapa para adicionar texto ao boto quando a planilha abre. Inicializao do controle Adicionar texto ao boto no manipulador Startup de eventos.

Ao inicializar o controle
4. 5. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo para o Sheet1_Startup mtodo para definir o texto para o b utton. C#
this.button1.Text = "Save";

6.

C# somente, para adicionar um manipulador de eventos para o Click evento para o


Sheet1_Startup mtodo.

C#
this.button1.Click += new EventHandler(button1_Click);

Agora, adicione cdigo para manipular o Click Evento do boto. Salvar alteraes no banco de dados As alteraes tenham sido feitas o dados existe somente no dataset local at que eles so salvos explicitamente volta para o banco de dados.

Para salvar as alteraes feitas o banco de dados

Adicionar um manipulador de eventos para o Click evento do b utton, e adicione o cdigo a seguir para confirmar todas as alteraes que foram feitas no dataset volta para o banco de dados: C#
private void button1_Click(object sender, EventArgs e) { try { this.employeesTableAdapter.Update(this.northwindDataSet.Employees); } catch (System.Data.DataException ex) { MessageBox.Show(ex.Message); } }

Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se de que os dados aparecem como esperado, e que voc pode manipular os dados de um objeto lista.

Para testar a vinculao de dados Visual C# Consolidado 1101

Pressione F5. Verifique que quando abrir a pasta de trabalho, o objeto lista preenchido com dados da tabela Employees.

Para modificar dados


3. 4. Clique em Clula B7, que deve conter o nome Davolio. Digite o nome Anderson, e pressione ENTER.

Para modificar um cabealho de coluna


3. 4. Clique na clula que contm no cabealho LastName da coluna. Digitar Last Name, incluindo um espao entre as duas palavras, e pressione ENTER.

Para salvar dados


5. 6. 7. 8. Clique Save na planilha. Feche a pasta de trabalho. Clique em No Quando solicitado a salvar as alteraes feitas. Pressione F5 para executar o projeto novamente. O objeto lista preenchido com dados da tabela Employees. Observe que o nome na clula B7 ainda Anderson, que a alterao de dados que voc feitas e salvas volta para o banco de dados. No cabealho LastName da coluna foi alterado para seu formato original sem nenhum espao, porque no cabealho da coluna no est vinculado ao banco de dados e voc no foi salvar as alteraes feitas para a planilha.

Para adicionar novas linhas


3. Selecione uma clula dentro do objeto lista. Uma nova linha aparece na parte inferior da lista, com um asterisco (*.) na primeira clula da nova linha 4. Adicionar as informaes a seguir na linha vazia: CdigoDoFuncionrio 10 Sobrenome ITO FirstName Shu Ttulo Gerenciador de vendas

Para excluir linhas


3. 4. Selecionar linha 16, que deve conter a nova linha que voc adicionou, clicando no nmero 16 no lado esquerdo da planilha. No menu Edit, clique em Delete.

Para classificar as linhas na lista


4. 5. Selecione uma clula dentro da lista. Botes de seta aparecem em cada cabealho de coluna. Clique no boto SETA no cabealho da Last Name coluna.

Visual C# Consolidado

1102

6.

Clique em Sort Ascending. As linhas so classificadas em ordem alfabtica por sobrenome.

Para filtrar informaes


6. 7. 8. 9. Selecione uma clula dentro da lista. Clique no boto SETA no cabealho da Title coluna. Clique em Sales Representative. A lista mostra somente as linhas que tm Sales Representative na coluna Title. Clique no boto SETA no cabealho da Title coluna novamente. Filtragem removida e todas as linhas aparecem. Prximas etapas Essa explicao passo a passo mostra os fundamentos bsicos do vinculando uma tabela em um banco de dados a um objeto de lista. Aqui esto algumas tarefas que podem vie em seguida:

10. Clique em (All).

Cache os dados para que ele possa ser usado off-line. Para obter mais informaes, consulte Como dados de cache para uso off-line ou em um servidor:. Implantar a soluo. Para obter mais informaes, consulte Como implantar solues do Office:. Criar uma relao mestre / detalhes entre um campo e uma tabela. Para obter mais informaes, consulte Criando uma relao mestre / detalhes usando um DataSet em cache Walkthrough:.

Criando uma relao mestre / detalhes usando um DataSet em cache Walkthrough:


Essa explicao passo a passo demonstra criar uma relao mestre / detalhes em uma planilha, e cache os dados para que a soluo pode ser usada off-line. Durante este explicao passo a passo, voc aprender como:

Adicionar controles a uma planilha. Configurar um DataSet para ser armazenados em uma planilha. Adicione cdigo para Habilitar rolagem pelos registros. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Visual C# Consolidado

1103

Microsoft Visual Studio 2005 Tools for the Microsoft Office System Microsoft Office Excel 2003. Acesso ao exemplo de SQL Server do Northwind. O banco de dados pode ser no seu computador de desenvolvimento ou em um servidor. Permisses para ler e gravar no banco de dados do SQL Server. Criando um novo projeto

Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel. Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome My Master-Detail, usando o Visual Basic ou C#. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My MasterDetail projeto para Solution Explorer. Criando o DataSet Use a Data Sources janela para adicionar um DataSet digitado ao seu projeto.

Para criar o DataSet


9. Se a Data Sources janela no estiver visvel, clique Show Data Sources no Data menu.

10. Clique Add New Data Source Para iniciar o Data Source Configuration Wizard. 11. Selecione Database e, em seguida clique em Next. 12. Selecionar uma conexo de dados ao banco de dados de exemplo Northwind do SQL Server ou adicionar uma nova conexo usando o New Connection boto. 13. Aps selecionar ou criar uma conexo, clique em Next. 14. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next. 15. Expanda o Tables n na janela Database objects. 16. Selecione a Orders tabela e a Order Details tabela. 17. Clique em Finish. O assistente adicionar as duas tabelas para a Data Sources janela. Ele tambm adiciona um DataSet digitado ao seu projeto que est visvel no Solution Explorer. Adicionar controles a planilha Nesta etapa, voc adicionar um intervalo nomeado, um objeto de lista, e dois botes primeira planilha. Primeiro, adicionar o intervalo nomeado e o objeto lista a partir da Data Sources janela para que automaticamente eles so vinculados fonte de dados. Em seguida, adicione os botes da Toolbox.

Para adicionar um intervalo nomeado e um objeto de lista


8. 9. Verifique se a My Master-Detail.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. Abra a Data Sources janela e expanda o Orders n.

Visual C# Consolidado

1104

10. Selecione a OrderID coluna, e clique na seta suspensa que aparece. 11. Clique NamedRange na lista drop-down, e arraste a OrderID coluna clula A2. Um NamedRange controle denominado OrderIDNamedRange criado na clula A2. Ao mesmo tempo, nomeado OrdersBindingSource, um adaptador de tabela, e uma DataSet instncia so adicionados ao projeto. um BindingSource O controle acoplado que por sua vez est vinculado a DataSet instncia. o BindingSource, 12. Role para baixo aps as colunas que esto sob a Orders tabela. Na parte inferior da lista a Order Details tabela; ele aqui porque ele um filho da Orders tabela. Selecionar esta Order Details Tabela, no a um que seja no mesmo nvel como a Orders Tabela, e clique a seta suspensa que aparece. 13. Clique ListObject na lista drop-down, e arraste a Order Details tabela clula A6. 14. Um ListObject controle denominado Order_DetailsListObject criado na clula A6, e vinculado BindingSource.

Para adicionar dois botes


3. Na guia Common Controls Da adicionar um Button controle a clula A3 da planilha. o Toolbox, nome Button1 este boto. 4. Adicionar um outro Button controle a clula B3 da planilha. nome Button2 este boto. Em seguida, marcar DataSet para ser armazenado em cache no documento. Cache o DataSet Marcar DataSet para ser armazenado em cache no documento, tornar DataSet pblicos e definindo a CacheInDocument propriedade. Armazenar em cache DataSet 4. 5. 6. Selecione NorthwindDataSet No bandeja de componentes. Na janela Properties, alterar a Modifiers propriedade para Public. DataSets dever ser pblica antes cache est ativado. Alterar a CacheInDocument propriedade para True.

A prxima etapa para adicionar texto a botes, e no C# adicione cdigo para ligar os manipuladores de eventos. Inicializando as controles Definir o texto do boto e adicionar manipuladores de eventos durante o Startup evento.

Ao inicializar os dados e os controles


4. 5. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo para o Sheet1_Startup mtodo para definir o texto para os botes. C#

Visual C# Consolidado

1105

this.button1.Text = "<"; this.button2.Text = ">";

6.

Para C# s, adicionar manipuladores de eventos para o boto clique eventos para o


Sheet1_Startup mtodo.

C#
this.button1.Click += new EventHandler(button1_Click); this.button2.Click += new EventHandler(button2_Click);

Adicionar cdigo para ativar rolagem atravs dos registros Adicione cdigo ao manipulador Click de eventos de cada boto para percorrer os registros. Para percorrer os registros 3. Adicionar um manipulador de eventos para o Click evento de Button1, e adicione o cdigo a seguir para percorrer os registros para trs: C#
private void button1_Click(object sender, EventArgs e) { this.ordersBindingSource.MovePrevious(); }

4.

Adicionar um manipulador de eventos para o Click evento de Button2, e adicione o cdigo a seguir para avanar pelos registros: C#
private void button2_Click(object sender, EventArgs e) { this.ordersBindingSource.MoveNext(); }

Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se de que os dados aparecem como esperado, e que voc pode usar a soluo off-line. Para testar o cache de dados 9. Pressione F5. 10. Verifique que o intervalo nomeado e o objeto lista so preenchidos com dados da fonte de dados. 11. Rolar pelos alguns dos registros clicando nos botes. 12. Pasta de trabalho, salve e feche a pasta de trabalho e Visual Studio. 13. Desativar a conexo ao banco de dados. Desconecte o cabo de rede do seu computador se o banco de dados estiver localizado em um servidor, ou parar o servio SQL Server se o banco de dados for no seu computador de desenvolvimento. 14. Abra o Excel, e abra My Master-Detail.xls a partir do diretrio \bin (\My Detail\bin mestreno Visual Basic) ou \My Detail\bin\debug mestre-em C#. 15. Rolar pelos alguns dos registros para ver que a planilha opera normalmente quando desconectado. 16. Reconectar-se ao banco de dados. Conectar-se seu computador rede novamente se o banco de dados estiver localizado em um servidor, ou inicia o servio SQL Server se o banco de dados for no seu computador de desenvolvimento. Prximas etapas Essa explicao passo a passo mostra as noes bsicas de criar uma relao mestre / detalhes de dados em uma planilha e cache um DataSet. Aqui esto algumas tarefas que podem vie em seguida:

Visual C# Consolidado

1106

Implantar a soluo. Para obter mais informaes, consulte Como implantar solues do Office:. Recuperar dados de cache para outro projeto. Para obter mais informaes, consulte Como recuperar dados de uma pasta de trabalho em um servidor em cache:.

Walkthrough: atualizando um grfico em uma planilha usando botes de opo


Essa explicao passo a passo mostra os fundamentos bsicos do alterando estilos do grfico usando botes de opo em um planilha do Microsoft Office Excel 2003. Para ver o resultado como uma amostra completa, consulte Exemplo do Excel de controles. Durante este explicao passo a passo, voc aprender como:

Adicionar um controle de usurio para uma planilha. Alterar o estilo do grfico quando uma opo est selecionada. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Microsoft Visual Studio 2005 Tools for the Microsoft Office System Microsoft Office Excel 2003. Adicionar um grfico a uma planilha

Voc pode criar um projeto de pasta de trabalho do Excel usando uma pasta de trabalho existente. Nessa explicao passo a passo, ir adicionar um grfico pasta de trabalho e Usar pasta de trabalho no Excel uma nova soluo. A fonte de dados nessa explicao passo a passo uma planilha chamada Data for Chart. Para adicionar os dados 5. 6. 7. 8. Abra o Excel 2003. Abre uma nova pasta de trabalho. Clique com o boto direito do mouse na Sheet3 guia e, em seguida clique Rename no menu de atalho. Renomear a planilha para Data for Chart. Adicionar dados Data for Chart Os seguir com clula A4 sendo a parte superior esquerda E8 Canto, e o canto inferior direito: Q1 Q2 Q3 Q4

Visual C# Consolidado

1107

Oeste Leste Norte Sul

500 600 450 800

550 625 470 750

550 675 490 775

600 700 510 790

Em seguida, adicione o grfico para a primeira planilha. Para adicionar um grfico 12. No menu Insert, clique em Chart. O Chart Wizard abre. 13. Clique em Next, deixando os padres selecionados. 14. Clique na caixa Data Range e desmarque qualquer seleo padro. 15. Na planilha Data for Chart, selecionar o bloco de clulas que contm os nmeros, que inclui A4 no canto esquerdo superior para E8 no canto direito inferior. 16. Para aceitar todos os padres para Step 3, clique Next em Next novamente. 17. No Step 4, garantir que As object in: est selecionado. 18. Na lista As object in:, selecione Sheet1. 19. Clique em Finish. 20. Reposicionar o grfico para que o canto direito superior alinhe com Clula E2. 21. Salve o arquivo para a unidade C: e nome-la ExcelChart.xls. 22. Feche o Excel. Criando um novo projeto Nesta etapa, voc ir criar um projeto usando Visual Studio Tools for Office pasta de trabalho do Excel. Para criar um novo projeto 4. Criar um projeto de pasta de trabalho do Excel com o nome My Excel Chart. Verifique que Copy an existing document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Clique no Browse boto e v para a pasta de trabalho que voc criou anteriormente nessa explicao passo a passo. Clique em OK. O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Excel Chart projeto para Solution Explorer. Definindo Propriedades do grfico Quando voc criar um novo projeto pasta de trabalho do Excel usando uma pasta de trabalho existente, controles host automaticamente so criados para intervalos nomeados, objetos lista, e grficos que existem dentro da pasta de trabalho. Voc pode alterar o nome do controle Chart usando a Properties janela

5. 6.

Visual C# Consolidado

1108

Para alterar o nome do controle grfico

Selecione o Chart controle no designer e alterar as seguintes propriedades na janela Properties: Propriedade Name HasLegend Adicionar um controle de usurio ao projeto Value (Valor) dataChart False

Para adicionar um controle de usurio 4. 5. 6. Selecione o My Excel Chart projeto no Solution Explorer. No menu Project, clique em Add New Item. Na caixa Add New Item de dilogo, clique User Control, nome do controle ChartOptions, e clique em Add Se o controle de usurio estiver no visvel no designer, clique duas vezes em ChartOptions no Solution Explorer. Na guia Common Controls Da arraste um Radio Button controle para o controle de usurio, e alterar as seguintes propriedades: o Toolbox, Propriedade Name Text 8. Value (Valor) columnChart Grfico de coluna

Para adicionar controles Windows Form ao controle de usurio 6. 7.

Adicionar um boto de opo segundo para o controle de usurio, e alterar as propriedades a seguir: Propriedade Name Text Value (Valor) barChart Grfico de barras

9.

Adicionar um boto de opo terceiro para o controle de usurio, e alterar as propriedades a seguir: Propriedade Name Text Value (Valor) lineChart Grfico de linha

Visual C# Consolidado

1109

10. Adicionar um boto de opo quarto para o controle de usurio, e alterar as propriedades a seguir: Propriedade Name Text Value (Valor) areaBlockChart Grfico bloquear de rea

Em seguida, escreva o cdigo para atualizar o grfico quando um boto de opo clicado. Alterar o grfico estilo quando um boto de opo selecionada Nesta seo, voc ser criar um evento pblico sobre o controle de usurio, adicionar uma propriedade para definir o tipo de seleo, e criar um manipulador de eventos para o CheckedChanged evento de cada um dos botes de opo. Para criar um evento e propriedade em um controle de usurio 3. 4. No Solution Explorer, clique com o boto direito do mouse no controle de usurio e selecione View Code. Adicione cdigo para criar um SelectionChanged evento e a Selection propriedade para a
ChartOptions classe:

C#
public event EventHandler SelectionChanged; private Microsoft.Office.Interop.Excel.XlChartType selectedType = Microsoft.Office.Interop.Excel.XlChartType.xlColumnClustered; public Microsoft.Office.Interop.Excel.XlChartType Selection { get { return this.selectedType; } set { this.selectedType = value; } }

Para manipular o evento CheckedChanged dos botes de opo 6. Definir o tipo de grfico no manipulador CheckedChanged de eventos de boto areaBlockChart de opo e depois gerar o evento. C#
private void areaBlockChart_CheckedChanged(object sender, EventArgs e) { if (((RadioButton)sender).Checked) { this.selectedType = Microsoft.Office.Interop.Excel.XlChartType.xlAreaStacked; if (this.SelectionChanged != null) { this.SelectionChanged(this, EventArgs.Empty); } } }

7.

Definir o tipo de grfico no manipulador CheckedChanged de eventos do boto barChart de opo. C#


private void barChart_CheckedChanged(object sender, EventArgs e) { if (((RadioButton)sender).Checked) { this.selectedType = Microsoft.Office.Interop.Excel.XlChartType.xlBarClustered; if (this.SelectionChanged != null) { this.SelectionChanged(this, EventArgs.Empty); } } }

8.

Definir o tipo de grfico no manipulador CheckedChanged de eventos do boto columnChart de opo. C#

Visual C# Consolidado

1110

private void columnChart_CheckedChanged(object sender, EventArgs e) { if (((RadioButton)sender).Checked) { this.selectedType = Microsoft.Office.Interop.Excel.XlChartType.xlColumnClustered; if (this.SelectionChanged != null) { this.SelectionChanged(this, EventArgs.Empty); } } }

9.

Definir o tipo de grfico no manipulador CheckedChanged de eventos do boto lineChart de opo. C#


private void lineChart_CheckedChanged(object sender, EventArgs e) { if (((RadioButton)sender).Checked) { this.selectedType = Microsoft.Office.Interop.Excel.XlChartType.xlLineMarkers; if (this.SelectionChanged != null) { this.SelectionChanged(this, EventArgs.Empty); } } }

10. Em C#, voc deve adicionar manipuladores de eventos para os botes de opo. Adicione o cdigo para o ChartOptions Construtor, sob a chamada para InitializeComponent, conforme mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
public ChartOptions() { InitializeComponent(); areaBlockChart.CheckedChanged += new EventHandler(areaBlockChart_CheckedChanged); barChart.CheckedChanged += new EventHandler(barChart_CheckedChanged); columnChart.CheckedChanged += new EventHandler(columnChart_CheckedChanged); lineChart.CheckedChanged += new EventHandler(lineChart_CheckedChanged); }

Adicionar o controle de usurio a planilha Quando voc cria a soluo, o novo controle de usurio automaticamente adicionado Toolbox. Voc pode, ento, arrastar o controle da Toolbox. para seu Worksheet Para adicionar o controle do usurio sua planilha 4. 5. 6. No menu Build, clique em Build Solution. O ChartOptions controle de usurio adicionado Toolbox. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs. e selecione View Designer Do Toolbox arraste o ChartOptions controle de para a planilha. Um novo controle chamado ChartOptions1 adicionado ao seu projeto. Alterar o tipo de grfico Nesta seo, criar um manipulador de eventos para alterar o tipo de grfico acordo para a opo selecionada no controle de usurio. Para alterar o tipo de grfico que exibido na planilha 3. Adicionar o manipulador de eventos a seguir para a Sheet1 classe. C#
private void ChartOptions1_SelectionChanged(object sender, EventArgs e) { try { dataChart.ChartType = this.ChartOptions1.Selection; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }

Visual C# Consolidado

1111

4.

Em C#, adicione um manipulador de eventos para o controle de usurio para o Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
this.ChartOptions1.SelectionChanged += new EventHandler(ChartOptions1_SelectionChanged);

Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se que o grfico tiver estilo corretamente quando voc seleciona um boto de opo. Para testar sua pasta de trabalho 4. 5. 6. Pressione F5 para executar o projeto. Selecione vrios botes de opo. Confirme que o estilo do grfico altera para correspondem seleo. Prximas etapas Essa explicao passo a passo mostra noes bsicas sobre como usar botes de opo e estilos do grfico nas planilhas do Excel 2003. Aqui esto algumas tarefas que podem vie em seguida:

Implantando o projeto. Para obter mais informaes, consulte Como implantar solues do Office:. Usando um boto para preencher uma caixa de texto. Para obter mais informaes, consulte Exibindo texto em uma caixa de texto em uma planilha usando um boto Walkthrough:. Alterar a formatao em uma planilha usando caixas de seleo. Para obter mais informaes, consulte Alterando planilha formatao usando controles CheckBox Walkthrough:.

Vinculao de Dados para controles em um painel Aes do Excel Walkthrough:


Essa explicao passo a passo demonstra vinculao de dados a controles em um painel Aes no Microsoft Office Excel 2003. Os controles demonstram uma Relao mestre / detalhes entre tabelas em um banco de dados do SQL Server. Durante este explicao passo a passo, voc aprender como:

Adicionar controles a uma planilha. Criar um controle painel Aes. Adicionar controles Windows Forms ligados a dados a um controle painel Aes. Mostrar painel de aes quando abre o aplicativo. Testar seu projeto. Observao

Visual C# Consolidado

1112

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Microsoft Visual Studio 2005 Tools for the Microsoft Office System Microsoft Office Excel 2003. Acesso a um servidor com o exemplo de SQL Server do Northwind. Permisses para ler e gravar no banco de dados do SQL Server. Criando o projeto

A primeira etapa para criar um projeto de pasta de trabalho do Excel. Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome My Excel Actions Pane. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Excel Actions Pane projeto para Solution Explorer. Adicionar uma nova fonte de dados ao projeto

Para adicionar uma nova fonte de dados para o projeto 10. Se a Data Sources janela no estiver visvel, clique Show Data Sources no Data menu. Observao Se Show Data Sources clique dentro na planilha do Excel e depois verificar novamente. no estiver disponvel, 11. Clique Add New Data Source Para iniciar o Data Source Configuration Wizard. 12. Selecione Database e, em seguida clique em Next. 13. Selecionar uma conexo de dados ao banco de dados de exemplo Northwind do SQL Server ou adicionar uma nova conexo com o New Connection boto. 14. Clique em Next. 15. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next. 16. Expanda o Tables n na janela Database objects. 17. Marque a caixa de seleo ao lado da Suppliers tabela. 18. Expandir a Products tabela e selecione ProductName, SupplierID, QuantityPerUnit. e UnitPrice 19. Clique em Finish. O assistente adiciona a Suppliers tabela e Products Tabela janela Data Sources. Ele tambm adiciona um DataSet digitado ao seu projeto que est visvel no Solution Explorer.

Visual C# Consolidado

1113

Adicionar controles a planilha Em seguida, adicione um NamedRange controle e um ListObject controle primeira planilha. Para adicionar um NamedRange e um controle ListObject 8. 9. Verifique se a My Excel Actions Pane.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. Na janela Data Sources , expanda a Suppliers tabela.

10. Clique na seta suspensa no n Company Name, e selecione NamedRange. 11. Arraste Company Name a partir da Data Sources janela para na Sheet1 Clula A2. Um NamedRange controle denominado CompanyNameNamedRange criado, e o <CompanyName> de texto aparece na clula A2. Ao mesmo tempo, nomeado suppliersBindingSource, um adaptador de tabela, e um DataSet so adicionados ao projeto. um BindingSource O controle acoplado que por sua vez est vinculado a DataSet instncia. o BindingSource, 12. Na janela Data Sources, role para baixo aps as colunas que esto sob a Suppliers tabela. Na parte inferior da lista a Products tabela; ele aqui porque ele um filho da Suppliers tabela. Selecionar esta Products Tabela, no a um que seja no mesmo nvel como a Suppliers Tabela, e clique a seta suspensa que aparece. 13. Clique ListObject na lista drop-down, e arraste a Products tabela para clulas A6 em Sheet1. Um ListObject controle denominado ProductNameListObject criado na clula A6. Ao mesmo tempo, e um adaptador de tabela so adicionados ao projeto. nomeado productsBindingSource, um BindingSource O controle acoplado que por sua vez est vinculado a DataSet instncia. o BindingSource, 14. No C# somente, selecione suppliersBindingSource No bandeja de componentes, e alterar a Modifiers propriedade para Internal na janela Properties. Adicionar controles ao painel de aes Em seguida, voc precisa um controle painel Aes que contenha uma caixa de combinao. Para adicionar um controle painel Aes 4. 5. 6. Selecione o My Excel Actions Pane projeto no Solution Explorer. No menu Project, selecione Add New Item. Na caixa Add New Item de dilogo, selecione Actions Pane Control, nome-la ActionsControl e clique em Add Das Common Controls guias da Toolbox, arraste um ComboBox controle para o controle painel Aes. Alterar a Size propriedade para 171, 21. Redimensionar o controle de usurio para ajustar os controles. Vinculando o controle no painel Aes a dados Neste seo, voc ser definir a fonte de dados de mesma fonte de dados como o NamedRange controle em uma planilha.. com a mesma fonte de dados que o NamedRange controle em uma planilha o ComboBox o ComboBox

Para adicionar controles Windows Forms ligados a dados a um controle painel Aes 4. 5. 6.

Visual C# Consolidado

1114

Para definir propriedades de vinculao de dados do controle 4. 5. Clique com o boto direito do mouse no controle painel Aes e selecione View Code a partir do menu de atalho Adicione o seguinte cdigo ao evento Load do controle painel Aes: C#
private void ActionsControl_Load(object sender, EventArgs e) { this.comboBox1.DataSource = Globals.Sheet1.suppliersBindingSource; this.comboBox1.DisplayMember = "CompanyName"; }

6.

Em C#, voc deve criar um manipulador de eventos para o ActionsControl. Voc pode colocar este cdigo no construtor ActionsControl como mostrado abaixo. Para obter mais informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
public ActionsControl() { InitializeComponent(); this.Load += new EventHandler(ActionsControl_Load); }

Mostrando o Painel de Aes Voc nesta seo, vai escrever cdigo para mostrar o painel Aes. O painel Actions ficar visvel depois controles so adicionados a ele. Para mostrar o painel Aes 3. 4. Clique com o boto direito do mouse ThisWorkbook.vb no Solution Explorer, ou ThisWorkbook.cs,. e, em seguida clique View Code no menu de atalho Criar uma nova instncia do controle do usurio na classe ThisWorkbook, da seguinte maneira: C#
ActionsControl actions = new ActionsControl();

5.

No manipulador Startup de eventos de ThisWorkbook, adicione cdigo de forma que ele tenha como no exemplo a seguir: C#
private void ThisWorkbook_Startup(object sender, System.EventArgs e) { this.ActionsPane.Controls.Add(actions); }

Testar o aplicativo Agora voc pode testar seu documento para verificar o painel Aes que aberto quando o documento for aberto. Voc testar para a relao mestre / detalhes entre os controles no painel de aes e os controles da planilha. Para testar seu documento 5. 6. 7. 8. Pressione F5 para executar o projeto. Confirme se o painel Actions est visvel. Selecione uma empresa na caixa Lista. Verifique se o nome da empresa est listado no controle NamedRange e se os detalhes do produto esto listados no ListObject controle. Selecione vrias empresas para verificar o nome da empresa e Detalhes do Produto altere conforme apropriado. Prximas etapas

Visual C# Consolidado

1115

Essa explicao passo a passo mostra as noes bsicas de vinculao de dados a controles em um painel Aes no Excel. Aqui esto algumas tarefas que podem vie em seguida:

Implantando o projeto. Para obter mais informaes, consulte Como implantar solues do Office:. Ligao de dados a controles no Word. Para obter mais informaes, consulte Vinculao de Dados para controles em um painel Aes do Word Walkthrough:. Mostrar e ocultar controles no painel de aes. Para obter mais informaes, consulte Alterando o painel de aes de acordo com contexto do usurio Walkthrough:

Implantando um Word ou Solution do Excel usando um manifesto Deployment Walkthrough:


Essa explicao passo a passo demonstra como implantar uma soluo o Microsoft Office Excel ou Microsoft Office Word em um compartilhamento de rede em um servidor. Ser posicionado no final do explicao passo a passo, o possvel para executar a soluo no servidor do seu computador de desenvolvimento. Em um ambiente de produo, uma Microsoft Visual Studio 2005 Tools for the Microsoft Office System soluo geralmente publicada primeiro a um servidor de teste, e depois ele reimplantado em um servidor de produo depois que o departamento de TI aprovar-. Voc nessa explicao passo a passo, ser emular esse processo, publicando uma soluo em um local temporrio no seu computador de desenvolvimento, e ento redeploying a soluo do local de publicao para um servidor. Para obter mais informaes sobre as opes para implantar a soluo, consulte Modelos de implantao. Durante este explicao passo a passo, voc aprender como:

Do Publish Wizard uso para publicar sua soluo em um local no seu computador de desenvolvimento. Manualmente relanamento a soluo do seu computador local para um compartilhamento de rede em um servidor. Modificar o manifesto do aplicativo que est incorporado no documento para apontar para o novo local manifesto de implantao programaticamente. Editar a manifesto de implantao para apontar para a nova localizao do manifesto do aplicativo externos. Editar o manifesto do aplicativo externo para apontar para o novo local do conjunto e a manifesto de implantao. Pr-requisitos

Para concluir esta explicao passo a passo, ser necessrio:


Visual Studio Tools for Office O Word Microsoft Office 2003 ou Microsoft Office Excel 2003. Observao Essa explicao passo a passo pressupe que voc estiver implantando uma soluo Word. Se voc quiser executar explicao passo a passo com uma soluo Excel, o substitua o nome do

Visual C# Consolidado

1116

projeto do Word com o nome do seu projeto do Excel em todos os cdigos e exemplos XML.

Acesso a um servidor de rede para implantao. Essa explicao passo a passo pressupe que voc so redeploying sua soluo para o \\DeployServer\ShareFolder compartilhamento de rede. Privilgios de administrador no computador de desenvolvimento, para que voc possa definir a diretiva de segurana para um local de rede. Criando o projeto

Nesta etapa, voc ir criar um projeto Documento do Word. Para criar um novo projeto

Criar um projeto Documento do Word com o nome WordDeployment. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

Abre o novo documento do Word no designer e adiciona o WordDeployment projeto para Solution Explorer o Visual Studio. Adicionar cdigo para trs o documento Nesta etapa, voc adicionar uma caixa de mensagem ao manipulador Startup de eventos do documento. Isso permitir que voc para verificar se a soluo est funcionando quando voc abre o documento rapidamente. Para adicionar uma caixa de mensagem a um evento de inicializao 6. 7. Clique com o boto direito do mouse ThisDocument.vb no Solution Explorer, ou ThisDocument.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo ao manipulador Startup de eventos dentro a ThisDocument classe para mostrar uma caixa de mensagem durante a inicializao. C#
private void ThisDocument_Startup(object sender, System.EventArgs e) { MessageBox.Show("The document is deployed correctly."); }

8. 9.

Pressione F5 para executar o projeto. Inicia o Word e a caixa de mensagem aparece. Fechar a caixa de mensagem.

10. Sair do Word. Em seguida, voc publicar nesta soluo. Publicando a soluo Nesta etapa, voc publicar a soluo em um local temporrio no computador local. Para publicar a soluo 6. 7. Clique com o boto direito do mouse o n de projeto no Solution Explorer. Clique Publish no menu de atalho. O Publish Wizard aparece.

Visual C# Consolidado

1117

8. 9.

Na caixa Specify the location to publish this application, digite C:\TestDeploy. Clique em Finish. O documento de Soluo e manifesto de implantao so copiados para C:\TestDeploy. O conjunto de soluo, atualizado manifesto do aplicativo, e cpias do documento de Soluo e manifesto de implantao so copiadas para C:\TestDeploy\WordDeployment_1.0.0.0. Para obter mais informaes, consulte Implantando o Word e Excel Solutions.

10. Feche o WordDeployment projeto no Visual Studio. Observao O conjunto no tem permisso para executar ainda, para que ele se voc tentar executar a soluo ser lanar um erro. Voc ir atualizar sua diretiva de segurana para conceder permisso de confiana total ao conjunto em uma etapa posterior. Quando voc publicar uma soluo, o manifesto do aplicativo incorporado no aponta de documento de soluo para o caminho completo da manifesto de implantao. Se voc relanamento os arquivos de soluo para outro local, dever atualizar o manifesto do aplicativo incorporado para apontar para a nova localizao da manifesto de implantao. Voc tambm deve atualizar a manifesto de implantao e o manifesto do aplicativo externo para apontar para os novos locais de arquivo. Atualizando o manifesto Application incorporados Para editar o manifesto do aplicativo incorporado, use a ServerDocument classe que Visual Studio Tools for Office fornece. Quando voc usa a ServerDocument classe, voc deve executar o cdigo em um novo projeto (no a Visual Studio Tools for Office Soluo), como um projeto de console, e o Visual Studio Tools for Office documento de soluo deve ser fechado. Observao Inclui Visual Studio Tools for Office um exemplo que demonstre como criar uma ferramenta que pode ser usada para editar o manifesto do aplicativo incorporado. Para obter mais informaes, consulte Aplicativo Manifest exemplo Editor. Para atualizar o manifesto do aplicativo incorporado 6. 7. 8. Criar um novo projeto Console Application. Do Microsoft.VisualStudio.Tools.Applications.Runtime Adicionar referncias para e System.Windows.Forms montagens para este projeto. Abra o arquivo Program.cs ou Module1.vb, e adicione a seguinte Imports ou using instruo para o topo do arquivo. C#
using Microsoft.VisualStudio.Tools.Applications.Runtime;

9.

Copie o cdigo a seguir para a Main funo. Este cdigo cria uma ServerDocument que fornece acesso ao manifesto do aplicativo incorporado de seu documento de soluo. O cdigo atribui o novo caminho manifesto de implantao para a DeployManifestPath propriedade, e salva e fecha o ServerDocument.. o ServerDocument C#

Visual C# Consolidado

1118

ServerDocument sd = null; try { sd = new ServerDocument(@"C:\TestDeploy\WordDeployment.doc"); sd.AppManifest.DeployManifestPath = @"\\DeployServer\ShareFolder\WordDeployment.application"; sd.Save(); } finally { if (sd != null) { sd.Close(); } }

10. Pressione F5 para executar o projeto. Uma janela do console aparece rapidamente enquanto o manifesto do aplicativo incorporado est sendo atualizado, e fecha a janela do console. Atualizando o manifesto de implantao Agora que voc atualizou o manifesto do aplicativo incorporado no documento Visual Studio Tools for Office de soluo, voc deve atualizar a manifesto de implantao para apontar para a nova localizao do manifesto do aplicativo externos. Para atualizar a manifesto de implantao 4. Abra a manifesto de implantao em um editor de texto, como o Bloco de notas. A manifesto de implantao denominado WordDeployment.application, e est localizado na pasta C:\TestDeploy de publicao. Defina o codebase atributo do elemento <dependentAssembly> como o caminho completo da localizao implantao final do manifesto do aplicativo externos. Para obter mais informaes, consulte &lt;dependentAssembly&gt; Element (Visual Studio Tools for Office Reference).O atributo para essa explicao passo a passo deve aspecto como este:
<dependentAssembly codebase="\\DeployServer\ShareFolder\ WordDeployment_1.0.0.0\WordDeployment.dll.manifest"

5.

6.

Salve e feche o arquivo manifesto de implantao. Atualizando o manifesto de aplicativos externos

Alm disso, para atualizar a manifesto de implantao, voc tambm deve editar o manifesto do aplicativo externo para apontar para os locais implantao final do conjunto de soluo e a manifesto de implantao. Sempre que voc publicar uma Visual Studio Tools for Office soluo, um novo manifesto do aplicativo externo gerado que aponta para a verso atual do conjunto de soluo. Para atualizar o manifesto do aplicativo externo 5. Abra o manifesto do aplicativo em um editor de texto, como o Bloco de notas. O manifesto do aplicativo denominado WordDeployment.dll.manifest, e est localizado na pasta C:\TestDeploy\WordDeployment_1.0.0.0 de publicao. Localize o <installFrom> elemento que est o filho do elemento <dependency>, e defina o codebase atributo como o caminho completo da montagem de soluo atual. Para obter mais informaes, consulte <installFrom> Element (Visual Studio Tools for Office Reference).O atributo para essa explicao passo a passo deve aspecto como este:
<dependentAssembly codebase="\\DeployServer\ShareFolder\ WordDeployment_1.0.0.0\WordDeployment.dll"

6.

7.

Localize o <installFrom> elemento que est o filho do elemento <assembly>, e defina o codebase atributo para o caminho completo do manifesto de implantao. Para obter mais informaes, consulte <installFrom> Element (Visual Studio Tools for Office Reference).O atributo para essa explicao passo a passo deve aspecto como este:
<dependentAssembly codebase="\\DeployServer\ShareFolder\WordDeployment.application"

8.

Salve e feche o arquivo manifesto do aplicativo.

Visual C# Consolidado

1119

Copiando os arquivos da soluo para o servidor Agora que voc tiver editado os manifestos, voc est pronto para copiar os arquivos de soluo para o servidor. Para copiar os arquivos de soluo para o servidor 4. 5. 6. Crie uma WordDeployment_1.0.0.0 pasta sob a \\DeployServer\ShareFolder compartilhamento de arquivos de rede. Copiar o documento de Soluo e a manifesto de implantao para \\DeployServer\ShareFolder. Copiar o conjunto de soluo e o manifesto do aplicativo para \\DeployServer\ShareFolder\WordDeployment_1.0.0.0. Conceder confiana total para a pasta de rede Para execute sua Visual Studio Tools for Office soluo a partir da pasta de rede, voc deve conceder confiana total para a pasta de rede na sua diretiva de segurana no computador de desenvolvimento. Voc pode modificar a diretiva de segurana de um prompt de comando usando a ferramenta Diretiva de Segurana para Acesso ao Cdigo (Caspol.exe). Para conceder confiana para um local de rede, voc deve ter privilgios de administrador e voc dever alterar a diretiva de segurana no nvel do computador. Observao Este procedimento destinado a fim de executar essa explicao passo a passo. No use este procedimento para conceder confiana a conjuntos ou diretrios se no tiver certeza que sejam segura e protegida. Para obter mais informaes sobre concesso e remover permisses, consulte HOW TO: conceder permisses para pastas e montagens e Como remover permisses de pastas e montagens:. Para conceder confiana total para a pasta de rede

Digite o seguinte comando no prompt de comando Studio visual:


caspol -m -ag LocalIntranet_Zone -url \\DeployServer\ShareFolder\* FullTrust -n "Remote Deployment" -d "Deployment Walkthrough"

Testando a soluo Agora voc pode testar sua soluo para certificar-se que seu cdigo seja executado quando voc abre o documento a partir do computador de desenvolvimento. Para testar a implantao 3. 4. No computador de desenvolvimento, abra o WordDeployment.doc arquivo no \\DeployServer\ShareFolder\. Confirme se a caixa de mensagem aparece. Prximas etapas Voc tambm pode implantar a soluo usando um arquivo do Microsoft Windows Installer (.msi). Para obter mais informaes, consulte Implantando um Word ou Solution do Excel usando um arquivo do Windows Installer Walkthrough:.

Visual C# Consolidado

1120

Implantando um Word ou Solution do Excel usando um arquivo do Windows Installer Walkthrough:


Essa explicao passo a passo demonstra como criar um arquivo do Microsoft Windows Installer (.msi) que pode ser usado para implantar uma soluo Microsoft Office Excel 2003 ou Microsoft Office Word 2003. Durante este explicao passo a passo, voc aprender como:

Criar um projeto de instalao que voc pode usar para criar um arquivo do Windows Installer. Modifique o projeto de instalao para que o arquivo Windows Installer instala sua Microsoft Visual Studio 2005 Tools for the Microsoft Office System soluo. Adicionar uma etapa para o projeto de instalao para que Arquivo do Windows Installer edita o manifesto do aplicativo incorporados no Visual Studio Tools for Office documento de soluo.

Essa explicao passo a passo pressupe que o computador de destino j tiver os pr-requisitos instalados para executar Visual Studio Tools for Office solues. Voc cria o arquivo Windows Installer no o verificar ou instalar esses pr-requisitos. Para obter mais informaes sobre os prrequisitos para executar Visual Studio Tools for Office solues, consulte Como se preparar computadores de usurio final para executar solues do Office:. Observao Conjuntos em Visual Studio Tools for Office Solues devem ser concede confiana total na diretiva de segurana do usurio final antes da soluo seja executado. O arquivo Windows Installer voc criar nessa explicao passo a passo no No implantar a diretiva de segurana necessrio para executar a soluo. Para obter mais informaes sobre segurana em Visual Studio Tools for Office solues, consulte Requisitos de segurana para executar solues do Office e Prticas recomendadas para segurana no Office Solutions. Para obter informaes sobre como configurar a diretiva de segurana por usurio final computadores, consulte Implantao de diretiva de segurana. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Visual Studio Tools for Office O Word Microsoft Office 2003 ou Microsoft Office Excel 2003. Observao Essa explicao passo a passo inclui etapas para criar uma soluo simples que voc pode usar em explicao passo a passo o Excel. Se voc deseja executar o explicao passo a passo com uma soluo Word ou Excel existente, comearo o explicao passo a passo no ttulo criando o Project a instalao, " " e certifique-se substituir o nome ExcelDeployment do projeto com o nome do seu projeto em todos os exemplos de cdigo e instrues.

Visual C# Consolidado

1121

Criando o projeto Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel. Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome ExcelDeployment. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o ExcelDeployment projeto para Solution Explorer. Adicionar cdigo para trs a pasta de trabalho Nesta etapa, voc adicionar uma caixa de mensagem ao manipulador Startup de eventos da pasta de trabalho. Isso permite que voc para verificar se a soluo est funcionando quando voc abre o documento rapidamente. Para adicionar uma caixa de mensagem a um evento de inicializao 6. 7. Clique com o boto direito do mouse ThisWorkbook.vb no Solution Explorer, ou ThisWorkbook.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo ao manipulador Startup de eventos dentro a ThisWorkbook classe para mostrar uma caixa de mensagem durante a inicializao. C#
private void ThisWorkbook_Startup(object sender, System.EventArgs e) { MessageBox.Show("The workbook is deployed successfully."); }

8. 9.

Pressione F5 para executar o projeto. O Excel iniciado e aparecer a caixa de mensagem. Fechar a caixa de mensagem.

10. Saia do Excel. Em seguida, voc adicionar um projeto de instalao para sua soluo. Criar um projeto de instalao Nesta etapa, voc ir criar um projeto de instalao que voc pode compilar para criar um arquivo do Windows Installer para sua soluo. Para obter mais informaes, consulte Configurar projetos. Para criar um projeto de instalao para a soluo 7. 8. 9. Clique com o boto direito do mouse no n na Solution Explorer soluo. Aponte para Add no menu de atalho, e clique em New Project. A Add New Project caixa de dilogo ser exibida. No painel Project types, expanda Other Project types e selecione Setup and Deployment.

10. No painel Templates, selecione Setup project. 11. Nome do projeto ExcelSetup. 12. Clique em OK.

Visual C# Consolidado

1122

O projeto instalao aparece no Solution Explorer. Por padro, o arquivo que voc ir criar usando este projeto instalao Windows Installer inclui uma caixa de dilogo que permite ao usurio final que especifique o local de instalao da soluo. Para obter mais informaes, consulte Caixa de dilogo interface do usurio da pasta de instalao. Adicionar o pasta de trabalho e assembly da soluo para o Project da instalao Nesta etapa, voc adicionar a sada do projeto ExcelDeployment principal para o projeto de instalao. A sada do projeto ExcelDeployment principal consiste de pasta de trabalho e o conjunto de soluo. Para adicionar o documento e conjunto ao projeto de instalao 10. Clique com o boto direito do mouse no ExcelSetup project n em Solution Explorer. 11. Selecione View no menu de atalho, e depois clique em File System. 12. Clique com o boto direito do mouse Application Folder no painel esquerdo. 13. Aponte para Add no menu de atalho, e clique em Project Output. 14. Selecione ExcelDeployment na caixa Project. 15. Selecione Primary output na lista de tipos de sada. 16. Clique em OK. A sada do projeto e dependncias aparecem no painel direito. 17. No Solution Explorer, expanda Detected Dependencies sob o ExcelSetup n de projeto. 18. Clique com boto direito mouse cada dependncia, exceto para Microsoft .NET Framework, e clique Exclude no menu de atalho. Criar um projeto de ao personalizada Nesta etapa, voc ir criar um projeto que contm aes personalizadas para o projeto de instalao. Aes personalizadas so um recurso do Windows Installer que permitem a voc para executar cdigo no final de uma instalao para executar aes que no podem ser executadas durante a instalao. Para obter mais informaes, consulte Aes Personalizadas. Para criar um projeto ao personalizada 8. 9. Clique com o boto direito do mouse no n na Solution Explorer soluo. Aponte para Add no menu de atalho, e clique em New Project. A Add New Project caixa de dilogo ser exibida. 10. No painel Project types, expanda o n para a linguagem de programao, e selecione Windows. 11. No painel Templates, selecione Class Library. 12. Nome do projeto ExcelCustomAction. 13. Clique em OK. O novo projeto aparece na Solution Explorer. 14. No Solution Explorer, clique com o boto direito do mouse Class1.vb ou Class1.cs sob o ExcelCustomAction projeto e, em seguida, clique em Delete. Este arquivo desnecessrio para essa explicao passo a passo. Criar uma ao personalizada que salvas o manifesto de aplicativo

Visual C# Consolidado

1123

Quando voc executava seu projeto anteriormente nessa explicao passo a passo pelo pressionamento F5, a processo de criao editado o manifesto do aplicativo incorporado na pasta de trabalho para aponte para o caminho relativo do conjunto. Se a pasta de trabalho e o conjunto permanecer na mesma pasta aps a instalao, ento voc no precisam modificar o manifesto do aplicativo incorporado, e voc pode ignorar esta seo. No entanto, se voc quiser que o usurio possa mover a pasta de trabalho para uma pasta diferente aps a instalao, voc deve editar o manifesto do aplicativo para apontar para o caminho completo da montagem. Voc deve atualizar o manifesto do aplicativo que est incorporado no Visual Studio Tools for Office documento de Soluo ao executar uma ao personalizada aps a instalao, porque o local do conjunto de soluo desconhecido at que o usurio especifica o local durante a instalao. Editar o manifesto do aplicativo incorporado, usando a ServerDocument classe. Para usar a ServerDocument classe no projeto de instalao, adicione cdigo para uma Installer classe dentro do projeto ao personalizada. Para criar uma ao personalizada que edita o manifesto do aplicativo 9. Clique com o ExcelCustomAction projeto no Solution Explorer. A Add New Item caixa de dilogo ser exibida. 11. Selecionar Installer Class, e nome da classe ManifestEditor. 12. Adicione uma referncia ao conjunto Microsoft.VisualStudio.Tools.Applications.Runtime para o ExcelCustomAction projeto. 13. Do ManifestEditor.cs clique com o boto direito do mouse no Solution Explorer, ou ManifestEditor.vb arquivo e clique em View Code. 14. Adicione a instruo seguinte Imports ou using para o topo do arquivo de cdigo. C#
using Microsoft.VisualStudio.Tools.Applications.Runtime;

10. Aponte para Add no menu de atalho, e clique em New Item.

15. Copie o cdigo a seguir para a ManifestEditor classe. Esse cdigo substitui o Install mtodo, que usado para executar aes Instalao personalizada. O cdigo define o local de instalao especificado pelo usurio para a AssemblyPath propriedade. O caminho de instalao especificado pelo usurio e os nomes do documento e conjunto so obtidas a partir da Parameters propriedade. C#
// Override the Install method to update the customization location // in the application manifest. public override void Install(System.Collections.IDictionary stateSaver) { UpdateApplicationManifest(); base.Install(stateSaver); } // Update the application manifest according to the the install location. private void UpdateApplicationManifest() { // Get the parameters passed to the task. string targetDir = this.Context.Parameters["targetdir"]; string documentName = this.Context.Parameters["documentname"]; string assemblyName = this.Context.Parameters["assemblyname"]; // Get the application manifest from the document. string documentPath = System.IO.Path.Combine(targetDir, documentName); ServerDocument serverDocument1 = new ServerDocument(documentPath, System.IO.FileAccess.ReadWrite); try { AppManifest appManifest1 = serverDocument1.AppManifest; string assemblyPath = System.IO.Path.Combine(targetDir, assemblyName); appManifest1.Dependency.AssemblyPath = assemblyPath; serverDocument1.Save(); } finally { if (serverDocument1 != null) { serverDocument1.Close(); } } }

Visual C# Consolidado

1124

16. Clique com o ExcelCustomAction projeto no Solution Explorer, e, em seguida clique em Build. Adicionando a ao personalizada ao projeto de instalao Nesta etapa, voc adicionar a sada do projeto ExcelCustomAction principal para o projeto de instalao. Isso permite que o arquivo Windows Installer para executar a ao personalizada que edita o manifesto do aplicativo. Para adicionar a sada primria do projeto ao personalizada ao projeto de instalao 12. Clique com o boto direito do mouse no ExcelSetup project n em Solution Explorer. 13. Aponte para View no menu de atalho, e clique em Custom Actions. 14. O Custom Actions Editor, clique com boto direito no n e Install Clique em Add Custom Action. 15. Na caixa Look In Selecionar Application Folder, e clique em Add Output 16. Selecione ExcelCustomAction na caixa Project. 17. Selecione Primary output na lista de tipos de sada, e depois clique em OK. 18. Verifique que Primary output from ExcelCustomAction (Active) foi adicionado lista de sadas primria para o projeto de instalao e clique em OK 19. Em expandir Install. o Custom Actions Editor, 20. Clique com o boto direito do mouse Primary output from ExcelCustomAction (Active) e, em seguida clique em Properties Window. 21. Na janela Properties, defina a CustomActionData propriedade para a seguinte seqncia:
/targetdir="[TARGETDIR]/" /documentname="ExcelDeployment.xls" /assemblyname="ExcelDeployment.dll"

Para obter informaes sobre a CustomActionData propriedade, consulte Propriedade CustomActionData. 22. Clique com o boto direito do mouse e, em seguida clique em Build. Em Solution Explorer, o ExcelSetup project Teste a instalao Agora voc pode testar a soluo para garantir que sua soluo instalada quando voc executar o arquivo do Windows Installer no seu computador de desenvolvimento. Para testar a instalao 5. 6. 7. 8. Clique com o boto direito do mouse e, em seguida clique em Run. Em Solution Explorer, o ExcelSetup project Siga as instrues no Assistente de Instalao, e especificar uma pasta de instalao no seu computador de desenvolvimento. Abrir a pasta de trabalho do Excel a partir da pasta de instalao. Confirme se a caixa de mensagem aparece.

Visual C# Consolidado

1125

Passo-a-passo: Concedendo e removendo permisses para uma soluo do Office


Essa explicao passo a passo demonstra as noes bsicas de segurana no Microsoft Visual Studio 2005 Tools for the Microsoft Office System. Durante este explicao passo a passo, voc aprender como:

Remova a configurao de segurana padro. Adicionar um novo conjunto de permisses. Testar seu projeto. Pr-requisitos

Para concluir esta explicao passo a passo, ser necessrio:


Visual Studio Tools for Office Microsoft Office Excel 2003. Criando o projeto

Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel. Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome My Security Test. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Security Test projeto para Solution Explorer. Adicionar cdigo para trs a planilha Nesta etapa, voc adicionar uma caixa de mensagem a um evento de inicializao da planilha. Para adicionar uma caixa de mensagem a um evento de inicializao 12. Verifique se a My Security Test.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. 13. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs,. e, em seguida clique View Code no menu de atalho 14. Adicione o seguinte cdigo para o Startup mtodo dentro classe Sheet1 para mostrar uma caixa de mensagem durante a inicializao. C#
private void Sheet1_Startup(object sender, System.EventArgs e) { MessageBox.Show("Security settings are correct."); }

15. No menu File, clique em Save All. 16. Na caixa Save Project de dilogo, digite C:\Walkthroughs na caixa Location. 17. Clique em Save.

Visual C# Consolidado

1126

18. Pressione F5 para executar o projeto. O Excel iniciado e aparecer a caixa de mensagem. 19. Fechar a caixa de mensagem. 20. Feche o Excel. 21. No designer do Visual Studio, localize e selecione na guia para My Security Test.xls. 22. Feche My Security Test.xls (a superfcie do design de planilha Excel) no designer do Visual Studio. Feche todos os instncias do Excel antes de alterar a diretiva de segurana. Quando voc criado o projeto de pasta de trabalho do Excel, o assistente adicionado um novo grupo de cdigo de segurana e um grupo de cdigos filho diretiva de segurana Runtime no nvel do usurio. Em seguida, voc remover o grupo de cdigos que criou o assistente. Remover o grupo de cdigos padro Localize e remova o grupo de cdigo padro que foi criado. Para remover um grupo de cdigos 9. No Painel de Controle, abra Administrative Tools. 10. Executar Microsoft .NET Framework 2.0 Configuration. 11. No modo de exibio de rvore no lado esquerdo, expanda .NET Framework 2.0 Configuration,, expandir Runtime Security Policy, expandir User, expandir Code Groups, Expandido All_Code e My Computer expanda VSTOProjects. No um GUID para cada projeto tenha criado. Expanda cada GUID para ver o caminho para o documento associado. 12. Clique com o boto direito do mouse o GUID de C:\Walkthroughs\My Security Test\My Security Test\bin\My Security Test.xls grupo de cdigos, e, em seguida clique Delete no menu de atalho. Ser exibida uma caixa de dilogo perguntando se voc tiver certeza que deseja excluir este grupo de cdigos. 13. Clique em Yes. 14. Voltar para Visual Studio, e pressione F5 para executar o projeto meu teste de segurana. Ser exibida informando a atual poltica de segurana .NET permite que no no que a personalizao para executar uma mensagem de erro. 15. Clique em OK. 16. Feche o Excel. O conjunto no pode ser executado se ele no tiver permisso explcita na Diretiva de Segurana Microsoft .NET. Em seguida, conceda permisso para o conjunto usando um nome forte em vez de uma URL para prova. Dando um nome de alta segurana para o conjunto

Visual C# Consolidado

1127

Um nome forte geralmente mais seguro que uma URL como prova. Ser criar e atribuir um nome forte o conjunto nas prximas etapas. Para criar um nome forte 9. No menu Project no Visual Studio, clique em My Security Test Properties. 10. Clique na Signing guia. 11. Selecione Sign the assembly. 12. No, o Choose a strong name key file list clique New. 13. Na caixa Create Strong Name Key de dilogo, digite SecurityTestKey na caixa Key file name. 14. Desmarque a Protect my key file with a password caixa de seleo. 15. Clique em OK. O arquivo SecurityTestKey.snk de chave aparece no Solution Explorer. 16. No menu Build, clique em Build Solution Para criar o conjunto contra o par de chaves nome forte. Conceder confiana com base no nome de alta segurana Agora adicionar um novo grupo de cdigo para conceder confiana total para o conjunto com base no nome forte. Para conceder confiana com base em nome forte 10. Abra Microsoft .NET Framework 2.0 Configuration novamente. 11. Clique com o boto direito do mouse no VSTOProjects n e clique New no menu de atalho 12. Digite o nome Security Test Strong Name para o novo grupo de cdigos, e clique em Next. 13. Na lista Choose the condition type for this code group, clique Strong Name. 14. Clique em Import. 15. Procure C:\Walkthroughs\My segurana Test\My segurana Test.dll segurana Test\bin\My para Visual Basic ou C:\Walkthroughs\My segurana Test\My segurana Test.dll segurana Test\bin\debug\My no C#, e clique em Open. 16. Clique em Next. 17. Clique Next para aceitar o FullTrust conjunto de permisses e clique em Finish. 18. Fechar Microsoft .NET Framework 2.0 Configuration. Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se que seu cdigo seja executado quando a pasta de trabalho aberta. Para testar sua pasta de trabalho 3. 4. Pressione F5 para executar o projeto. Confirme se a caixa de mensagem aparece.

Visual C# Consolidado

1128

O Word Usando Explicaes Passo-a-passo


Walkthroughs fornecem instrues passo a passo para cenrios comuns e so um bom lugar para comear aprendendo sobre Microsoft Visual Studio 2005 Tools for the Microsoft Office System. As orientaes a seguir demonstram formas voc pode usar as ferramentas do Microsoft Office 2003 para automatizar projetos Microsoft Office Word 2003, para implantar suas solues, e para definir a segurana.

Walkthrough: Changing Document formatao usando controles CheckBox


Essa explicao passo a passo demonstra os fundamentos bsicos do uso controles em um documento do Microsoft Office Word 2003 para alterar a formatao de texto. Voc usar Microsoft Visual Studio 2005 Tools for the Microsoft Office System para criar e adicionar cdigo ao seu projeto. Para ver o resultado como uma amostra completa, consulte Exemplo de controles do Word. Durante este explicao passo a passo, voc aprender como:

Adicione texto e um controle a um documento. Formate o texto quando uma opo selecionada. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Visual Studio Tools for Office O Microsoft Office Word 2003. Criando o projeto

Neste procedimento, voc ir criar projeto usando Visual Studio Tools for Office um documento do Word. Para criar um novo projeto

Criar um projeto Documento do Word com o nome My Word Formatting. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Abre o novo documento do Word no designer e adiciona o My Word Formatting projeto para Solution Explorer o Visual Studio. Adicionar texto e controles ao documento do Word

Visual C# Consolidado

1129

Para essa explicao passo a passo, voc precisar trs caixas de seleo e algum texto em um Bookmark controle no documento do Word. Para adicionar trs caixas de seleo 10. Verifique se o documento est aberto no designer visual studio. 11. Na Common Controls guia e arraste-o para o documento. da Toolbox, arraste um CheckBox 12. No menu View, selecione Properties Window. 13. Certifique-se de que que Checkbox1 esteja visvel na caixa de listagem Nome de objeto da janela Properties, e altere as propriedades a seguir: Propriedade Name Text Value (Valor) applyBoldFont Negrito

14. Pressione Enter para mover o ponto de insero abaixo da primeira caixa de seleo. 15. Adicionar uma segunda caixa de seleo para o documento abaixo da ApplyBoldFont caixa de seleo e alterar as propriedades a seguir: Propriedade Name Text Value (Valor) applyItalicFont Itlico

16. Pressione Enter para mover o ponto de insero abaixo da segunda caixa de seleo. 17. Adicionar uma caixa de seleo terceira para o documento abaixo da ApplyItalicFont caixa de seleo e alterar as propriedades a seguir: Propriedade Name Text Value (Valor) applyUnderlineFont Sublinhado

18. Voc em seguida, ser arrastar o Bookmark controle para o documento. Observao Voc tambm pode adicionar o Bookmark controle usando a Bookmark caixa de dilogo, encontrada no menu Insert. Para adicionar texto e um controle indicador 5. Mover o ponto de insero abaixo os controles caixa de seleo e digite o seguinte texto no documento:

Visual C# Consolidado

1130

Clique em uma caixa de seleo para alterar a formatao de texto. 6. 7. Na guia Word Controls na Toolbox, arraste um Bookmark controle para o documento. A Add Bookmark Control caixa de dilogo ser exibida. Selecione o texto adicionado ao documento e clique em OK. Um Bookmark controle denominado Bookmark1 adicionado ao texto selecionado no documento. 8. Certifique-se de que que Bookmark1 esteja visvel na caixa de listagem Nome de objeto da janela Properties, e alterar a propriedade Nome para fontText.

Em seguida, escreva o cdigo para formatar o texto quando uma caixa de seleo marcada ou desmarcada. Formatao a caixa de texto quando a verificao checked ou Cleared Quando o usurio seleciona uma opo de formatao, alterar o formato do texto no documento. Para alterar a formatao quando uma caixa de seleo marcada 7. 8. Clique com o boto direito do mouse ThisDocument no Solution Explorer, e, em seguida clique View Code no menu de atalho. No C# somente, adicionar as constantes a seguir para a ThisDocument classe: C#
const int WordTrue = -1; const int WordFalse = 0;

9.

Adicione o seguinte cdigo ao manipulador Click de eventos da caixa applyBoldFont de seleo: C#


private void applyBoldFont_Click(object sender, System.EventArgs e) { if (this.applyBoldFont.Checked == true) { this.fontText.Bold = WordTrue; } else { this.fontText.Bold = WordFalse; } }

10. Adicione o seguinte cdigo ao manipulador Click de eventos da caixa applyItalicFont de seleo: C#
private void applyItalicFont_Click(object sender, System.EventArgs e) { if (this.applyItalicFont.Checked == true) { this.fontText.Italic = WordTrue; } else { this.fontText.Italic = WordFalse; } }

11. Adicione o seguinte cdigo ao manipulador Click de eventos da caixa applyUnderlineFont de seleo: C#
private void applyUnderlineFont_Click(object sender, System.EventArgs e) { if (this.applyUnderlineFont.Checked == true) { this.fontText.Underline = Word.WdUnderline.wdUnderlineSingle; } else { this.fontText.Underline = Word.WdUnderline.wdUnderlineNone; } }

12. Em C#, adicione manipuladores de eventos para as caixas de texto para o Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de

Visual C# Consolidado

1131

eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
this.applyBoldFont.Click += new EventHandler(applyBoldFont_Click); this.applyItalicFont.Click += new EventHandler(applyItalicFont_Click); this.applyUnderlineFont.Click += new EventHandler(applyUnderlineFont_Click);

Testar o aplicativo Agora voc pode testar seu documento para certificar-se que o texto est formatado corretamente quando voc marca ou desmarca uma caixa de seleo. Para testar seu documento 4. 5. 6. Pressione F5 para executar o projeto. Marque ou desmarque uma caixa de seleo. Confirme que o texto est formatado corretamente. Prximas etapas Essa explicao passo a passo mostra as noes bsicas de usando caixas de seleo e programaticamente alterar texto formatao em documentos do Word. Aqui esto algumas tarefas que podem vie em seguida:

Implantao do projeto. Para obter mais informaes, consulte Como: Implantar arquivos de soluo usando o Publish Wizard. Usando um boto para preencher uma caixa de texto. Para obter mais informaes, consulte Exibindo texto em uma caixa de texto em um documento usando um boto Walkthrough:.

Exibindo texto em uma caixa de texto em um documento usando um boto Walkthrough:


Essa explicao passo a passo demonstra noes bsicas de usando botes e caixas de texto em documentos do Microsoft Office Word 2003,, bem como usar Microsoft Visual Studio 2005 Tools for the Microsoft Office System para criar um projeto. Durante este explicao passo a passo, voc aprender como:

Adicionar controles ao documento do Word. Preencher uma caixa de texto quando um boto clicado. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Visual C# Consolidado

1132

Visual Studio Tools for Office O Microsoft Office Word 2003. Criando o projeto

Nesta etapa, voc ir criar projeto usando Visual Studio Tools for Office um documento do Word. Para criar um novo projeto

Criar um projeto Documento do Word com o nome My Word Button. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Abre o novo documento do Word no designer e adiciona o My Word Button projeto para Solution Explorer o Visual Studio. Adicionar controles ao documento do Word

Nesta seo, voc adicionar um boto e uma caixa de texto para o documento Word. Para adicionar um boto e uma caixa de texto 6. 7. Verifique se o documento est aberto no designer visual studio. Na guia Common Controls da Toolbox, arraste um TextBox controle para o documento. Observao No Word, controles so ignorados na linha com texto por padro. Voc pode modificar, controles forma, bem como objetos forma, so inseridos na guia Edit da caixa Options de dilogo. 8. 9. No menu View, selecione Properties Window. Certifique-que TextBox1 est visvel na caixa Properties drop-down janela e alterar a Name propriedade da caixa de texto para displayText.

10. Arraste um Button controle para o documento e alterar as seguintes propriedades: Propriedade Name Text Value (Valor) insertText Inserir texto

Agora Escreva o cdigo a ser executado quando o boto clicado. Preencher a caixa de texto quando o boto Clicked Sempre que o usurio clica no boto, Hello World! acrescentada caixa de texto. Para escrever para a caixa de texto quando o boto clicado 4. 5. Na Solution Explorer, clique com o boto direito do mouse ThisDocument e, em seguida clique View Code no menu de atalho. Adicione o seguinte cdigo ao manipulador Click de eventos do boto: C#

Visual C# Consolidado

1133

private void insertText_Click(object sender, EventArgs e) { this.displayText.Text += "Hello World!"; }

6.

Em C#, adicione um manipulador de eventos para o boto para o Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
this.insertText.Click += new EventHandler(insertText_Click);

Testar o aplicativo Agora voc pode testar seu documento para certificar-se que a mensagem Hello World! aparece na caixa de texto quando voc clica no boto. Para testar seu documento 4. 5. 6. Pressione F5 para executar o projeto. Clique no boto. Confirme que Hello World! aparece na caixa de texto. Prximas etapas Essa explicao passo a passo mostra os fundamentos bsicos do uso botes e caixas de texto em documentos do Word. Aqui esto algumas tarefas que podem vie em seguida:

Implantando o projeto. Para obter mais informaes, consulte Como: Implantar arquivos de soluo usando o Publish Wizard. Usando uma caixa de combinao para alterar a formatao. Para obter mais informaes, consulte Walkthrough: Changing Document formatao usando controles CheckBox.

Walkthrough: Criando menus de atalho para indicadores


Essa explicao passo a passo demonstra a criao de menus de atalho para Bookmark controles. Voc ir escrever cdigo no evento BeforeRightClick do indicador para que quando o usurio clica com o boto direito do mouse o texto dentro do indicador, um menu de atalho contendo itens de menu para formatar o texto aparea. Durante este explicao passo a passo, voc aprender como:

Criar um menu de atalho. Escrever cdigo para responder a com o boto direito do mouse texto em um indicador. Verifique se h sobreposio indicadores. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos

Visual C# Consolidado

1134

Para concluir esta explicao passo a passo, ser necessrio:


Microsoft Visual Studio 2005 Tools for the Microsoft Office System O Microsoft Office Word 2003. Criando o projeto

Nesta etapa, voc ir criar um projeto Documento do Word no Visual Studio. Para criar um novo projeto

Criar um projeto Documento do Word com o nome My Bookmark Shortcut Menu. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Abre o novo documento do Word no designer e adiciona o My Bookmark Shortcut Menu projeto para Solution Explorer o Visual Studio. Adicionar texto e indicadores ao documento

Nesta etapa, voc ser adicionar texto ao seu documento do Word e depois adicionar dois indicadores. Para adicionar texto ao seu documento

Digite o seguinte texto em um documento do Word: Este um exemplo de criar um menu de atalho quando voc clica com o boto direito do mouse texto em um indicador.

Para adicionar um controle indicador ao seu documento 4. 5. Na guia Word Controls da Toolbox, arraste um Bookmark controle para o documento. A Add Bookmark Control caixa de dilogo ser exibida. Selecione as palavras creating a shortcut menu when you right-click the text no seu documento e clique em OK. bookmark1 adicionado ao documento. 6. Adicionar outro Bookmark controle com as palavras right-click the text in a bookmark. bookmark2 adicionado ao documento. Observao As palavras right-click the text aparecero no bookmark1 e bookmark2. Quando voc adicionar indicadores aos seus documentos Office Word 2003 no tempo de criao, um Bookmark controle criado que permite a voc para programa contra vrios eventos do indicador. Voc pode escrever cdigo no evento BeforeRightClick do indicador para que quando o usurio clica com o boto direito do mouse o texto dentro do indicador, um menu de atalho contendo itens de menu aparea. Criando o menu curto Para criar o menu de atalho 5. 6. No Solution Explorer, clique com o boto direito do mouse ThisDocument e selecione View Code. Declarar as CommandBar variveis e uma varivel do indicador no nvel de classe:

Visual C# Consolidado

1135

C#
private Office.CommandBar commandBar; private Office.CommandBarButton boldText; private Office.CommandBarButton italicText; private Microsoft.Office.Tools.Word.Bookmark selectedBookmark; const int WordTrue = -1; const int WordFalse = 0;

7.

Adicionar um mtodo para criar o menu: C#


private void AddPopUp() { commandBar = Application.CommandBars.Add("FormatText", Office.MsoBarPosition.msoBarPopup, missing, true); // Add a button and set the style, caption, icon and tag. boldText = (Office.CommandBarButton)commandBar.Controls.Add(1, missing, missing, missing, missing); boldText.Style = Office.MsoButtonStyle.msoButtonCaption; boldText.Caption = "Bold"; boldText.FaceId = 113; boldText.Tag = "0"; // Add a button and set the style, caption, icon and tag. italicText = (Office.CommandBarButton)commandBar.Controls.Add(1, missing, missing, missing, missing); italicText.Style = Office.MsoButtonStyle.msoButtonCaption; italicText.Caption = "Italic"; italicText.FaceId = 114; italicText.Tag = "1"; // Handle the click events with the ButtonClick procedure. boldText.Click += new Microsoft.Office.Core ._CommandBarButtonEvents_ClickEventHandler(ButtonClick); italicText.Click += new Microsoft.Office.Core ._CommandBarButtonEvents_ClickEventHandler(ButtonClick); }

8.

Chamada AddPopup a partir do Startup evento de ThisDocument: C#


private void ThisDocument_Startup(object sender, System.EventArgs e) { AddPopUp(); }

Para formatar o texto contido no indicador 4. Adicionar um ButtonClick manipulador de eventos para aplicar formatao para o indicador. C#
private void ButtonClick(Microsoft.Office.Core.CommandBarButton Ctrl, ref bool CancelDefault) { if (Ctrl.Caption == "Bold") { if (selectedBookmark.Bold == WordTrue) { selectedBookmark.Bold = WordFalse; } else { selectedBookmark.Bold = WordTrue; } } else if (Ctrl.Caption == "Italic") { if (selectedBookmark.Italic == WordTrue) { selectedBookmark.Italic = WordFalse; } else { selectedBookmark.Italic = WordTrue; } } }

5.

Adicionar um showPopupMenu manipulador de eventos para manipular o BeforeRightClick evento de dois indicadores: Observao Voc deve escrever cdigo para manipular o caso em que se sobrepem indicadores. Se voc no fizer isso, por padro, o cdigo se chamar para cada indicador dentro da seleo.

C#
private void showPopupMenu(object sender, Microsoft.Office.Tools.Word.ClickEventArgs e) { int startPosition = 0; // If bookmarks overlap, get bookmark closest to cursor. for (int i = 1; i <= e.Selection.Bookmarks.Count; i++) { object o = i; if (e.Selection.Bookmarks.get_Item(ref o).Start > startPosition) { startPosition = e.Selection.Bookmarks.get_Item(ref o).Start; } } // If closest bookmark is the sender, show the popup. if (((Word.Bookmark)sender).Start == startPosition) { selectedBookmark =

Visual C# Consolidado

1136

(Microsoft.Office.Tools.Word.Bookmark)sender; commandBar.ShowPopup(missing, missing); e.Cancel = true; } }

6.

Em C#, voc deve adicionar manipuladores de eventos para os controles do indicador ao Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
this.bookmark1.BeforeRightClick += new Microsoft.Office.Tools.Word. ClickEventHandler(showPopupMenu); this.bookmark2.BeforeRightClick += new Microsoft.Office.Tools.Word. ClickEventHandler(showPopupMenu);

Testar o aplicativo Nesta seo, voc ir testar seu documento para certificar-se de que os itens de menu negrito e itlico apaream no menu de atalho quando clicar com o boto direito do mouse texto em um indicador e o texto que est formatado corretamente. Para testar seu documento 6. 7. 8. 9. Pressione F5 para executar o projeto. Clique com o boto direito do mouse dentro do indicador e selecione Bold primeiro. Verificar se todos os o texto no bookmark1 formatados como negrito. Clique com o boto direito do mouse dentro do texto dos indicadores sobrepostos e selecione Italic.

10. Verificar se todos os o texto no bookmark2, mas somente essa parte do texto em bookmark1 que se sobreponha bookmark2 formatados como itlico. Prximas etapas Essa explicao passo a passo mostra como criar menus de atalho em indicadores. Aqui esto algumas tarefas que podem vie em seguida:

Escrever cdigo para responder a eventos de controles host no Excel. Para obter mais informaes, consulte Programao contra eventos de um controle NamedRange Walkthrough:. Use uma caixa de seleo para alterar formatao em um indicador. Para obter mais informaes, consulte Walkthrough: Changing Document formatao usando controles CheckBox.

Walkthrough: atualizando um grfico em um documento usando botes de opo


Essa explicao passo a passo demonstra os fundamentos bsicos do alterando estilos do grfico usando botes de opo em um documento do Microsoft Office Word 2003. Voc usar Microsoft Visual Studio 2005 Tools for the Microsoft Office System para criar e adicionar cdigo ao seu projeto. Para ver o resultado como uma amostra completa, consulte Exemplo de controles do Word. Durante este explicao passo a passo, voc aprender como:

Adicionar um grfico a um documento. Adicionar um controle de usurio a um documento.

Visual C# Consolidado

1137

Alterar o estilo do grfico quando uma opo est selecionada. Testar seu projeto. Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Visual Studio Tools for Office O Microsoft Office Word 2003. Criando o projeto

Nesta etapa, voc ir criar projeto usando Visual Studio Tools for Office um documento do Word. Para criar um novo projeto

Criar um projeto Documento do Word com o nome My Chart Options. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Abre o novo documento do Word no designer e adiciona o My Chart Options projeto para Solution Explorer o Visual Studio. Adicionar um grfico ao documento

Em seguida, adicione um grfico para o documento. Para adicionar um grfico 6. No menu Insert, clique em Object. A Object caixa de dilogo ser aberta. Observao Se o Insert menu no estiver visvel, voc dever primeiro clicar em dentro do documento para que ele foco. Para obter mais informaes consulte, Menus do Office no ambiente do Visual Studio. 7. Na lista Object type da guia Create New, selecione Microsoft Graph Chart e clique em OK Um grfico adicionado ao documento no ponto de insero, e a Datasheet janela exibida com alguns dados padro. 8. 9. Feche a Datasheet janela para aceite os valores padro no grfico e clique dentro do documento para mover foco fora do grfico. Clique com o boto direito do mouse no grfico e selecione Format Object.

10. Na guia Layout da caixa de dilogo, selecione Square e Format Object Clique em OK.

Visual C# Consolidado

1138

Adicionar um controle de usurio ao projeto Para adicionar um controle de usurio 4. 5. 6. Selecione o My Chart Options projeto no Solution Explorer. No menu Project, clique em Add New Item. Na caixa Add New Item de dilogo, clique User Control, nome do controle ChartOptions, e clique em Add Se o controle de usurio estiver no visvel no designer, clique duas vezes em ChartOptions no Solution Explorer. Na guia Common Controls Da arraste um Radio Button controle para o controle de usurio, e alterar as seguintes propriedades: o Toolbox, Propriedade Name Text 8. Value (Valor) columnChart Grfico de coluna

Para adicionar controles Windows Form ao controle de usurio 6. 7.

Adicionar um segundo Radio Button ao controle de usurio, e alterar as seguintes propriedades: Propriedade Name Text Value (Valor) barChart Grfico de barras

9.

Adicionar um terceiro Radio Button ao controle de usurio, e alterar as seguintes propriedades: Propriedade Name Text Value (Valor) lineChart Grfico de linha

10. Adicionar um quarto Radio Button ao controle de usurio, e alterar as seguintes propriedades: Propriedade Name Text Adicionar Referncias Value (Valor) areaBlockChart Grfico bloquear de rea

Visual C# Consolidado

1139

Para acessar o grfico do controle de usurio em um documento, voc deve ter uma referncia 11.0 biblioteca objeto do Graph Microsoft no seu projeto. Para adicionar uma referncia 11.0 biblioteca objeto do Graph Microsoft 4. 5. 6. No menu Project, clique em Add Reference. A Add Reference caixa de dilogo ser exibida. Clique na COM guia. Selecione Microsoft Graph 11.0 Object Library na lista Component Name e clique em OK Alterar o estilo grfico quando o boto de opo selecionada Nesta seo, voc ser criar um evento pblico sobre o controle de usurio, adicionar uma propriedade para definir o tipo de seleo, e criar um procedimento para o CheckedChanged evento de cada um dos botes de opo. Para criar um evento e propriedade em um controle de usurio 3. 4. No Solution Explorer, clique com o boto direito do mouse no controle de usurio e selecione View Code. Adicione cdigo para criar um SelectionChanged evento e a Selection propriedade para a ChartOptions classe: C#
public event EventHandler SelectionChanged; private Microsoft.Office.Interop.Graph.XlChartType selectedType = Microsoft.Office.Interop.Graph.XlChartType.xlColumnClustered; public Microsoft.Office.Interop.Graph.XlChartType Selection { get { return this.selectedType; } set { this.selectedType = value; } }

Para manipular o evento CheckedChange dos botes de opo 6. Definir o tipo de grfico no manipulador CheckedChanged de eventos de boto areaBlockChart de opo e depois gerar o evento. C#
private void areaBlockChart_CheckedChanged(object sender, EventArgs e) { if (((RadioButton)sender).Checked) { this.selectedType = Microsoft.Office.Interop.Graph.XlChartType.xlAreaStacked; if (this.SelectionChanged != null) { this.SelectionChanged(this, EventArgs.Empty); } } }

7.

Definir o tipo de grfico no manipulador CheckedChanged de eventos do boto barChart de opo. C#


private void barChart_CheckedChanged(object sender, EventArgs e) { if (((RadioButton)sender).Checked) { this.selectedType = Microsoft.Office.Interop.Graph.XlChartType.xlBarClustered; if (this.SelectionChanged != null) { this.SelectionChanged(this, EventArgs.Empty); } } }

8.

Definir o tipo de grfico no manipulador CheckedChanged de eventos do boto columnChart de opo. C#

Visual C# Consolidado

1140

private void columnChart_CheckedChanged(object sender, EventArgs e) { if (((RadioButton)sender).Checked) { this.selectedType = Microsoft.Office.Interop.Graph.XlChartType.xlColumnClustered; if (this.SelectionChanged != null) { this.SelectionChanged(this, EventArgs.Empty); } } }

9.

Definir o tipo de grfico no manipulador CheckedChanged de eventos do boto lineChart de opo. C#


private void lineChart_CheckedChanged(object sender, EventArgs e) { if (((RadioButton)sender).Checked) { this.selectedType = Microsoft.Office.Interop.Graph.XlChartType.xlLineMarkers; if (this.SelectionChanged != null) { this.SelectionChanged(this, EventArgs.Empty); } } }

10. Em C#, voc deve adicionar manipuladores de eventos para os botes de opo. Adicione o cdigo para o ChartOptions Construtor, sob a chamada para InitializeComponent, conforme mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
public ChartOptions() { InitializeComponent(); areaBlockChart.CheckedChanged += new EventHandler(areaBlockChart_CheckedChanged); barChart.CheckedChanged += new EventHandler(barChart_CheckedChanged); columnChart.CheckedChanged += new EventHandler(columnChart_CheckedChanged); lineChart.CheckedChanged += new EventHandler(lineChart_CheckedChanged); }

Adicionando o controle de usurio ao documento Quando voc cria a soluo, o novo controle de usurio automaticamente adicionado Toolbox. Do Toolbox Voc pode, ento, arrastar o controle de ao seu documento. Para adicionar o controle de usurio do documento 4. 5. 6. No menu Build, clique em Build Solution. O ChartOptions controle de usurio adicionado Toolbox. Clique com o boto direito do mouse ThisDocument.vb no Solution Explorer, ou ThisDocument.cs. e selecione View Designer Do Toolbox arraste o ChartOptions controle de para o documento. Um novo controle chamado ChartOptions1 adicionado ao seu projeto. Alterar o tipo de grfico Nesta seo, criar um manipulador de eventos para alterar o tipo de grfico acordo para a opo selecionada no controle de usurio. Para alterar o tipo de grfico que exibido no documento 3. Adicionar o manipulador de eventos a seguir para a ThisDocument classe. C#
private void ChartOptions1_SelectionChanged(object sender, EventArgs e) { try { //first object is the runtime storage control object index = 2; Word.Shape shape = this.Shapes.get_Item(ref index); //Activate the shape shape.Activate(); Microsoft.Office.Interop.Graph.Chart dataChart = (Microsoft.Office.Interop.Graph.Chart)shape.OLEFormat.Object; dataChart.ChartType =

Visual C# Consolidado

1141

this.ChartOptions1.Selection; //Deactivate the shape this.ChartOptions1.Select(); } catch (Exception ex) { MessageBox.Show(ex.Message); } }

4.

Em C#, adicione um manipulador de eventos para o controle de usurio para o Startup evento como mostrado abaixo. Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
this.ChartOptions1.SelectionChanged += new EventHandler(ChartOptions1_SelectionChanged);

Testar o aplicativo Agora voc pode testar seu documento para certificar-se que o estilo do grfico atualizado corretamente quando voc seleciona um boto de opo. Para testar seu documento 4. 5. 6. Pressione F5 para executar o projeto. Selecione vrios botes de opo. Confirme que o estilo do grfico altera para correspondem seleo. Prximas etapas Essa explicao passo a passo mostra noes bsicas de usando botes de opo e programaticamente alterando estilos do grfico em documentos do Word 2003. Aqui esto algumas tarefas que podem vie em seguida:

Implantando o projeto. Para obter mais informaes, consulte Como implantar solues do Office: Usando um boto para preencher uma caixa de texto. Para obter mais informaes, consulte Exibindo texto em uma caixa de texto em um documento usando um boto Walkthrough:. Alterar formatao, selecionando um estilo da caixa de combinao. Para obter mais informaes, consulte Walkthrough: Changing Document formatao usando controles CheckBox.

Vinculao de Dados para controles em um painel Aes do Word Walkthrough:


Essa explicao passo a passo demonstra vinculao de dados a controles em um painel Aes no Microsoft Office Word 2003. Os controles sero demonstram uma Relao mestre / detalhes entre tabelas em um banco de dados do SQL Server. Durante este explicao passo a passo, voc aprender como:

Criar um controle painel Aes para o painel Aes. Adicionar controles que so acoplados a dados a um controle painel Aes Windows Forms. Use uma Relao mestre / detalhes quando exibir dados nos controles. Mostrar painel de aes quando abre o aplicativo. Testar seu projeto.

Visual C# Consolidado

1142

Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Microsoft Visual Studio 2005 Tools for the Microsoft Office System O Microsoft Office Word 2003. Acesso a um servidor com o exemplo de SQL Server do Northwind. Permisses para ler e gravar no banco de dados do SQL Server. Criando o projeto

Nesta etapa, voc ir criar um projeto Documento do Word. Para criar um novo projeto

Criar um projeto Documento do Word com o nome My Word Actions Pane. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Abre o novo documento do Word no designer e adiciona o My Word Actions Pane projeto para Solution Explorer o Visual Studio. Adicionar controles ao painel de aes

Para essa explicao passo a passo, necessrio um controle painel Aes que contm controles ligados a dados Windows Forms. Adicionar uma fonte de dados para o projeto, e arraste os controles a partir da Data Sources janela para o controle painel Aes. Para adicionar um controle painel Aes 4. 5. 6. Selecione o My Word Actions Pane projeto no Solution Explorer. No menu Project, selecione Add New Item. Na caixa Add New Item de dilogo, selecione Actions Pane Control, nome-la ActionsControl, e clique em Add Se a Data Sources janela no estiver visvel, clique Show Data Sources no Data menu. Observao Se Show Data Sources Clique dentro do documento do Word e marque novamente. no estiver disponvel, 10. Clique Add New Data Source Para iniciar o Data Source Configuration Wizard. 11. Selecione Database e, em seguida clique em Next.

Para adicionar uma nova fonte de dados para o projeto 9.

Visual C# Consolidado

1143

12. Selecionar uma conexo de dados ao banco de dados de exemplo Northwind do SQL Server ou adicionar uma nova conexo com o New Connection boto. 13. Clique em Next. 14. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next. 15. Expanda o Tables n na janela Database objects. 16. Marque a caixa de seleo ao lado e Products tabelas. o Suppliers 17. Clique em Finish. O assistente adiciona a Suppliers tabela e Products Tabela janela Data Sources. Ele tambm adiciona um DataSet digitado ao seu projeto que est visvel no Solution Explorer. Para adicionar controles Windows Forms ligados a dados a um controle painel Aes 13. Na janela Data Sources, expanda a Suppliers tabela. 14. Clique na seta suspensa no n Company Name, e selecione ComboBox. 15. Arraste CompanyName da janela Data Sources para o controle painel Aes. Um ComboBox controle criado no controle painel Aes. Ao mesmo tempo, nomeado SuppliersBindingSource, um adaptador de tabela, e um DataSet so adicionados ao projeto no bandeja de componentes. um BindingSource Observao Um navegador de ligao tambm adicionado para o bandeja de componentes e para o topo do controle painel Aes. Voc remover esse controle posteriormente no explicao passo a passo o. 16. Mover a caixa de combinao para que ele seja sob o rtulo e alterar a Size propriedade 171, 21. 17. Expandir a Products tabela na janela Data Sources. 18. Clique na seta suspensa no n ProductName, e selecione ListBox. 19. Arraste ProductName para o controle painel Aes. Um ListBox controle criado no controle painel Aes. Ao mesmo tempo, chamado ProductBindingSource e um adaptador de tabela so adicionados para o projeto no bandeja de componentes. um BindingSource 20. Do SuppliersBindingNavigator Selecione na bandeja e Component pressione DELETE. Observao Excluindo o SuppliersBindingNavigator faz no remover todos os o cdigo que foi gerado para ele. Voc pode remover este cdigo. 21. Mover a caixa de listagem para que ele seja sob o rtulo e alterar a Size propriedade 171,95. 22. Arraste controlar e coloc-lo a caixa de listagem abaixo. de para o painel Aes um Button o Toolbox 23. Clique com o boto direito do mouse clique Properties no menu de atalho, e altere as seguintes propriedades: o Button,

Visual C# Consolidado

1144

Propriedade Name Text

Value (Valor) Inserir Inserir

24. Redimensionar o controle de usurio para ajustar os controles. Configurando a fonte de dados Nesta seo, voc adicionar cdigo ao Load Evento do controle painel Aes para preencher o controle com dados da DataTable. Do DataSource voc ir ento definir e DataMember propriedades para cada controle. Para carregar o controle com dados

No manipulador Load de eventos da classe ActionsControl, adicione o seguinte cdigo: C#


private void ActionsControl_Load(object sender, EventArgs e) { this.suppliersTableAdapter.Fill(this.northwindDataSet.Suppliers); this.productsTableAdapter.Fill(this.northwindDataSet.Products); }

Para definir propriedades de vinculao de dados do controle 7. 8. 9. Selecione o CompanyNameComboBox controle. Na janela Properties, clique no boto para a direita da propriedade DataSource, e selecione SuppliersBindingSource. Na janela Properties, clique no boto para a direita da propriedade DisplayMember, e selecione CompanyName.

10. Selecione o ProductNameListBox controle. 11. Na janela Properties, clique no boto para a direita da propriedade DataSource, expanda SuppliersBindingSource, e selecione FK_Products_Suppliers. 12. Na janela Properties, clique no boto para a direita da propriedade DisplayMember, e selecione ProductName. Adicionando um mtodo para inserir dados em uma tabela Nesta etapa, ser ler os dados dos controles acoplados e preencher uma tabela em seu documento do Word. Primeiro, voc ir criar um procedimento para formatar os ttulos na tabela, e seguida, voc adicionar o AddData mtodo para criar e formatar uma tabela do Word. Para formatar os ttulos de tabela

Na classe ActionsControl, crie um mtodo para formatar os ttulos da tabela. Adicione cdigo conforme mostrado no exemplo a seguir: C#
static void SetHeadings(Microsoft.Office.Interop.Word.Cell tblCell, string text) { tblCell.Range.Text = text; tblCell.Range.Font.Bold = 1; tblCell.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter; }

Visual C# Consolidado

1145

Para criar a tabela

Na classe ActionsControl, escreva no um mtodo que criar uma tabela se um no existir, e adicionar dados a partir do painel Aes tabela. Adicione cdigo conforme mostrado no exemplo a seguir. C#
private void AddData(DataRow row, string companyName) { object missing = System.Type.Missing; // Create a table if it doesn't already exist. if (Globals.ThisDocument.Tables.Count == 0) { try { // Create a table. Microsoft.Office.Interop.Word.Table tbl = Globals.ThisDocument.Tables.Add (Globals.ThisDocument.Application.Selection.Range, 1, 4, ref missing, ref missing); // Insert headings. SetHeadings(tbl.Cell(1, 1), "Company Name"); SetHeadings(tbl.Cell(1, 2), "Product Name"); SetHeadings(tbl.Cell(1, 3), "Quantity"); SetHeadings(tbl.Cell(1, 4), "Unit Price"); } catch (Exception ex) { MessageBox.Show("Problem creating Products table: " + ex.Message, "Actions Pane", MessageBoxButtons.OK, MessageBoxIcon.Error); } } // Add data from data row to the table. Microsoft.Office.Interop.Word.Selection selection = Globals.ThisDocument.Application.Selection; if (selection.Tables.Count > 0) { Microsoft.Office.Interop.Word.Row newRow = Globals.ThisDocument.Tables[1].Rows.Add(ref missing); newRow.Range.Font.Bold = 0; newRow.Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft; newRow.Cells[4].Range.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphRight; newRow.Cells[1].Range.Text = companyName; newRow.Cells[2].Range.Text = row["ProductName"].ToString(); newRow.Cells[3].Range.Text = row["QuantityPerUnit"].ToString(); newRow.Cells[4].Range.Text = Math.Round(Convert.ToDouble(row["UnitPrice"])).ToString("#,##0.00"); } else { MessageBox.Show("Cursor must be within a table.", "Actions Pane", MessageBoxButtons.OK, MessageBoxIcon.Error); } }

Para inserir texto em uma tabela do Word 2. No manipulador Click de eventos do boto Insert, adicione cdigo conforme mostrado no exemplo o seguir: Observao Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
private void Insert_Click(object sender, System.EventArgs e) { DataTable tbl = northwindDataSet.Products; DataRow[] rows; // Check if a product is selected. if (this.productNameListBox.SelectedIndex >= 0) { DataRowView productRow =(System.Data.DataRowView)this.productNameListBox.SelectedItem; string product = productRow.Row["ProductName"].ToString(); string company = this.companyNameComboBox.Text; // Return the data row from the selected product. rows = tbl.Select("ProductName = '" + product.Replace("'", "''") + "'"); this.AddData(rows[0], company); } else { MessageBox.Show("Please select a product.", "Actions Pane", MessageBoxButtons.OK); } }

Visual C# Consolidado

1146

3.

Em C#, voc deve criar um manipulador de eventos para o Click Evento do boto. Voc pode colocar este cdigo no manipulador Load de eventos da classe ActionsControl. Para obter mais informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:. C#
this.Insert.Click += new EventHandler(Insert_Click);

Mostrando o Painel de Aes Voc nesta seo, vai escrever cdigo para mostrar o painel Aes. O painel Actions ficar visvel depois controles so adicionados a ele. Para mostrar o painel Aes 2. 3. Clique com o boto direito do mouse ThisDocument.vb no Solution Explorer, ou ThisDocument.cs,. e, em seguida clique View Code no menu de atalho Criar uma nova instncia do controle na parte superior da classe ThisDocument de forma que ele tenha como no exemplo a seguir: C#
private ActionsControl actions = new ActionsControl();

4.

Adicione cdigo ao manipulador Startup de eventos de ThisDocument forma que ele tenha como no exemplo a seguir: Observao Para obter informaes sobre como criar manipuladores de eventos, consulte Como criar manipuladores de eventos em Ferramentas do Visual Studio do Office:.

C#
this.ActionsPane.Controls.Add(actions);

Testar o aplicativo Agora voc pode testar seu documento para certificar-se que o painel Aes aberto quando o documento for aberto. Teste para a relao mestre / detalhes nos controles no painel Aes, e certifique-se que dados so preenchidos em uma tabela do Word quando o Insert boto clicado. Para testar seu documento 6. 7. 8. 9. Pressione F5 para executar o projeto. Confirme se o painel Actions est visvel. Selecione uma empresa na caixa de combinao e verifique que os itens na caixa Products Lista alterar. Selecione um produto, clique Insert no painel de aes, e verifique se os detalhes do produto foram adicionados tabela no Word. Prximas etapas Essa explicao passo a passo mostra as noes bsicas de vinculao de dados a controles em um painel Aes no Word. Aqui esto algumas tarefas que podem vie em seguida:

10. Inserir outros produtos de vrias empresas.

Visual C# Consolidado

1147

Implantando o projeto. Para obter mais informaes, consulte Como implantar solues do Office:. Ligao de dados a controles no Excel. Para obter mais informaes, Vinculao de Dados para controles em um painel Aes do Excel Walkthrough:. Mostrar e ocultar controles no painel de aes. Para obter mais informaes, consulte Alterando o painel de aes de acordo com contexto do usurio Walkthrough:

Walkthrough: criar uma marca inteligente que converte Temperatures de Fahrenheit para Celsius
Essa explicao passo a passo demonstra criar uma marca inteligente que reconhece Fahrenheit seqncias de temperatura. A marca inteligente inclui uma ao que converte o valor de temperatura em Celsius, e substitui o texto reconhecido por um Celsius formatado Seqncia de temperatura. Durante este explicao passo a passo, voc aprender como:

Criar uma marca inteligente que reconhece uma expresso regular. Criar uma ao que recupera dados da marca inteligente e modifica o texto de reconhecido marca inteligente. Pr-requisitos

Para concluir esta explicao passo a passo, ser necessrio:


Microsoft Visual Studio 2005 Tools for the Microsoft Office System O Microsoft Office Word 2003. Criando um novo projeto

Nesta etapa, voc ir criar um projeto Documento do Word. Para criar um novo projeto

Criar um projeto Documento do Word com o nome My Smart Tag, usando o Visual Basic ou C#. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

Abre o novo documento do Word no designer e adiciona o My Smart Tag projeto para Solution Explorer o Visual Studio. Configurando o projeto Para esta etapa, voc ir configurar o projeto para executar o cdigo fornecido nessa explicao passo a passo. Para configurar seu projeto 5. 6. 7. 8. No menu Project, clique em Add Reference. Na guia COM, selecione biblioteca tipo 2.0 marcas inteligentes Microsoft e clique em OK. No Solution Explorer, clique com o boto direito do mouse ThisDocument.vb (em Visual Basic) ou ThisDocument.cs (em C#) e clique em View Code. Adicione a seguinte linha de cdigo para o topo do arquivo:

Visual C# Consolidado

1148

C#
using System.Text.RegularExpressions;

Criando a marca inteligente Nesta etapa, voc ser criar uma Visual Studio Tools for Office marca inteligente e adicion-lo para o documento. Tambm ir adicionar uma expresso regular para a lista de termos que reconhece a marca inteligente, e criar uma ao que estar disponvel quando o usurio clica a marca inteligente. Para criar a marca inteligente 4. Substituir manipulador ThisDocument_Startup de eventos na classe ThisDocument pelo cdigo a seguir. Este cdigo cria uma SmartTag que representa a Visual Studio Tools for Office marca inteligente, e adiciona uma expresso regular para a lista de termos que reconhece a marca inteligente. C#
private Microsoft.Office.Tools.Word.Action action1; private void ThisDocument_Startup(object sender, System.EventArgs e) { Microsoft.Office.Tools.Word.SmartTag smartTag1 = new Microsoft.Office.Tools.Word.SmartTag( "www.microsoft.com/Demo#DemoSmartTag", "Demonstration Smart Tag"); smartTag1.Expressions.Add(new Regex( @"(?'number'[+-]?\b[09]+)?\s?(F|f)\b"));

5.

Criar uma nova Action e adicion-lo para a Actions propriedade da marca inteligente. A Action representa um item que o usurio pode clicar no menu de marcas inteligentes. C#
action1 = new Microsoft.Office.Tools.Word.Action( "Convert to Celsius"); smartTag1.Actions = new Microsoft.Office.Tools.Word.Action[] {action1};

6.

Do SmartTag anexar a marca inteligente para o documento, adicionando propriedade VSTOSmartTags. Na C#, anexar um manipulador de eventos para o Click evento da ao. C#
this.VstoSmartTags.Add(smartTag1); action1.Click += new Microsoft.Office.Tools.Word.ActionClickEventHandler( action1_Click); }

Criar um manipulador de eventos para a ao Nesta etapa, voc ir adicionar um manipulador de eventos para o Click evento da ao. O manipulador de eventos recupera o Fahrenheit valor de temperatura da chave number, que est no conjunto de propriedades da marca inteligente. O manipulador de eventos converte o Fahrenheit valor de temperatura para Celsius,. e substitui a seqncia reconhecido Neste exemplo, a chave number identifica um grupo capturado da expresso regular atribudo a marca inteligente. Para obter mais informaes sobre propriedade Sacos e expresses regulares em Visual Studio Tools for Office marcas inteligentes, consulte Arquitetura marcas inteligentes. Para criar o manipulador de eventos

Copie o cdigo a seguir para a ThisDocument classe: C#


void action1_Click(object sender, Microsoft.Office.Tools.Word.ActionEventArgs e) { string value = e.Properties.get_Read("number"); double fahrenheit = Convert.ToDouble(value); int celsius = (int)(fahrenheit - 32) * 5 / 9; e.Range.Text = celsius.ToString() + "C"; }

Visual C# Consolidado

1149

Testar o aplicativo Agora voc pode testar seu documento para certificar-se que a marca inteligente converte Fahrenheit temperaturas para Celsius. Para testar sua pasta de trabalho 5. 6. Pressione F5 para executar o projeto. Digitar uma seqncia que esteja de acordo com a expresso regular adicionado marca inteligente, como 60F, 60 F,. ou 60 F Observao Para digitar um smbolo de grau (), pressione ALT e digite 248. 7. 8. Clique no cone de marca inteligente que aparece sobre a seqncia reconhecida e clique em Convert to Celsius. Confirme que a seqncia original substituda por uma nova seqncia contendo a temperatura em Celsius.

Implantando um Word ou Solution do Excel usando um manifesto Deployment Walkthrough:


Essa explicao passo a passo demonstra como implantar uma soluo o Microsoft Office Excel ou Microsoft Office Word em um compartilhamento de rede em um servidor. Ser posicionado no final do explicao passo a passo, o possvel para executar a soluo no servidor do seu computador de desenvolvimento. Em um ambiente de produo, uma Microsoft Visual Studio 2005 Tools for the Microsoft Office System soluo geralmente publicada primeiro a um servidor de teste, e depois ele reimplantado em um servidor de produo depois que o departamento de TI aprovar-. Voc nessa explicao passo a passo, ser emular esse processo, publicando uma soluo em um local temporrio no seu computador de desenvolvimento, e ento redeploying a soluo do local de publicao para um servidor. Para obter mais informaes sobre as opes para implantar a soluo, consulte Modelos de implantao. Durante este explicao passo a passo, voc aprender como:

Do Publish Wizard uso para publicar sua soluo em um local no seu computador de desenvolvimento. Manualmente relanamento a soluo do seu computador local para um compartilhamento de rede em um servidor. Modificar o manifesto do aplicativo que est incorporado no documento para apontar para o novo local manifesto de implantao programaticamente. Editar a manifesto de implantao para apontar para a nova localizao do manifesto do aplicativo externos. Editar o manifesto do aplicativo externo para apontar para o novo local do conjunto e a manifesto de implantao. Pr-requisitos

Para concluir esta explicao passo a passo, ser necessrio:

Visual C# Consolidado

1150

Visual Studio Tools for Office O Word Microsoft Office 2003 ou Microsoft Office Excel 2003. Observao Essa explicao passo a passo pressupe que voc estiver implantando uma soluo Word. Se voc quiser executar explicao passo a passo com uma soluo Excel, o substitua o nome do projeto do Word com o nome do seu projeto do Excel em todos os cdigos e exemplos XML.

Acesso a um servidor de rede para implantao. Essa explicao passo a passo pressupe que voc so redeploying sua soluo para o \\DeployServer\ShareFolder compartilhamento de rede. Privilgios de administrador no computador de desenvolvimento, para que voc possa definir a diretiva de segurana para um local de rede. Criando o projeto

Nesta etapa, voc ir criar um projeto Documento do Word. Para criar um novo projeto

Criar um projeto Documento do Word com o nome WordDeployment. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

Abre o novo documento do Word no designer e adiciona o WordDeployment projeto para Solution Explorer o Visual Studio. Adicionar cdigo para trs o documento Nesta etapa, voc adicionar uma caixa de mensagem ao manipulador Startup de eventos do documento. Isso permitir que voc para verificar se a soluo est funcionando quando voc abre o documento rapidamente. Para adicionar uma caixa de mensagem a um evento de inicializao 6. 7. Clique com o boto direito do mouse ThisDocument.vb no Solution Explorer, ou ThisDocument.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo ao manipulador Startup de eventos dentro a ThisDocument classe para mostrar uma caixa de mensagem durante a inicializao. C#
private void ThisDocument_Startup(object sender, System.EventArgs e) { MessageBox.Show("The document is deployed correctly."); }

8. 9.

Pressione F5 para executar o projeto. Inicia o Word e a caixa de mensagem aparece. Fechar a caixa de mensagem.

10. Sair do Word. Em seguida, voc publicar nesta soluo. Publicando a soluo

Visual C# Consolidado

1151

Nesta etapa, voc publicar a soluo em um local temporrio no computador local. Para publicar a soluo 6. 7. 8. 9. Clique com o boto direito do mouse o n de projeto no Solution Explorer. Clique Publish no menu de atalho. O Publish Wizard aparece. Na caixa Specify the location to publish this application, digite C:\TestDeploy. Clique em Finish. O documento de Soluo e manifesto de implantao so copiados para C:\TestDeploy. O conjunto de soluo, atualizado manifesto do aplicativo, e cpias do documento de Soluo e manifesto de implantao so copiadas para C:\TestDeploy\WordDeployment_1.0.0.0. Para obter mais informaes, consulte Implantando o Word e Excel Solutions. 10. Feche o WordDeployment projeto no Visual Studio. Observao O conjunto no tem permisso para executar ainda, para que ele se voc tentar executar a soluo ser lanar um erro. Voc ir atualizar sua diretiva de segurana para conceder permisso de confiana total ao conjunto em uma etapa posterior. Quando voc publicar uma soluo, o manifesto do aplicativo incorporado no aponta de documento de soluo para o caminho completo da manifesto de implantao. Se voc relanamento os arquivos de soluo para outro local, dever atualizar o manifesto do aplicativo incorporado para apontar para a nova localizao da manifesto de implantao. Voc tambm deve atualizar a manifesto de implantao e o manifesto do aplicativo externo para apontar para os novos locais de arquivo. Atualizando o manifesto Application incorporados Para editar o manifesto do aplicativo incorporado, use a ServerDocument classe que Visual Studio Tools for Office fornece. Quando voc usa a ServerDocument classe, voc deve executar o cdigo em um novo projeto (no a Visual Studio Tools for Office Soluo), como um projeto de console, e o Visual Studio Tools for Office documento de soluo deve ser fechado. Observao Inclui Visual Studio Tools for Office um exemplo que demonstre como criar uma ferramenta que pode ser usada para editar o manifesto do aplicativo incorporado. Para obter mais informaes, consulte Aplicativo Manifest exemplo Editor. Para atualizar o manifesto do aplicativo incorporado 6. 7. 8. Criar um novo projeto Console Application. Do Microsoft.VisualStudio.Tools.Applications.Runtime Adicionar referncias para e System.Windows.Forms montagens para este projeto. Abra o arquivo Program.cs ou Module1.vb, e adicione a seguinte Imports ou using instruo para o topo do arquivo. C#

Visual C# Consolidado

1152

using Microsoft.VisualStudio.Tools.Applications.Runtime;

9.

Copie o cdigo a seguir para a Main funo. Este cdigo cria uma ServerDocument que fornece acesso ao manifesto do aplicativo incorporado de seu documento de soluo. O cdigo atribui o novo caminho manifesto de implantao para a DeployManifestPath propriedade, e salva e fecha o ServerDocument.. o ServerDocument C#
ServerDocument sd = null; try { sd = new ServerDocument(@"C:\TestDeploy\WordDeployment.doc"); sd.AppManifest.DeployManifestPath = @"\\DeployServer\ShareFolder\WordDeployment.application"; sd.Save(); } finally { if (sd != null) { sd.Close(); } }

10. Pressione F5 para executar o projeto. Uma janela do console aparece rapidamente enquanto o manifesto do aplicativo incorporado est sendo atualizado, e fecha a janela do console. Atualizando o manifesto de implantao Agora que voc atualizou o manifesto do aplicativo incorporado no documento Visual Studio Tools for Office de soluo, voc deve atualizar a manifesto de implantao para apontar para a nova localizao do manifesto do aplicativo externos. Para atualizar a manifesto de implantao 4. Abra a manifesto de implantao em um editor de texto, como o Bloco de notas. A manifesto de implantao denominado WordDeployment.application, e est localizado na pasta C:\TestDeploy de publicao. Defina o codebase atributo do elemento <dependentAssembly> como o caminho completo da localizao implantao final do manifesto do aplicativo externos. Para obter mais informaes, consulte &lt;dependentAssembly&gt; Element (Visual Studio Tools for Office Reference).O atributo para essa explicao passo a passo deve aspecto como este:
<dependentAssembly codebase="\\DeployServer\ShareFolder\ WordDeployment_1.0.0.0\WordDeployment.dll.manifest"

5.

6.

Salve e feche o arquivo manifesto de implantao. Atualizando o manifesto de aplicativos externos

Alm disso, para atualizar a manifesto de implantao, voc tambm deve editar o manifesto do aplicativo externo para apontar para os locais implantao final do conjunto de soluo e a manifesto de implantao. Sempre que voc publicar uma Visual Studio Tools for Office soluo, um novo manifesto do aplicativo externo gerado que aponta para a verso atual do conjunto de soluo. Para atualizar o manifesto do aplicativo externo 5. Abra o manifesto do aplicativo em um editor de texto, como o Bloco de notas. O manifesto do aplicativo denominado WordDeployment.dll.manifest, e est localizado na pasta C:\TestDeploy\WordDeployment_1.0.0.0 de publicao. Localize o <installFrom> elemento que est o filho do elemento <dependency>, e defina o codebase atributo como o caminho completo da montagem de soluo atual. Para obter mais informaes, consulte <installFrom> Element (Visual Studio Tools for Office Reference).O atributo para essa explicao passo a passo deve aspecto como este:
<dependentAssembly codebase="\\DeployServer\ShareFolder\ WordDeployment_1.0.0.0\WordDeployment.dll"

6.

Visual C# Consolidado

1153

7.

Localize o <installFrom> elemento que est o filho do elemento <assembly>, e defina o codebase atributo para o caminho completo do manifesto de implantao. Para obter mais informaes, consulte <installFrom> Element (Visual Studio Tools for Office Reference).O atributo para essa explicao passo a passo deve aspecto como este:
<dependentAssembly codebase="\\DeployServer\ShareFolder\WordDeployment.application"

8.

Salve e feche o arquivo manifesto do aplicativo. Copiando os arquivos da soluo para o servidor

Agora que voc tiver editado os manifestos, voc est pronto para copiar os arquivos de soluo para o servidor. Para copiar os arquivos de soluo para o servidor 4. 5. 6. Crie uma WordDeployment_1.0.0.0 pasta sob a \\DeployServer\ShareFolder compartilhamento de arquivos de rede. Copiar o documento de Soluo e a manifesto de implantao para \\DeployServer\ShareFolder. Copiar o conjunto de soluo e o manifesto do aplicativo para \\DeployServer\ShareFolder\WordDeployment_1.0.0.0. Conceder confiana total para a pasta de rede Para execute sua Visual Studio Tools for Office soluo a partir da pasta de rede, voc deve conceder confiana total para a pasta de rede na sua diretiva de segurana no computador de desenvolvimento. Voc pode modificar a diretiva de segurana de um prompt de comando usando a ferramenta Diretiva de Segurana para Acesso ao Cdigo (Caspol.exe). Para conceder confiana para um local de rede, voc deve ter privilgios de administrador e voc dever alterar a diretiva de segurana no nvel do computador. Observao Este procedimento destinado a fim de executar essa explicao passo a passo. No use este procedimento para conceder confiana a conjuntos ou diretrios se no tiver certeza que sejam segura e protegida. Para obter mais informaes sobre concesso e remover permisses, consulte HOW TO: conceder permisses para pastas e montagens e Como remover permisses de pastas e montagens:. Para conceder confiana total para a pasta de rede

Digite o seguinte comando no prompt de comando Studio visual:


caspol -m -ag LocalIntranet_Zone -url \\DeployServer\ShareFolder\* FullTrust -n "Remote Deployment" -d "Deployment Walkthrough"

Testando a soluo Agora voc pode testar sua soluo para certificar-se que seu cdigo seja executado quando voc abre o documento a partir do computador de desenvolvimento. Para testar a implantao 3. 4. No computador de desenvolvimento, abra o WordDeployment.doc arquivo no \\DeployServer\ShareFolder\. Confirme se a caixa de mensagem aparece.

Visual C# Consolidado

1154

Prximas etapas Voc tambm pode implantar a soluo usando um arquivo do Microsoft Windows Installer (.msi). Para obter mais informaes, consulte Implantando um Word ou Solution do Excel usando um arquivo do Windows Installer Walkthrough:.

Implantando um Word ou Solution do Excel usando um arquivo do Windows Installer Walkthrough:


Essa explicao passo a passo demonstra como criar um arquivo do Microsoft Windows Installer (.msi) que pode ser usado para implantar uma soluo Microsoft Office Excel 2003 ou Microsoft Office Word 2003. Durante este explicao passo a passo, voc aprender como:

Criar um projeto de instalao que voc pode usar para criar um arquivo do Windows Installer. Modifique o projeto de instalao para que o arquivo Windows Installer instala sua Microsoft Visual Studio 2005 Tools for the Microsoft Office System soluo. Adicionar uma etapa para o projeto de instalao para que Arquivo do Windows Installer edita o manifesto do aplicativo incorporados no Visual Studio Tools for Office documento de soluo.

Essa explicao passo a passo pressupe que o computador de destino j tiver os pr-requisitos instalados para executar Visual Studio Tools for Office solues. Voc cria o arquivo Windows Installer no o verificar ou instalar esses pr-requisitos. Para obter mais informaes sobre os prrequisitos para executar Visual Studio Tools for Office solues, consulte Como se preparar computadores de usurio final para executar solues do Office:. Observao Conjuntos em Visual Studio Tools for Office Solues devem ser concede confiana total na diretiva de segurana do usurio final antes da soluo seja executado. O arquivo Windows Installer voc criar nessa explicao passo a passo no No implantar a diretiva de segurana necessrio para executar a soluo. Para obter mais informaes sobre segurana em Visual Studio Tools for Office solues, consulte Requisitos de segurana para executar solues do Office e Prticas recomendadas para segurana no Office Solutions. Para obter informaes sobre como configurar a diretiva de segurana por usurio final computadores, consulte Implantao de diretiva de segurana. Pr-requisitos Para concluir esta explicao passo a passo, ser necessrio:

Visual Studio Tools for Office O Word Microsoft Office 2003 ou Microsoft Office Excel 2003. Observao Essa explicao passo a passo inclui etapas para criar uma soluo simples que voc pode usar em explicao passo a passo o Excel. Se voc deseja executar o explicao passo a passo com

Visual C# Consolidado

1155

uma soluo Word ou Excel existente, comearo o explicao passo a passo no ttulo criando o Project a instalao, " " e certifique-se substituir o nome ExcelDeployment do projeto com o nome do seu projeto em todos os exemplos de cdigo e instrues. Criando o projeto Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel. Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome ExcelDeployment. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o ExcelDeployment projeto para Solution Explorer. Adicionar cdigo para trs a pasta de trabalho Nesta etapa, voc adicionar uma caixa de mensagem ao manipulador Startup de eventos da pasta de trabalho. Isso permite que voc para verificar se a soluo est funcionando quando voc abre o documento rapidamente. Para adicionar uma caixa de mensagem a um evento de inicializao 6. 7. Clique com o boto direito do mouse ThisWorkbook.vb no Solution Explorer, ou ThisWorkbook.cs,. e, em seguida clique View Code no menu de atalho Adicione o seguinte cdigo ao manipulador Startup de eventos dentro a ThisWorkbook classe para mostrar uma caixa de mensagem durante a inicializao. C#
private void ThisWorkbook_Startup(object sender, System.EventArgs e) { MessageBox.Show("The workbook is deployed successfully."); }

8. 9.

Pressione F5 para executar o projeto. O Excel iniciado e aparecer a caixa de mensagem. Fechar a caixa de mensagem.

10. Saia do Excel. Em seguida, voc adicionar um projeto de instalao para sua soluo. Criar um projeto de instalao Nesta etapa, voc ir criar um projeto de instalao que voc pode compilar para criar um arquivo do Windows Installer para sua soluo. Para obter mais informaes, consulte Configurar projetos. Para criar um projeto de instalao para a soluo 7. 8. 9. Clique com o boto direito do mouse no n na Solution Explorer soluo. Aponte para Add no menu de atalho, e clique em New Project. A Add New Project caixa de dilogo ser exibida. No painel Project types, expanda Other Project types e selecione Setup and Deployment.

Visual C# Consolidado

1156

10. No painel Templates, selecione Setup project. 11. Nome do projeto ExcelSetup. 12. Clique em OK. O projeto instalao aparece no Solution Explorer. Por padro, o arquivo que voc ir criar usando este projeto instalao Windows Installer inclui uma caixa de dilogo que permite ao usurio final que especifique o local de instalao da soluo. Para obter mais informaes, consulte Caixa de dilogo interface do usurio da pasta de instalao. Adicionar o pasta de trabalho e assembly da soluo para o Project da instalao Nesta etapa, voc adicionar a sada do projeto ExcelDeployment principal para o projeto de instalao. A sada do projeto ExcelDeployment principal consiste de pasta de trabalho e o conjunto de soluo. Para adicionar o documento e conjunto ao projeto de instalao 10. Clique com o boto direito do mouse no ExcelSetup project n em Solution Explorer. 11. Selecione View no menu de atalho, e depois clique em File System. 12. Clique com o boto direito do mouse Application Folder no painel esquerdo. 13. Aponte para Add no menu de atalho, e clique em Project Output. 14. Selecione ExcelDeployment na caixa Project. 15. Selecione Primary output na lista de tipos de sada. 16. Clique em OK. A sada do projeto e dependncias aparecem no painel direito. 17. No Solution Explorer, expanda Detected Dependencies sob o ExcelSetup n de projeto. 18. Clique com boto direito mouse cada dependncia, exceto para Microsoft .NET Framework, e clique Exclude no menu de atalho. Criar um projeto de ao personalizada Nesta etapa, voc ir criar um projeto que contm aes personalizadas para o projeto de instalao. Aes personalizadas so um recurso do Windows Installer que permitem a voc para executar cdigo no final de uma instalao para executar aes que no podem ser executadas durante a instalao. Para obter mais informaes, consulte Aes Personalizadas. Para criar um projeto ao personalizada 8. 9. Clique com o boto direito do mouse no n na Solution Explorer soluo. Aponte para Add no menu de atalho, e clique em New Project. A Add New Project caixa de dilogo ser exibida. 10. No painel Project types, expanda o n para a linguagem de programao, e selecione Windows. 11. No painel Templates, selecione Class Library. 12. Nome do projeto ExcelCustomAction. 13. Clique em OK. O novo projeto aparece na Solution Explorer.

Visual C# Consolidado

1157

14. No Solution Explorer, clique com o boto direito do mouse Class1.vb ou Class1.cs sob o ExcelCustomAction projeto e, em seguida, clique em Delete. Este arquivo desnecessrio para essa explicao passo a passo. Criar uma ao personalizada que salvas o manifesto de aplicativo Quando voc executava seu projeto anteriormente nessa explicao passo a passo pelo pressionamento F5, a processo de criao editado o manifesto do aplicativo incorporado na pasta de trabalho para aponte para o caminho relativo do conjunto. Se a pasta de trabalho e o conjunto permanecer na mesma pasta aps a instalao, ento voc no precisam modificar o manifesto do aplicativo incorporado, e voc pode ignorar esta seo. No entanto, se voc quiser que o usurio possa mover a pasta de trabalho para uma pasta diferente aps a instalao, voc deve editar o manifesto do aplicativo para apontar para o caminho completo da montagem. Voc deve atualizar o manifesto do aplicativo que est incorporado no Visual Studio Tools for Office documento de Soluo ao executar uma ao personalizada aps a instalao, porque o local do conjunto de soluo desconhecido at que o usurio especifica o local durante a instalao. Editar o manifesto do aplicativo incorporado, usando a ServerDocument classe. Para usar a ServerDocument classe no projeto de instalao, adicione cdigo para uma Installer classe dentro do projeto ao personalizada. Para criar uma ao personalizada que edita o manifesto do aplicativo 9. Clique com o ExcelCustomAction projeto no Solution Explorer. A Add New Item caixa de dilogo ser exibida. 11. Selecionar Installer Class, e nome da classe ManifestEditor. 12. Adicione uma referncia ao conjunto Microsoft.VisualStudio.Tools.Applications.Runtime para o ExcelCustomAction projeto. 13. Do ManifestEditor.cs clique com o boto direito do mouse no Solution Explorer, ou ManifestEditor.vb arquivo e clique em View Code. 14. Adicione a instruo seguinte Imports ou using para o topo do arquivo de cdigo. C#
using Microsoft.VisualStudio.Tools.Applications.Runtime;

10. Aponte para Add no menu de atalho, e clique em New Item.

15. Copie o cdigo a seguir para a ManifestEditor classe. Esse cdigo substitui o Install mtodo, que usado para executar aes Instalao personalizada. O cdigo define o local de instalao especificado pelo usurio para a AssemblyPath propriedade. O caminho de instalao especificado pelo usurio e os nomes do documento e conjunto so obtidas a partir da Parameters propriedade. C#
// Override the Install method to update the customization location // in the application manifest. public override void Install(System.Collections.IDictionary stateSaver) { UpdateApplicationManifest(); base.Install(stateSaver); } // Update the application manifest according to the the install location. private void UpdateApplicationManifest() { // Get the parameters passed to the task. string targetDir = this.Context.Parameters["targetdir"]; string documentName = this.Context.Parameters["documentname"]; string assemblyName = this.Context.Parameters["assemblyname"]; // Get the application manifest from the document. string documentPath = System.IO.Path.Combine(targetDir, documentName); ServerDocument serverDocument1 = new ServerDocument(documentPath, System.IO.FileAccess.ReadWrite); try { AppManifest appManifest1 = serverDocument1.AppManifest; string assemblyPath =

Visual C# Consolidado

1158

System.IO.Path.Combine(targetDir, assemblyName); appManifest1.Dependency.AssemblyPath = assemblyPath; serverDocument1.Save(); } finally { if (serverDocument1 != null) { serverDocument1.Close(); } } }

16. Clique com o ExcelCustomAction projeto no Solution Explorer, e, em seguida clique em Build. Adicionando a ao personalizada ao projeto de instalao Nesta etapa, voc adicionar a sada do projeto ExcelCustomAction principal para o projeto de instalao. Isso permite que o arquivo Windows Installer para executar a ao personalizada que edita o manifesto do aplicativo. Para adicionar a sada primria do projeto ao personalizada ao projeto de instalao 12. Clique com o boto direito do mouse no ExcelSetup project n em Solution Explorer. 13. Aponte para View no menu de atalho, e clique em Custom Actions. 14. O Custom Actions Editor, clique com boto direito no n e Install Clique em Add Custom Action. 15. Na caixa Look In Selecionar Application Folder, e clique em Add Output 16. Selecione ExcelCustomAction na caixa Project. 17. Selecione Primary output na lista de tipos de sada, e depois clique em OK. 18. Verifique que Primary output from ExcelCustomAction (Active) foi adicionado lista de sadas primria para o projeto de instalao e clique em OK 19. Em expandir Install. o Custom Actions Editor, 20. Clique com o boto direito do mouse Primary output from ExcelCustomAction (Active) e, em seguida clique em Properties Window. 21. Na janela Properties, defina a CustomActionData propriedade para a seguinte seqncia:
/targetdir="[TARGETDIR]/" /documentname="ExcelDeployment.xls" /assemblyname="ExcelDeployment.dll"

Para obter informaes sobre a CustomActionData propriedade, consulte Propriedade CustomActionData. 22. Clique com o boto direito do mouse e, em seguida clique em Build. Em Solution Explorer, o ExcelSetup project Teste a instalao Agora voc pode testar a soluo para garantir que sua soluo instalada quando voc executar o arquivo do Windows Installer no seu computador de desenvolvimento. Para testar a instalao 5. 6. 7. 8. Clique com o boto direito do mouse e, em seguida clique em Run. Em Solution Explorer, o ExcelSetup project Siga as instrues no Assistente de Instalao, e especificar uma pasta de instalao no seu computador de desenvolvimento. Abrir a pasta de trabalho do Excel a partir da pasta de instalao. Confirme se a caixa de mensagem aparece.

Visual C# Consolidado

1159

Passo-a-passo: Concedendo e removendo permisses para uma soluo do Office


Essa explicao passo a passo demonstra as noes bsicas de segurana no Microsoft Visual Studio 2005 Tools for the Microsoft Office System. Durante este explicao passo a passo, voc aprender como:

Remova a configurao de segurana padro. Adicionar um novo conjunto de permisses. Testar seu projeto. Pr-requisitos

Para concluir esta explicao passo a passo, ser necessrio:


Visual Studio Tools for Office Microsoft Office Excel 2003. Criando o projeto

Nesta etapa, voc ir criar um projeto de pasta de trabalho do Excel. Para criar um novo projeto

Criar um projeto de pasta de trabalho do Excel com o nome My Security Test. Verifique que Create a new document est selecionada. Para obter mais informaes, consulte Como criar Ferramentas do Visual Studio para projetos do Office:.

O Visual Studio abre a nova pasta de trabalho do Excel no designer e adiciona o My Security Test projeto para Solution Explorer. Adicionar cdigo para trs a planilha Nesta etapa, voc adicionar uma caixa de mensagem a um evento de inicializao da planilha. Para adicionar uma caixa de mensagem a um evento de inicializao 12. Verifique se a My Security Test.xls pasta de trabalho aberta no designer visual studio, com Sheet1 exibido. 13. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs,. e, em seguida clique View Code no menu de atalho 14. Adicione o seguinte cdigo para o Startup mtodo dentro classe Sheet1 para mostrar uma caixa de mensagem durante a inicializao. C#
private void Sheet1_Startup(object sender, System.EventArgs e) { MessageBox.Show("Security settings are correct."); }

15. No menu File, clique em Save All. 16. Na caixa Save Project de dilogo, digite C:\Walkthroughs na caixa Location. 17. Clique em Save. 18. Pressione F5 para executar o projeto.

Visual C# Consolidado

1160

O Excel iniciado e aparecer a caixa de mensagem. 19. Fechar a caixa de mensagem. 20. Feche o Excel. 21. No designer do Visual Studio, localize e selecione na guia para My Security Test.xls. 22. Feche My Security Test.xls (a superfcie do design de planilha Excel) no designer do Visual Studio. Feche todos os instncias do Excel antes de alterar a diretiva de segurana. Quando voc criado o projeto de pasta de trabalho do Excel, o assistente adicionado um novo grupo de cdigo de segurana e um grupo de cdigos filho diretiva de segurana Runtime no nvel do usurio. Em seguida, voc remover o grupo de cdigos que criou o assistente. Remover o grupo de cdigos padro Localize e remova o grupo de cdigo padro que foi criado. Para remover um grupo de cdigos 9. No Painel de Controle, abra Administrative Tools. 10. Executar Microsoft .NET Framework 2.0 Configuration. 11. No modo de exibio de rvore no lado esquerdo, expanda .NET Framework 2.0 Configuration,, expandir Runtime Security Policy, expandir User, expandir Code Groups, Expandido All_Code e My Computer expanda VSTOProjects. No um GUID para cada projeto tenha criado. Expanda cada GUID para ver o caminho para o documento associado. 12. Clique com o boto direito do mouse o GUID de C:\Walkthroughs\My Security Test\My Security Test\bin\My Security Test.xls grupo de cdigos, e, em seguida clique Delete no menu de atalho. Ser exibida uma caixa de dilogo perguntando se voc tiver certeza que deseja excluir este grupo de cdigos. 13. Clique em Yes. 14. Voltar para Visual Studio, e pressione F5 para executar o projeto meu teste de segurana. Ser exibida informando a atual poltica de segurana .NET permite que no no que a personalizao para executar uma mensagem de erro. 15. Clique em OK. 16. Feche o Excel. O conjunto no pode ser executado se ele no tiver permisso explcita na Diretiva de Segurana Microsoft .NET. Em seguida, conceda permisso para o conjunto usando um nome forte em vez de uma URL para prova. Dando um nome de alta segurana para o conjunto Um nome forte geralmente mais seguro que uma URL como prova. Ser criar e atribuir um nome forte o conjunto nas prximas etapas.

Visual C# Consolidado

1161

Para criar um nome forte 9. No menu Project no Visual Studio, clique em My Security Test Properties. 10. Clique na Signing guia. 11. Selecione Sign the assembly. 12. No, o Choose a strong name key file list clique New. 13. Na caixa Create Strong Name Key de dilogo, digite SecurityTestKey na caixa Key file name. 14. Desmarque a Protect my key file with a password caixa de seleo. 15. Clique em OK. O arquivo SecurityTestKey.snk de chave aparece no Solution Explorer. 16. No menu Build, clique em Build Solution Para criar o conjunto contra o par de chaves nome forte. Conceder confiana com base no nome de alta segurana Agora adicionar um novo grupo de cdigo para conceder confiana total para o conjunto com base no nome forte. Para conceder confiana com base em nome forte 10. Abra Microsoft .NET Framework 2.0 Configuration novamente. 11. Clique com o boto direito do mouse no VSTOProjects n e clique New no menu de atalho 12. Digite o nome Security Test Strong Name para o novo grupo de cdigos, e clique em Next. 13. Na lista Choose the condition type for this code group, clique Strong Name. 14. Clique em Import. 15. Procure C:\Walkthroughs\My segurana Test\My segurana Test.dll segurana Test\bin\My para Visual Basic ou C:\Walkthroughs\My segurana Test\My segurana Test.dll segurana Test\bin\debug\My no C#, e clique em Open. 16. Clique em Next. 17. Clique Next para aceitar o FullTrust conjunto de permisses e clique em Finish. 18. Fechar Microsoft .NET Framework 2.0 Configuration. Testar o aplicativo Agora voc pode testar sua pasta de trabalho para certificar-se que seu cdigo seja executado quando a pasta de trabalho aberta. Para testar sua pasta de trabalho 3. 4. Pressione F5 para executar o projeto. Confirme se a caixa de mensagem aparece.

COMO: Adicionar Controles a Documentos do Office


Um controle um componente no documento usado para exibir informaes ou aceitar entrada do usurio. Voc pode adicionar controles Windows Forms para o Microsoft Office Excel 2003 e

Visual C# Consolidado

1162

Microsoft Office Word 2003 documentos em tempo de criao ou em tempo de execuo. Por exemplo, voc pode adicionar um ComboBox controle a sua planilha para que os usurios possa selecionar em uma lista de opes. Voc tambm pode adicionar controles host, como controles Bookmark e NamedRange controles, para documentos do Office. Para obter mais informaes, consulte Controles host do Word e Controles host do Excel. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Adicionando controles em tempo de design Para arrastar um Windows Forms controle para o documento 3. Crie ou abra um projeto de pasta de trabalho do Excel ou projeto Documento do Word no Visual Studio para que o documento fique visvel no designer. Para obter informaes sobre como criar projetos, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Na guia Common Controls Da Clique no controle que voc deseja adicionar e arraste-o para o documento. o Toolbox, Observao Quando voc seleciona um controle no Excel, voc ver =EMBED("WinForms.Control.Host","") no Formula Bar. Este texto necessrio e no devem ser excludos. Para desenhar um Windows Forms controle sobre o documento 4. Crie ou abra um projeto de pasta de trabalho do Excel ou projeto Documento do Word no Visual Studio para que o documento fique visvel no designer. Para obter informaes sobre como criar projetos, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Na guia Common Controls da caixa de ferramentas, clique no controle voc deseja adicionar. No documento, clique no local em que a extremidade superior esquerda do controle para ser localizado, e arraste para onde voc deseja o canto inferior-direito do controle seja localizado. O controle adicionado para o documento com o local especificado e tamanho. Observao Quando voc seleciona um controle no Excel, voc ver =EMBED("WinForms.Control.Host","") no Formula Bar. Este texto necessrio e no devem ser excludos.

4.

5. 6.

Visual C# Consolidado

1163

Para adicionar um controle Windows Forms para o documento clicando uma nica vez sobre o controle 4. Crie ou abra um projeto de pasta de trabalho do Excel ou projeto Documento do Word no Visual Studio para que o documento fique visvel no designer. Para obter informaes sobre como criar projetos, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Na guia Common Controls Da clique Toolbox, o controle voc deseja adicionar Um documento, clique onde desejar o controle a ser adicionado. O controle adicionado ao documento com o tamanho padro. Observao Quando voc seleciona um controle no Excel, voc ver =EMBED("WinForms.Control.Host","") no Formula Bar. Este texto necessrio e no devem ser excludos. Para adicionar um controle Windows Forms para o documento clicando duas vezes no controle 3. Crie ou abra um projeto de pasta de trabalho do Excel ou projeto Documento do Word no Visual Studio para que o documento fique visvel no designer. Para obter informaes sobre como criar projetos, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Na guia Common Controls Controle voc deseja para adicionar de clique duplo no Toolbox. O controle adicionado para o documento no centralizar do documento ou painel ativo. Observao Quando voc seleciona um controle no Excel, voc ver =EMBED("WinForms.Control.Host","") no Formula Bar. Este texto necessrio e no devem ser excludos. Para adicionar um controle Windows Forms para o documento, pressionando a tecla ENTER 3. Crie ou abra um projeto de pasta de trabalho do Excel ou projeto Documento do Word no Visual Studio para que o documento fique visvel no designer. Para obter informaes sobre como criar projetos, consulte Como criar Ferramentas do Visual Studio para projetos do Office:. Na guia Common Controls Da Clique no controle que voc deseja adicionar e pressione a tecla ENTER. o Toolbox, O controle adicionado para o documento no centralizar do documento ou painel ativo. Observao Quando voc seleciona um controle no Excel, voc ver =EMBED("WinForms.Control.Host","") no Formula Bar. Este texto necessrio e no devem ser excludos.

5. 6.

4.

4.

Visual C# Consolidado

1164

Voc tambm pode adicionar controles Windows Forms dinamicamente a um documento em tempo de execuo usando os mtodos auxiliar fornecidos pelo Microsoft Visual Studio 2005 Tools for the Microsoft Office System. No exemplo abaixo, clula A1 de um projeto de aplicativo Excel. adicionado um Button Para obter informaes sobre como adicionar outros controles Windows Forms, consulte Adicionar controles a documentos do Office em tempo de execuo. Adicionando controles em tempo de execuo Para adicionar um Windows Forms controlar programaticamente

No manipulador Startup de eventos de ThisWorkbook, insira o cdigo a seguir para adicionar clula C5: um Button C#
private void Sheet1_Startup(object sender, System.EventArgs e) { Microsoft.Office.Tools.Excel.Controls.Button salesButton; salesButton = this.Controls.AddButton(this.get_Range("C5", missing), "salesButton"); salesButton.Text = "Calculate Total Sales"; }

COMO: Executar Clculos do Excel por Programao


O Calculate mtodo executa todos os clculos no objeto especificado. Use o mtodo do objeto que limita o intervalo de clculo para o menor nmero de clulas que voc deseja recalcular. O mecanismo de reclculo do Microsoft Office Excel 2003 muito rpido, mas se voc pode limitar o nmero de clulas envolvidas, voc pode otimizar a operao. Executar clculos para um intervalo Para executar clculos em um controle NamedRange 3. Criar o intervalo nomeado. C#
Microsoft.Office.Tools.Excel.NamedRange NamedRange1 = this.Controls.AddNamedRange(this.get_Range("A1", missing), "NamedRange1");

4.

Chame o Calculate mtodo do intervalo especificado. C#


NamedRange1.Calculate();

Executar clculos para o aplicativo inteiro Para executar clculos em todas as pastas de trabalho abertas

Chame o Calculate mtodo do objeto Application. C#


this.Application.Calculate();

Compilando o cdigo

Este cdigo deve ser colocado em uma classe folha, no na classe ThisWorkbook.

Visual C# Consolidado

1165

Como: Criar menus do Office programaticamente


Este exemplo cria um menu chamado New Menu na barra de menus do Microsoft Office Excel 2003. O novo menu colocado esquerda do menu Help. Ele contm um comando de menu. Quando o comando de menu for clicado, texto ser inserido em uma clula na Sheet1. Para obter um exemplo de personalizao interface de usurio no Microsoft Office Word 2003, consulte COMO: Criar Barras de Ferramentas do Office por Programao e Walkthrough: Criando menus de atalho para indicadores. Adicione o seguinte cdigo classe ThisWorkbook. Observao Defina a Tag propriedade nos controles quando voc adiciona manipuladores de eventos. Office usa a Tag propriedade para manter controle de manipuladores de eventos para um especfico CommandBarControl. Se a Tag propriedade estiver em branco, os eventos no so tratados corretamente. Observao Declarar o variveis menu no nvel de classe INSTEAD OF dentro o mtodo onde eles so chamados. Isso garante que as variveis menu permanecer no escopo, desde que o aplicativo est sendo executado. Caso contrrio, o item ser removido do coleta de lixo em algum momento indeterminado, e seu cdigo do manipulador de eventos pra de funcionar. Exemplo C#
// Declare the menu variable at the class level. private Office.CommandBarButton menuCommand; private string menuTag = "A unique tag"; // Call AddMenu from the Startup event of ThisWorkbook. private void ThisWorkbook_Startup(object sender, System.EventArgs e) { CheckIfMenuBarExists(); AddMenuBar(); } // If the menu already exists, remove it. private void CheckIfMenuBarExists() { try { Office.CommandBarPopup foundMenu = (Office.CommandBarPopup) this.Application.CommandBars.ActiveMenuBar.FindControl( Office.MsoControlType.msoControlPopup, System.Type.Missing, menuTag, true, true); if (foundMenu != null) { foundMenu.Delete(true); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } // Create the menu, if it does not exist. private void AddMenuBar() { try { Office.CommandBarPopup cmdBarControl = null; Office.CommandBar menubar = (Office.CommandBar)Application.CommandBars.ActiveMenuBar; int controlCount = menubar.Controls.Count; string menuCaption = "&New Menu"; // Add the menu. cmdBarControl = (Office.CommandBarPopup)menubar.Controls.Add( Office.MsoControlType.msoControlPopup, missing, missing, controlCount, true); if (cmdBarControl != null) { cmdBarControl.Caption = menuCaption; // Add the menu command. menuCommand = (Office.CommandBarButton)cmdBarControl.Controls.Add( Office.MsoControlType.msoControlButton, missing, missing, missing, true); menuCommand.Caption = "&New Menu Command"; menuCommand.Tag = "NewMenuCommand"; menuCommand.FaceId = 65; menuCommand.Click += new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler( menuCommand_Click); } } catch (Exception e) { MessageBox.Show(e.Message); } } // Add text to cell A1 when the menu is clicked. private

Visual C# Consolidado

1166

void menuCommand_Click(Microsoft.Office.Core.CommandBarButton Ctrl, ref bool CancelDefault) { Globals.Sheet1.Range["A1", missing].Value2 = "The menu command was clicked."; }

COMO: Criar Barras de Ferramentas do Office por Programao


Este exemplo cria uma barra de ferramentas denominada Teste no Microsoft Office Word 2003. Ele aparece perto no meio do documento e contm dois botes. Quando um boto clicado, uma caixa de mensagem aparece. Para obter um exemplo de personalizao a interface do usurio do Office no Microsoft Office Excel 2003, consulte Como: Criar menus do Office programaticamente. Adicione o seguinte cdigo classe ThisDocument. Observao Declarar o variveis barra de comando no nvel de classe INSTEAD OF dentro o mtodo onde eles so chamados. Isso garante que as variveis barra comando permanecer no escopo, desde que o aplicativo est sendo executado. Caso contrrio, o item ser removido do lixo e seu cdigo do manipulador de eventos no executado. Exemplo C#
// Create the command bar variables at the class level. Office.CommandBar commandBar; Office.CommandBarButton firstButton; Office.CommandBarButton secondButton; private void ThisDocument_Startup(object sender, System.EventArgs e) { AddToolbar(); } private void AddToolbar() { try { commandBar = Application.CommandBars["Test"]; } catch (ArgumentException e) { // Toolbar named Test does not exist so we should create it. } if (commandBar == null) { // Add a commandbar named Test. commandBar = Application.CommandBars.Add("Test", 1, missing, true); } try { // Add a button to the command bar and an event handler. firstButton = (Office.CommandBarButton)commandBar.Controls.Add(1, missing, missing, missing, missing); firstButton.Style = Office.MsoButtonStyle.msoButtonCaption; firstButton.Caption = "button 1"; firstButton.Tag = "button1"; firstButton.Click += new Office._CommandBarButtonEvents_ClickEventHandler(ButtonClick); // Add a second button to the command bar and an event handler. secondButton = (Office.CommandBarButton)commandBar.Controls.Add(1, missing, missing, missing, missing); secondButton.Style = Office.MsoButtonStyle.msoButtonCaption; secondButton.Caption = "button 2"; secondButton.Tag = "button2"; secondButton.Click += new Office._CommandBarButtonEvents_ClickEventHandler(ButtonClick); commandBar.Visible = true; } catch (ArgumentException e) { MessageBox.Show(e.Message); } } // Handles the event when a button on the new toolbar is clicked. private void ButtonClick(Office.CommandBarButton ctrl, ref bool cancel) { MessageBox.Show("You clicked: " + ctrl.Caption); }

Visual C# Consolidado

1167

Dispositivos Inteligentes
Esta pgina contm links para a Ajuda sobre tarefas de programao de dispositivos inteligentes amplamente utilizadas. Para ver outras categorias de tarefas populares abordadas na Ajuda, consulte Como Fazer em C#.

O que h de novo em projetos Smart Device


Os seguintes recursos novos ou expandido esto disponveis no Visual Studio 2005.

O que h de novo no desenvolvimento visual aplicativos dispositivos C++


Inclui Visual Studio 2005 Desenvolvimento do dispositivo no Visual C++. Anteriormente, desenvolver projetos de dispositivo com Visual C++ necessria uma verso do eMbedded Visual C++. Os novos recursos detalhados nas sees a seguir so aprimoramentos sobre eMbedded Visual C++. Ambiente de desenvolvimento integrado (IDE) Destino vrios sistemas operacionais O Visual Studio 2005 conjunto de ferramentas fornece a capacidade para destino Pocket PC 2003, Smartphone 2003, personalizados SDKs baseado em Windows CE 5.0-, e libera SDK futura. Sistema do projeto O sistema do projeto agora associa plataformas a suas arquiteturas CPU com suporte. Verses anteriores do eMbedded Visual C++ permitido a seleo de uma arquitetura de CPU que no foi aceito pelo atual do projeto ativo. O IntelliSense No Visual Studio 2005, IntelliSense reflete entre os arquivos de cabealho Software Development Kit (SDK) para fornecer informaes precisas sobre a plataforma de destino. Modo misto Solutions Ativa Visual Studio 2005 desenvolvedores do dispositivo para ter tanto gerenciados, cdigo Basic, Visual C# ou Visual e no gerenciado, Visual C++, cdigo no mesmo soluo. Ele tambm habilitar rea de trabalho e dispositivo Cdigo Visual C++ para estar no mesmo projeto. Instalar do aplicativo Permite que os desenvolvedores para compactar seus aplicativos do dispositivo e criar um instalador da rea de trabalho para distribuir os aplicativos para dispositivos. Aplicativos personalizados e assistentes de classe Torna Visual Studio 2005 fcil a gravar aplicativo e assistentes de classe para projetos de dispositivo.

Visual C# Consolidado

1168

Editor de recursos O Resource Editor e CAPEdit controles. inclui recursos especficos do dispositivo, como o State of Input Panel Depurao O Visual Studio 2005 depurador do dispositivo C++ contm o seguintes recursos novos ou aperfeioamentos:

Robustez aprimorado e desempenho por depuradores do aplicativo do dispositivo anterior. A capacidade de desanexar e re-Attach para processos. A capacidade para anexar a um processo sem o executvel. Suporte para pontos de interrupo de DLLs compartilhadas. Vrios processo depurao. Avaliao aprimorado expresso incluindo mais expressive janelas depurador.

Compiladores Os Visual Studio 2005 compiladores do dispositivo C++ ter o seguintes recursos novos ou aperfeioamentos:

Suporte para /LTCG gerao (cdigo de tempo de conexo). Aumentado limites do compilador. Alternar /GS o suporte para deteco de saturao de buffer. Suporte a palavra-chave __restrict. Atualiza em conformidade com uma porcentagem maior de normas C++.

Bibliotecas As bibliotecas Visual C++ para dispositivos possui o seguintes recursos novos ou aperfeioamentos:

Microsoft (ATL) para dispositivos Active Template Library e Microsoft MFC (para dispositivos Foundation Classes) foram atualizadas para o cdigo 8.0 base. Segurana abrangente, desempenho, estabilidade e compatibilidade com padres funciona em MFC para dispositivos, ATL para dispositivos, a biblioteca (CRT) em tempo de execuo C para dispositivos, e a Biblioteca C++ Padro para dispositivos Funcionalidade Common MFC e ATL foi mesclada. Suporte fluxo foi adicionado Biblioteca C++ Padro para dispositivos.

ATL Os seguintes recursos foram adicionados ao ATL para dispositivos:


Controle ActiveX hospeda. A capacidade de consomem servios da Web. Bitmap suporte com a CImage classe. Novas classes para gerenciar matrizes, listas e rvores. Manipulao de seqncia de caracteres avanada e converso.

Visual C# Consolidado

1169

Estendido suporte soquete para IPv6.

MFC Os seguintes recursos foram adicionados ao MFC para dispositivos:


Agora disponvel para Smartphone. Controle ActiveX que hospeda e criao.

O que h de novo no Managed projetos de dispositivo


A lista abaixo descreve aprimoramentos para o dispositivo gerenciado desenvolvimento de aplicativos adicionadas desde o Visual Studio .NET 2003. Observao Embora voc possa usar Visual Studio 2005 para programar contra verso 1 e verso 2 do .NET Compact Framework, no h suporte para os recursos abaixo marcados com um asterisco (*) na verso 1 Novos recursos Os recursos a seguir esto disponveis no Visual Studio 2005. Recurso *Anchoring controles em formulrios do Windows Details HOW TO: Anchor controles em Windows Forms Viso geral Solutions do dispositivo de embalagem

CAB Gerao de arquivo usando projetos Visual Studio instalao e implantao. Esse processo elimina a necessidade de personalizar o arquivo.inf manualmente. Filtrar sem suporte propriedades / Methods / eventos.

Recurso inclui IntelliSense filtrado, uma etapa de verificao de criao, e capacidade para converter controles sem suporte. Cores em que aparecem no dispositivo. Definir caixa de dilogo de cor (dispositivos)

Editor de cores

Controles personalizados Controles *User *Docking controles em Windows Forms

Suporte completo. Use Criar e exibir classes e tipos Para adicionar atributos personalizados de designer. HOW TO: Dock controles em Windows Forms

Visual C# Consolidado

1170

*Data criar suporte

Dados em projetos de dispositivos gerenciados Fontes como suporte para a plataforma atual. Caixa de dilogo Editor fonte (dispositivos) Caixa de dilogo de propriedades fator (Dispositivos) de formulrio

Editor fonte

Formulrio suporte fator, incluindo orientao e resoluo. *Autoscale Capa formulrio com a criao de cdigo

Caixa de dilogo de propriedades fator (Dispositivos) de formulrio WebBrowser, Notification, DocumentList, DateTimePicker, MonthCalendar, LinkLabel, Splitter, BindingSource Designers aprimorados fornecem precisa aparncia para cada plataforma. Suporte Smartphone 2003 e Pocket PC 2003

*New controles e Components na Toolbox

WYSIWYG especficos de plataforma

Destinos verso 1.0 do .NET Compact Framework

Alterar plataformas usando o mesmo cdigo de fonte Como Compartilhar Cdigo Fonte Atravs de Plataformas (Dispositivos) Consulte tambm Referncia

Como Iniciar o Emulador de Dispositivo no Visual Studio


O emulador de dispositivo pode servir como um substituto para um dispositivo fsico durante grande parte do ciclo de desenvolvimento de um projeto de dispositivo inteligente. O emulador de dispositivo oferece suporte vrias opes, como especificar tamanho RAM, mas nem todos os SDKs suporte todas as opes. Verifique a documentao do SDK para obter detalhes. Para obter mais informaes, inicie o emulador de dispositivo e clique em Help. Para iniciar o emulador de dispositivos usando conectar para caixa de dilogo Dispositivo 1. 2. No menu visual studio Tools, clique em Connect to Device. Na caixa Connect to Device de dilogo, selecione um emulador na caixa Devices, e clique em Connect No menu visual studio Tools, clique em Device Emulator Manager. Na Device Emulator Manager janela, clique com boto direito o emulador voc deseja iniciar.

Para iniciar o emulador dispositivo usando o Gerenciador de emulador de dispositivo 1. 2.

Visual C# Consolidado

1171

3.

No menu de atalho, clique em Connect.

Viso geral do acesso de dados (projetos do dispositivo gerenciado)


O Visual Studio ambiente para desenvolvimento de projetos de dispositivo que manipulam dados semelhante do ambiente para desenvolver aplicativos de dados do computador de mesa. Aplicativos de dados gerenciado para dispositivos contam com ADO.NET espaos para nome suporte para o.NET Compact Framework. Essa combinao presta se a aplicativos onde o armazenamento de dados no dispositivo normalmente ser desconectado de dados em um servidor, e sincronizada somente periodicamente. Dados de dispositivos: o que h de novo no Visual Studio 2005

Voc pode criar bancos de dados do SQL Server Mobile, atribuir senhas, alterar esquemas, e executar outras tarefas de gerenciamento banco de dados fundamental usando o Visual Studio IDE Voc pode usar DataSets digitados, ResultSets, objetos comerciais, SQL Server bancos de dados, bancos de dados do SQL Mobile, ou servios da Web como fontes de dados. Voc pode arrastar e soltar essas fontes de dados de janela fontes de dados para um formulrio do Windows para gerar controles ligados a dados de sua escolha. Observao O Data Source Configuration Wizard no est disponvel para projetos que destino verso 1.0 do .NET Compact Framework.

Arquitetura SQL Mobile Server SQL Server Mobile representa o mecanismo de dados local melhor para dispositivos que so conectados apenas ocasionalmente. Voc pode programar com o .NET Compact Framework para aplicativos gerenciados ou Microsoft Visual C++ para dispositivos para aplicativos nativos. Para obter mais informaes, consulte SQL Server Mobile Architecture. Uso Tpico do SQL Server Mobile SQL Server Mobile oferece uma soluo para dados conectados ocasionalmente cenrios de acesso em dispositivos mveis. Cenrios empresariais mveis com freqncia so necessrias para trabalhar com dados quando a conectividade no est disponvel. SQL Server Mobile aborda esses cenrios, fornecendo um armazenamento relacional Rich que pode ser sincronizado ao SQL Server quando uma conexo est disponvel. Para obter mais informaes, consulte Typical Uses of SQL Server Mobile. Observao Voc pode usar o Microsoft SQL Server 2005 Mobile Edition como os dados armazenamento dos aplicativos Tablet PC, bem como para aplicativos do dispositivo. Voc tambm pode ser executado-em laptops e desktops fornecido o Visual Studio 2005 ou SQL Server 2005 instalado. Para obter mais informaes, consulte Building a SQL Server Mobile Application for Tablet PCs. Recursos do SQL Server Mobile

Visual C# Consolidado

1172

SQL Server Mobile fornece uma grande quantidade de recursos, como parte de um aplicativo .NET Compact Framework ou como uma instalao independente em um dispositivo inteligente. Dados podem ser maniuplated offline e sincronizados posteriormente a um servidor. Para obter mais informaes, consulte SQL Server Mobile Features. Criando e gerenciando bancos de dados SQL Server Para desenvolver aplicativos de dados eficaz para dispositivos, necessrio um entendimento do design do banco de dados boa e do mecanismo de banco de dados do SQL Server. Voc deve mestre como manter bancos de dados, como torn-los seguros, como acessar e modificar os dados neles, como eficiente consult-los, e como maximizar seu desempenho. Para obter mais informaes, consulte Working with Databases (SQL Server Mobile) e Enhancing Performance (SQL Server Mobile). Conexes com um servidor SQL Server Mobile aceita a replicao de mesclagem, acesso remoto de dados, e planejamento de segurana e implementao para o servidor. Para obter mais informaes, consulte Managing Connectivity (SQL Server Mobile). Implementar tarefas comuns Programatically Para obter as etapas para implementar as tarefas comuns atravs de programao, consulte How to (SQL Server Mobile). Segurana local O mecanismo SQL Server Mobile Database oferece proteo por senha e criptografia para proteger bancos de dados em dispositivos locais. Ele tambm fornece conectividade opes de segurana. Para obter mais informaes, consulte Securing Databases (SQL Server Mobile).

Viso geral Solutions do dispositivo de embalagem


Implantao o processo por que voc transferir um aplicativo ou componente para o dispositivo de destino ou dispositivos que ele destinado a executar. Antes voc pode implantar a soluo, voc deve compact-la em um arquivo CAB. Um arquivo CAB um tipo de arquivo de arquivo executvel que pode conter seu aplicativo, dependncias, como DLLs, recursos, arquivos da Ajuda, e qualquer outro arquivos voc deseja incluir nele. Quando voc cria o projeto CAB, Microsoft Visual Studio 2005 gera um arquivo INF que usado para criar o CAB. O arquivo INF descreve qual pasta cada arquivo est para ser instalado em, quais verses do Windows CE destina a executar, se o aplicativo o aplicativo tem permisso para ser desinstalado, e assim por diante. Um nativo personalizado, voc tambm pode incluir em seu arquivo CAB, dll para executar qualquer personalizado instalar etapas, como verificao de nmero de verso para Windows CE e assim por diante. ou a .NET Compact Framework, determinar se outros componentes esto presentes, Depois que o CAB copiado para o dispositivo de destino, o usurio toques nele para iniciar o processo de instalao. Isso chamado exploding o CAB. Observao Fornece Microsoft Visual Studio 2005 ferramentas para compactar o arquivo CAB. Ele no fornece qualquer ferramenta para implantar o arquivo cab em um dispositivo de destino. Para cenrios simples, voc pode arrastar um arquivo CAB da sua mquina desktop para o dispositivo usando uma conexo do ActiveSync. Vrias solues de implantao de terceiros esto disponveis para situaes mais complexas. Para obter mais informaes, visite o Mobile e Embedded Application

Visual C# Consolidado

1173

Developer Center. Torna Visual Studio 2005 possvel, na maioria dos casos, para executar todos os o trabalho necessrio de embalagem diretamente no ambiente de desenvolvimento integrado Visual Studio (IDE). Criar um arquivo CAB pelo primeiro adicionar um projeto inteligente CAB dispositivo sua soluo existente, e adiciona o arquivos, atalhos e entradas do Registro a ele usando a mesma interface do usurio como com projetos da instalao desktop. Quando voc cria o projeto de instalao, voc criar o arquivo CAB. Existem algumas diferenas entre os arquivos CAB que voc criou para um aplicativo Pocket PC e os voc criar para um aplicativo de Smartphone. PCs de bolso baseados em Windows Mobile 2003SE e anteriores no ofeream suporte compactados arquivos CAB ou arquivos CAB assinado. Arquivos CAB Smartphone deve ser compactados e o arquivo exe ou dll, e o arquivo cab em si, deve ser assinados digitalmente para que possa ser instalado no dispositivo. Aps ter criado o arquivo CAB com Visual Studio, a prxima etapa para transferi-lo para o dispositivo de destino usando qualquer um do meio tpico de transferncia de arquivos: atravs do dispositivo, solicitaes de FTP ou HTTP manual copiando o desenvolvimento de mesa mquina para uma pasta em um dispositivo conectado usando o Windows Explorer, sobre a transferncia do ar (OTA) para Smartphones, e assim por diante.

Alternar plataformas em projetos de dispositivo


Voc pode facilmente alternar a plataforma de destino. Por exemplo destino uma plataforma Pocket PC 2003 ou uma plataforma Smartphone usando o mesmo projeto. Para criar um projeto direcionamento vrias plataformas no Visual C++, consulte:

Destino vrias plataformas em Native projetos de dispositivo Configuraes do Gerenciador de configurao, Assistente para projeto de dispositivo inteligente.

Para obter informaes sobre como definir a plataforma de destino no Gerenciador de configurao, consulte:

Como criar um projeto de dispositivo Multiplatform (Visual C++): Configuraes do Gerenciador de configurao, Assistente para projeto de dispositivo inteligente.

Para mais informaes sobre como trabalhar com recursos vrias plataformas em um projeto Visual C++, consulte Usar recursos em vrias plataformas.

Ferramentas Remotas para Projetos de Dispositivos


As ferramentas remotos listadas abaixo estavam disponveis no Visual C++ 4.0 incorporado e vm com Visual Studio 2005 para ajud-lo a desenvolver e depurar aplicativos do dispositivo. Clique Start na rea de trabalho do Windows para iniciar essas ferramentas autnomo, aponte para All Programs, aponte para Microsoft Visual Studio 2005, clique em Visual Studio Remote Tools e selecione uma das ferramentas remotos a partir do menu.

Visual C# Consolidado

1174

Para Exibir e gerenciar o sistema de arquivos em um dispositivo de destino (incluindo exportar e importar) Exibir informaes sobre identificadores da pilha e sinalizadores para cada processo em execuo em um dispositivo de destino Exibir informaes sobre cada processo em execuo em um dispositivo de destino Exibir e gerenciar o Registro para um dispositivo de destino

Uso Visualizador de arquivos remoto Dependency Walker da pilha remoto Visualizar do processo remoto Editor do Registro remoto Spy remoto

Exibir mensagens recebidas pelo janelas associadas aplicativos executados em um dispositivo de destino Capturar uma imagem tela em formato bitmap (.bmp) de um dispositivo de destino Consulte tambm

In Zoom-remoto

Viso geral sobre segurana (dispositivos)


Dispositivos restringir a instalao e execuo de aplicativos e acesso a recursos do sistema, com base em configuraes de diretiva de segurana e funes de segurana. Para que os aplicativos sejam executados corretamente em determinados dispositivos, eles devem ser digitalmente com o certificado adequado, e esse certificado deve estar presente no armazenamento de certificados do dispositivo. Quais arquivos devem ser assinado? Prtica prticas requer que Arquivos EXE, DLL, CAB, e MUI (Multilingual User Interface) ser assinados. Em projetos gerenciados, arquivos do conjunto tambm devem ser assinados. Modelos de segurana H tambm vrios modelos de segurana que pode ser definido para executar em um dispositivo. Os modelos de segurana diferentes podem restringir o acesso a aplicativos que no tm a autorizao apropriada. Para obter mais informaes sobre dispositivo modelos de segurana, consulte Guia do Desenvolvedor Smartphone Based Mobile-do Windows e Como Prover um Dispositivo com um Modelo de Segurana. Assinatura aps Post-Build alteraes binrio Se voc executar uma etapa Post-Build que altera um binrio, voc precisa assinar novamente o binrio; ou seja, voc dever desativar assinatura Authenticode nas propriedades do projeto, e entrar em vez disso como uma etapa Post-build. Esta ao necessria porque nada que altera o binrio aps ele est assinado invalida a assinatura. Assim, o binrio deve ser assinado novamente.

Visual C# Consolidado

1175

Configurao Configurao um dispositivo se refere ao adicionar certificados digitais a armazenamentos de certificados do dispositivo. Quando feita uma tentativa para instalar ou executar um aplicativo no dispositivo, o sistema operacional do dispositivo verifica para verificar se o certificado com o qual o aplicativo est assinado em um armazenamento de certificados para o dispositivo. Para obter mais informaes sobre armazenamentos de certificados, consulte Um Practical guia para a segurana de aplicativos do Smartphone e cdigo modelo assinatura para desenvolvedores.

Smartphones so Pre-provisioneds por operadores mveis. Pocket PCs Windows Mobile 5.0-com base so Pre-provisioneds por OEMs; anteriores Pocket PCs no foram normalmente. Imagens para o emulador de Visual Studio dispositivo so Pre-provisioned.

Para obter mais informaes sobre configurao, consulte a documentao Smartphone ou Pocket PC SDK. Arquivos de certificado Para ajudar a desenvolver aplicativos para uma variedade de modelos de segurana, Visual Studio 2005 Inclui os seguintes arquivos de certificado, localizados, por padro em \Program Files\Microsoft 8\SmartDevices\SDK\SDKTools\TestCertificates Visual Studio:

TestCert_Privileged.pfx TestCert_UnPrivileged.pfx

Esses arquivos.pfx conter o certificado e a chave particular correspondente. (Assinatura falhar se voc tentar assinar um aplicativo com um certificado que no tenha uma chave particular correspondente.) Eles tm nenhuma senha. Importar esses arquivos.pfx para o armazenamento de certificados pessoal no computador de mesa. Se voc tentar se import-los para outro armazenamento (tais como o armazenamento de autoridades de certificao raiz confiveis), Visual Studio exibir um aviso de segurana detalhadas. Para obter mais informaes, consulte Como Importar e Aplicar Certificados em Projetos de Dispositivos.

Seleo mtodo de conexo


Durante o desenvolvimento, ele essencial para ter uma conexo entre o Smart Device e o computador de desenvolvimento rpido e confivel. Embora as emuladores de dispositivo inteligente podem ser usados em quase todos os estgios de desenvolvimento, teste o aplicativo em uma pea de hardware do mundo real uma parte vital do ciclo de desenvolvimento. Muitas opes de conexo esto disponveis, como resumidos posteriormente neste artigo. As configuraes mais comuns so:

A conexo com o emulador dispositivo usando o transporte de DMA. Este transporte elimina problemas de conexo de rede, e normalmente fornecido como o transporte padro. Se tiver algum motivo para usar outro transporte, grave Sempre usar o transporte de DMA para o emulador de dispositivo. Conectando-se a um dispositivo fsico usando o ActiveSync 4.x e uma porta USB.

Visual C# Consolidado

1176

Voc pode acessar essas e outras opes no menu Visual Studio Ferramentas. Para obter mais informaes, consulte Como Configurar Opes de Conexo (Dispositivos). O ActiveSync 4.x 4.X ActiveSync fornece uma conexo segura entre o computador de desenvolvimento e um dispositivo usando cabo, base, Bluetooth, ou conexes via infravermelho. Ele tambm fornece o veculo pelo qual necessrio arquivos conexo e de segurana sero baixados automaticamente para o dispositivo. Quando voc Cradle um dispositivo, o ActiveSync desativa a todas as outras placas de rede, para que voc saiba o dispositivo est se comunicando somente com o computador de desenvolvimento. O ActiveSync o mecanismo conexo padro enquanto voc desenvolver o aplicativo de dispositivo. Se suporte ActiveSync for no disponvel para o dispositivo, consulte Como se Conectar ao Device do Windows CE sem o ActiveSync. Opes de conexo PCs de bolso, Smartphones, e outro hardware baseado em Windows CE oferece vrias maneiras de vincular um dispositivo e um computador. Nesta seo, as vrias opes de conexo e suas vantagens e desvantagens so discutidas. O dispositivo de hardware envolvido, dependendo um ou mais dos seguintes mtodos de conexo podem ser empregado. Conexo USB A forma mais simples de conexo, todos os Pocket PC e Smartphone dispositivos compatveis com uma conexo USB. Embora no como rpida / a simplicidade da conexo USB torna conexo g, uma opo atraente. como Ethernet ou sem fio 802. 11b Muitos dispositivos tambm ser ser alimentados por meio da porta USB, que uma convenincia adicionada. Rede Ethernet com fio Pocket PC e Smartphone dispositivos por padro no oferecerem suporte para conexes Ethernet sem hardware adicional. No entanto, a velocidade da conexo padro extra torna a maneira preferida para executar operaes muito dados-depurao e outros. Sem fio 802. 11b / rede g Placas de rede sem fio esto disponveis para PCs de bolso, e vrios modelos agora vm com redes sem fio como um recurso integral. Redes sem fio so to rpida como uma conexo de rede Ethernet com fio. Bluetooth Dispositivos Pocket PC e Smartphone muitos recurso redes sem fio Bluetooth. O Smart Device depois pares adequados, pode conectar sobre ActiveSync, desde que ele seja no intervalo do computador de mesa. BLUETOOTH No como rpido como 802. 11b /. g sem fio, e no recomendada para depurao Conexo serial

Visual C# Consolidado

1177

Se nenhum USB ou opes de rede com ou sem fio estiverem disponveis, uma porta serial torna aceitvel, se lenta, uma maneira de se conectar um dispositivo inteligente a um computador de desenvolvimento. Conexo de infravermelho Conexes via infravermelho requerem sem cabeamento adicional, e dispositivos Pocket PC e Smartphone tanto vm com portas IrDA como padro. No entanto, conexes via infravermelho requerem de linha de portadores para operar confivel, e mesmo assim o desempenho no for aceitvel para depurao. No entanto, IrDA pode ser til como uma tcnica ltima recurso para copiar arquivos para dispositivos.

Atualizando Projetos Criados com Ferramentas Anterior


Fornece Microsoft Visual Studio 2005 ferramentas de desenvolvimento sofisticado para o desenvolvedor de dispositivo inteligente. Programadores usando C# e Visual Basic agora podem tirar proveito das ferramentas aprimorados oferecidos por Visual Studio 2005, e agora possvel para criar um projeto C++ para um dispositivo Pocket PC, Smartphone ou Windows CE usando o mesmo ambiente de desenvolvimento como usado para criar aplicativos desktop. Os aperfeioamentos para o Visual Studio 2005 ambiente de desenvolvimento, incluem:

C# Cdigo Fonte refatorao ferramentas. Para obter mais informaes, consulte Refatorao. Aprimorado depurao. Para obter mais informaes, consulte Depurando projetos de dispositivo. Cdigo trechos para C# e Visual Basic. Para obter mais informaes, consulte Criando e usando IntelliSense Code Snippets. Ferramentas de Implantao aprimorado. Para obter mais informaes, consulte Viso geral Solutions do dispositivo de embalagem. Aprimorado emuladores de dispositivo inteligente. Para obter mais informaes, consulte Como Iniciar o Emulador de Dispositivo no Visual Studio.

Migrando projetos de eMbedded Visual C++ para Visual Studio 2005 Voc pode migrar projetos Embeddeds Visual C++ utilizando um assistente de migrao. Para obter mais informaes, consulte eMbedded Visual C++ ao Assistente para atualizao 2005 Studio Visual. Migrando projetos do Visual Basic Embedded para Visual Studio 2005 Projetos criados no Visual Basic (eVB) Embedded automaticamente no so convertidos em Visual Studio 2005 Projetos. Em vez disso, voc deve adicionar a fonte existente e arquivos de recurso a um novo projeto criado no Visual Studio 2005 Visual Basic Smart Device. Observao Dispositivos Windows Mobile 2003 no contm os tempos de execuo eMbedded Visual Basic em ROM, e os tempos de execuo podem ser baixado para o dispositivo como uma instalao RAM, embora essa configurao no suportada.

Visual C# Consolidado

1178

Para obter mais informaes sobre como usar Visual Studio 2005 Para converter um projeto eVB, consulte os seguintes tpicos:

Migrando eVB controles Arquivo para Visual Basic .NET Migrando formulrios eVB para Visual Basic .NET

Migrando Managed projetos do Visual Studio .NET 2003 para o Visual Studio 2005 Visual C# e Visual Basic projetos de dispositivo inteligente desenvolvidos no Visual Studio .NET 2003 pode ser importado para Visual Studio 2005. O Assistente para converso Visual Studio torna as alteraes necessrias para os projetos. Atualizando projetos de dispositivos 2002 para dispositivos 2003 Para obter mais informaes sobre como atualizar projetos para o Windows Mobile 2003 do Windows Mobile 2000, consulte Windows Mobile Platform FAQ migrao para desenvolvedores.

Selecionando uma Linguagem de Desenvolvimento


Ao desenvolver um aplicativo, controle ou biblioteca para implantao em um dispositivo inteligente, h trs linguagens de programao para escolher em: Visual C#, Visual Basic e Visual C++. Visual C# C# uma linguagem modernos, orientated objeto-. Seus recursos coleo de lixo e suporte para as classes .NET Compact Framework tornam mais um idioma ideal para desenvolver aplicativos mveis confiveis e seguros. Visual C# para dispositivos inteligente inclui um nmero dos controles para rapidamente criar uma interface de grfica do usurio (GUI), e os recursos de suporte classes Compact Framework como GDI +, XML, e servios da Web grande. Visual C# tambm pode chamar funes Windows CE nativas para situaes no ofeream suporte a .NET Compact Framework. Para obter mais informaes sobre desenvolvimento com Visual C# e acessar nativas funes Windows CE, consulte:

Guia de Introduo ao Visual Studio .NET e o Microsoft .NET Compact Framework Referncia C# Uma introduo para P / Invoke e Marshaling no Microsoft .NET Compact Framework Criar uma biblioteca P / Invoke Avanado P / Invoke em Microsoft .NET Compact Framework

Visual Basic Visual Basic para dispositivos inteligentes uma implementao completa do Visual Basic, e consideravelmente mais potentes que a ferramenta de desenvolvimento anterior, eMbedded Visual Basic. Visual Basic bastante simplifica a tarefa de portabilidade um aplicativo da rea de trabalho para um dispositivo mvel, ou criando um aplicativo cliente rico-rapidamente. Com Visual C#, Visual Basic faz uso do .NET Compact Framework. Os desenvolvedores j familiarizados com o Visual Basic ser capaz para porta aplicativos existentes ou criar novos muito rapidamente. Como com C#, Visual Basic pode acessar nativas funes Windows CE. Para obter mais informaes sobre como desenvolver no Visual Basic, consulte:

Visual C# Consolidado

1179

Guia de Introduo ao Visual Studio .NET e o Microsoft .NET Compact Framework Referncia do Visual Basic

Visual C++ Visual C++ o idioma preferencial de desenvolvimento para dispositivos inteligentes quando Desempenho crtico, ou quando estiver desenvolvendo aplicativos no nvel do sistema, drivers de dispositivo ou hoje ou Home tela plug-ins. Visual C++ no oferece suporte .NET Compact Framework, mas em vez disso, fornece um subconjunto do conjunto da API do Win32. No possvel para aplicativos escritos em gerenciado C# ou cdigo do Visual Basic para acessar cdigo C++ contido em DLLs por meio do Interop. Para obter mais informaes sobre como desenvolver no Visual C++, consulte:

C/C++ Languages

Passo-a-passo: Criando aplicativos do Windows Forms para um dispositivo


Nessa explicao passo a passo, voc cria um aplicativo Windows Forms simples usando Visual Basic ou Visual C#. e execute o aplicativo em um emulador Pocket PC Essa explicao passo a passo demonstra a principal diferena entre rea de trabalho e dispositivo programao, ou seja, que voc deve selecionar um dispositivo. Neste passo-a-passo, o dispositivo um emulador interno do Pocket PC 2003. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings (Importar e Exportar Configuraes) no menu Tools (Ferramentas). Para obter mais informaes, consulte Configuraes do Visual Studio. Essa explicao passo a passo foi escrito usando configuraes de desenvolvimento do Visual Basic e Visual C# configuraes Development. Essa explicao passo a passo consiste de cinco tarefas principais:

Criar um projeto de dispositivo que usa Windows Forms. Adicionando um controle ao formulrio. Adicionando manipulao eventos ao controle. Selecionar um dispositivo no qual ser executado o projeto. Criao e implantao o aplicativo para o dispositivo. Escolher um dispositivo de destino

Para garantir que voc ser solicitado para selecionar um dispositivo quando voc implantar a soluo, conclua o procedimento a seguir.

Para solicitar para opes do dispositivo no momento da implantao


1. 2. Clique Options no menu Tools, e Device Tools Clique em General. (Est na parte inferior da caixa Options de dilogo no visvel, selecione Show all settings se Device Tools.) Marque a Show device choices before deploying a device project caixa de seleo.

Visual C# Consolidado

1180

Criando o aplicativo Criando um projeto do Windows Forms,, bem como adicionar controles e tratamento de eventos, segue o mesmo processo para projetos de dispositivo como faz para projetos de mesa. A principal diferena voc encontrar o menor nmero de classes disponveis no .NET Compact Framework.

Para criar um projeto de dispositivo que usa Windows Forms


1. (Visual Basic) No menu File no Visual Studio 2005, clique em New Project. ou (Visual C#) No menu File do Visual Studio 2005, aponte para New, e clique em Project. 2. Project Types Na caixa New Project de dilogo, expanda Visual Basic ou Visual C# expandir Smart Device, e clique em Pocket PC 2003. Se no o idioma a ser exibido, no no primeiro expandir Other Languages. Esta tela regida por suas configuraes de desenvolvimento. 3. 4. 5. Em Templates, clique em Device Application. Na caixa Name, digite DeviceSample, e depois clique em OK. (C Visual #) somente Na caixa Location, Verifique onde voc deseja armazenar seus arquivos de projeto, e clique em OK. Aparece uma representao de um dispositivo Pocket PC no Windows Forms Designer.

Para adicionar um controle para o formulrio


1. Do Toolbox, arraste um Button controle no formulrio. Se clique Toolbox no menu View. no estiver visvel, o Toolbox Se no esteja visvel no Toolbox, clique com boto direito na Device Controls guia e clique em Show All. o Toolbox, 2. 3. Clique com o boto direito do mouse o Button controle e clique em Properties. Na janela Properties, digite Say Hello, e pressione ENTER para definir a Text propriedade.

Para adicionar tratamento de eventos para o controle Boto


1. 2. Clique duas vezes no boto no formulrio. Abre o editor de cdigos com o ponto de insero posicionado do evento manipulador. Insira o seguinte cdigo Visual Basic:
MessageBox.Show("Hello, World!")

ou Insira o seguinte cdigo C#:


MessageBox.Show("Hello, World!");

Criao e teste o aplicativo Nesse ponto, voc encontrar uma diferena de projetos de mesa. Em um projeto de dispositivo, voc pode escolher entre vrios destinos onde o projeto para executar normalmente. Nessa explicao passo a passo, voc escolher um emulador Pocket PC. Se voc tiver um dispositivo

Visual C# Consolidado

1181

fsico com suporte j em parceria com o computador de desenvolvimento, voc tambm poder escolher o dispositivo fsico.

Para criar e testar o aplicativo


1. 2. No menu Debug, clique em Start (ou Start Debugging). Na caixa Deploy de dilogo, selecionar Pocket PC 2003 SE Emulator, e clique em Deploy Voc pode exibir progresso na barra de status. 3. Quando o aplicativo executado no emulador, toque no boto para garantir que " Hello, World! " aparece. Preparando para Walkthroughs adicionais Se voc pretende fazer orientaes adicionais ou abrir outros projetos, voc deseja desligar completamente o emulador e sair desta soluo.

Para fechar o emulador e a soluo


1. 2. 3. 4. 5. No menu File do emulador, clique em Exit. Na caixa Device Emulator de mensagem, clique em No para a mensagem Save State Before Exiting? No menu Visual Studio Debug, clique em Stop Debugging. Se uma mensagem aparecer informando que a conexo foi perdida, clique em OK. No menu File, clique em Close Solution. Consulte tambm

Programao para Dispositivos usando o .NET Compact Framework


Esta seo fornece informaes sobre como desenvolver aplicativos de dispositivo inteligente usando a linguagem Visual Basic ou C# e o .NET Compact Framework. Nesta seo O que h de novo no Managed projetos de dispositivo Lista alteraes importantes desde Visual Basic .NET 2003. Diferenas do desktop no .NET Framework Development compacto Descreve diferenas de desenvolver aplicativos desktop. Compactar variaes do .NET Framework verses Descreve as vrias verses do .NET Compact Framework, incluindo service packs. Diferenas entre Pocket PC 2003 e controles Smartphone 2003 Apresenta um mostrando de tabela quais controles h suporte para desenvolvimento Pocket PC 2003 e que h suporte para desenvolvimento Smartphone 2003.

Visual C# Consolidado

1182

Controles e Components em projetos de dispositivo gerenciado Descreve controles adicionais e componentes disponveis para o desenvolvimento de dispositivo. Personalizadas e controles de usurio em projetos de dispositivo Descreve a funcionalidade disponvel para projetos de dispositivo. Interoperabilidade com para dispositivos Descreve como criar conjuntos Interop COM em um projeto dispositivo gerenciado. Criando e desenvolvendo Managed projetos de dispositivo Fornece instrues passo a passo para dispositivo comum tarefas de desenvolvimento. Dados em projetos de dispositivos gerenciados Descreve como gerenciar dados para dispositivos no Visual Studio 2005. Criando um aplicativo Simple Walkthrough: Fornece instrues passo a passo sobre como criar um projeto de dispositivo Visual Basic ou Visual C# simples

Referncia do .NET Compact Framework para Projetos de Dispositivos


O .NET Compact Framework um subconjunto da biblioteca de classes do .NET Framework e tambm contm classes exclusivamente criadas para ele. Ele herda a arquitetura completa do .NET Framework com o Common Language Runtime e a execuo de cdigo gerenciada.

Como: Criar aplicativos de dispositivo usando o Visual Basic ou Visual C#


Criao Visual Basic e Visual C# gerenciados projetos para segue dispositivos o mesmo gerais processa como criar projetos para rea de trabalho, exceto que voc deve selecionar um plataforma de destino (por exemplo, Pocket PC 2003) e Verso .NET Compact Framework (v2.0 Por exemplo,) no qual o projeto projetado para ser executado. Uma caixa de dilogo Avanado New Project em Visual Studio 2005 substitui inteligente dispositivo Assistente aplicativo Visual Studio .NET 2003. No Visual Studio 2005, voc fazer todas as escolhas sobre tipos de projeto e Modelos na caixa New Project de dilogo. Observao Opes disponveis em caixas de dilogo e comandos de menu diferem dependendo as configuraes ativa, tambm conhecido como seu perfil. O procedimento a seguir foi escrito usando configuraes de desenvolvimento do Visual Basic e Visual C# configuraes Development. Para exibir ou alterar as configuraes, escolha Import and Export Settings No menu Tools. Para criar um projeto de dispositivo

Visual C# Consolidado

1183

1.

(Visual Basic) No menu File em Visual Studio 2005, clique em New Project. ou (Visual C#) No menu File do Visual Studio 2005, aponte para New, e clique em Project.

2.

Project Types Na caixa New Project de dilogo, expanda Visual Basic Projects ou Visual C# Projects expandir Smart Device, e a plataforma desejados, como, Pocket PC 2003 clique em. Se no o idioma a ser exibido, no no primeiro expandir Other Languages. Esta tela regida pelo suas configuraes de desenvolvimento. Para exibir ou alterar as configuraes, clique Import and Export Settings no menu Tools.

3.

Em Templates, clique em qualquer modelo adequado para o que voc deseja, por exemplo, Pocket PC 2003 Class Library. Observao Um modelo que tem (1.0) seu nome desenvolvido para verso 1.0 do .NET Compact Framework. acrescentado ao Outros modelos so criados para verso 2.0.

4.

Na caixa Name, digite um nome para o projeto. Se uma Location caixa for exibida, verifique onde voc deseja armazenar os arquivos de projeto, e, em seguida clique em OK.

Para adicionar um projeto a uma soluo existente

No menu File, aponte para Add, e clique em New Project ou Existing Project. O New Project comando abre a New Project caixa de dilogo para que voc possa criar um novo projeto. O Existing Project comando abre a Add Existing Project caixa de dilogo para que voc possa selecionar um projeto j existente para incluso soluo atual.

Para Porta projetos existentes

As etapas para portabilidade projetos criados em uma verso anterior do Visual Studio so descritas na documentao geral Visual Studio Para gerenciar projetos. Para obter mais informaes, consulte Projetos e a compatibilidade com verses anteriores e Trabalhando com vrias verses do .NET Framework.

Como Compartilhar Cdigo Fonte Atravs de Plataformas (Dispositivos)


Voc pode compartilhar cdigo-fonte em plataformas usando constantes do compilador para diferenciar essas sees de cdigo que dependem do destino. Constantes permitidos so PocketPC, Smartphone,. e WindowsCE As plataformas devem direcionar a mesma verso do .NET Compact Framework. As etapas a seguir fornecem um exemplo simples da tcnica. Voc criar um aplicativo do Visual Basic Pocket PC, adicionar diretivas de compilador, executar o aplicativo, fech-la, e alterar para um aplicativo de Smartphone. Voc executar o aplicativo Smartphone para ver essa o texto da barra de ttulo ser alterado. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte

Visual C# Consolidado

1184

Configuraes do Visual Studio. Para criar e executar a verso Pocket PC 1. 2. 3. 4. 5. 6. 7. 8. No menu visual studio File, aponte para New, e clique em Project. Expanda Visual Basic no painel Project types,, e Smart Device Clique em Pocket PC 2003. No painel Templates, clique em Device Application (1.0), e clique em OK O acrescentadas (1.0) indica que este um projeto .NET Compact Framework verso 1.0. No designer, clique com o boto direito do mouse no formulrio e no menu de atalho, clique em Properties Desmarque o Text valor da propriedade do formulrio ou seja, facilitam em branco. No Solution Explorer, clique com o boto direito do mouse Form1.vb e depois no menu de atalho, clique em View Code. Expanda a Windows Form Designer generate code regio. Aps InitializeComponent() em pblica New() Sub, insira o cdigo a seguir:
#If PocketPC Then Me.Text = "PPC2003" #Else Me.Text = "Smartphone" #Endif

9.

No menu Debug, clique em Start Debugging.

10. Na caixa Deploy <Projectname> de dilogo, clique em Pocket PC 2003 SE Emulator, e clique em Deploy O aplicativo Pocket PC executado no emulador com PPC2003 na barra de ttulo do formulrio. Para criar e executar a verso Smartphone 1. 2. 3. 4. Feche o emulador sem salvar estado. Se uma mensagem for exibida indicando que a conexo foi perdida, clique em OK. No menu Project, clique em Change Target Platform. Na caixa Change to Na caixa Change Target Platform de dilogo, selecione Smartphone2003, e depois clique em OK. Na mensagem caixa avisando que o projeto ser fechado e reaberto, clique em Yes. Observe que a caixa Dispositivos de destino na barra de ferramentas agora exibe Smartphone 2003 SE Emulator. 5. 6. No menu Debug, clique em Start Debugging. Na caixa Deploy <Projectname> de dilogo, clique em Smartphone 2003 SE Emulator, e clique em Deploy O aplicativo Smartphone executado no emulador com Smartphone na barra de ttulo do formulrio.

Como Alterar Plataformas em Projetos de Dispositivos


Voc pode alternar constantemente entre plataformas no mesmo projeto. Por exemplo, se o objetivo for uma plataforma Pocket PC, voc pode alternar para direcionar uma plataforma Windows CE,, desde que a nova plataforma atinge a mesma verso do .NET Compact Framework como o destino original. Para alterar plataformas de destino em um projeto de dispositivo

Visual C# Consolidado

1185

1. 2.

No menu Project, clique em Change Target Platform. Na caixa Change to, selecione uma plataforma diferente, e clique em OK Somente as plataformas disponveis so aquelas que destino a mesma verso do .NET Compact Framework como o projeto ativo.

Como Atualizar Projetos para Verses Posteriores do .NET Compact Framework


Este procedimento atualiza a verso .NET Compact Framework de um projeto existente se uma verso posterior do .NET Compact Framework instalado no computador do desenvolvimento. Para atualizar um projeto para uma verso posterior do .NET Compact Framework 1. No menu Project, clique em Upgrade Project. Observao Se o Upgrade Project Comando no aparecer no menu, nenhuma verso posterior da plataforma est instalado no computador de desenvolvimento, e o processo de atualizao no est disponvel para o projeto atual. 2. Siga as instrues no prompt que aparece.

Gerenciando Trechos de Cdigo em Projetos Dispositivos


Visual Basic inclui uma biblioteca de cdigo do IntelliSense trechos de cdigo que voc pode inserir com alguns cliques do mouse para o aplicativo. Cada trecho executa uma tarefa de programao completa. Voc pode tambm criar seus prprios trechos de cdigo, adicion-los para a biblioteca, e ento us-las ao precisar deles. adicionou Visual Studio trechos que pertencem exclusivamente para projetos de dispositivo. Os atalhos para esses trechos todos comeam com os caracteres SD. Para obter mais informaes, consulte Trechos de Cdigo IntelliSense Visual Basic.

Como Verificar Suporte de Plataforma para Cdigo em Projetos de Dispositivos


Sempre Visual Studio valida que seu cdigo d suporte para a plataforma de destino e gera avisos se ele no estiver. Voc pode interromper cdigo sem suporte de implantao por stipulating que todos os avisos devem ser tratados como erros, para que a compilao falhar. Mesmo que ela compila, por exemplo, o seguinte cdigo Visual Basic, seria gerar um aviso ou erro em um aplicativo Smartphone porque Smartphone no oferece suporte botes.
Dim btn as System.Windows.Forms.Button btn = new System.Windows.Forms.Button() btn.Caption = "MyButton"

Para tratar todos os avisos como erros no Visual Basic

Visual C# Consolidado

1186

1. 2. 1. 2.

No Solution Explorer, clique com o boto direito do mouse <Projectname> e depois no menu de atalho, clique em Properties. Na guia Compile, selecione Treat all warnings as errors. No Solution Explorer, clique com o boto direito do mouse <Projectname> e depois no menu de atalho, clique em Properties. Na guia Build, selecione All na seo Treat warnings as errors.

Para tratar todos os avisos como erros no Visual C#

Como Manipular Eventos do HardwareButton (Dispositivos)


Usar um HardwareButton controle para substituir as teclas do aplicativo em um PC de bolso. Para atribuir um componente HardwareButton a uma chave aplicativo especfico 1. 2. 3. 4. 5. 6.
}

Na guia Device Components da Toolbox, arraste um HardwareButton componente em um formulrio do Windows ou na bandeja componente no designer. Na Bandeja de componente, clique com o boto direito do mouse no HardwareButton controle e no menu de atalho, clique em Properties Defina a AssociatedControl propriedade para o formulrio, por exemplo, Form1. Defina a HardwareKey propriedade para a chave voc deseja substituir, por exemplo, ApplicationKey1. Clique no boto, por exemplo, Soft Key 1. na capa do designer O editor de cdigo abre no manipulador Form_KeyDown de eventos. Insira o cdigo a seguir:
if ((int) e.KeyCode == (int) Microsoft.WindowsCE.Forms.HardwareKeys.ApplicationKey1) { //TODO

Normalmente voc deve usar a //TODO seo para iniciar um aplicativo.

Como: Alterar a orientao e resoluo de formulrios (Dispositivos)


Propriedades orientao (rotao) padro j so definidas para plataformas instaladas com Visual Studio. Use as etapas a seguir se voc precisar alterar as propriedades ou se voc tiver instalado um SDK em que essas propriedades esto incorretas ou lacking. Para alterar a orientao 1. 2. 3. 4. Clique Options no menu Tools, e Device Tools Clique em Form Factors. Selecione o fator de formulrio por exemplo, Pocket PC 2003 Portrait para o formulrio no projeto, e depois clique em Properties. Selecione Show skin in Windows Forms Designer e Enable rotation support. Clique OK para fechar a Form Factor Properties caixa de dilogo e clique OK novamente para fechar a Options caixa de dilogo. Observao Se o designer foi aberto quando voc alterou opes, feche e reabri-la para as alteraes sejam efetivadas.

Visual C# Consolidado

1187

5.

Clique com boto direito no designer, mouse o formulrio ou a capa, e seguida, selecione Rotate Left ou Rotate Right para girar a capa. Se o formulrio gira quando o dispositivo gira depende na plataforma atual e das definies de propriedade de formulrio, da seguinte maneira:

o o

Smartphone: O formulrio sempre gira quando gira o dispositivo. Pocket PC: O formulrio gira por padro quando o dispositivo gira. Para impedir que o formulrio de girar com o dispositivo, defina a WindowState propriedade do formulrio para Normal e a FormBorderStyle propriedade None. O formulrio Windows CE: No no girar por padro quando o dispositivo gira. Para tornar o formulrio giram com o dispositivo, defina a WindowState propriedade como Maximized. Clique Options no menu Tools, e Device Tools Clique em Form Factors. Selecione o fator de formulrio por exemplo, Pocket PC 2003 Portrait para o formulrio no projeto, e depois clique em Properties. Na caixa Form Factor Properties de dilogo, definir a resoluo vertical e horizontal. Clique OK para fechar a Form Factor Properties caixa de dilogo e clique OK novamente para fechar a Options caixa de dilogo. Observao Se o designer foi aberto quando voc alterou opes, feche e reabri-la para as alteraes sejam efetivadas.

Para alterar resoluo 1. 2. 3. 4.

Como Alterar o Dispositivo Padro (Projetos Gerenciados)


Use as seguintes etapas para alterar o dispositivo de destino padro em projetos gerenciados. Para selecionar um novo dispositivo de destino padro para um projeto gerenciado 1. 2. 3. No Solution Explorer, clique com o boto direito do mouse <Project name>. No menu de atalho, clique em Properties e selecione o Devices painel. Use a lista drop-down na caixa Target device Para selecionar um novo destino padro.

Como Otimizar a Ajuda para o Desenvolvimento de Dispositivos Inteligentes


Se voc selecionou Minimum ou Custom quando voc instalou a Biblioteca MSDN para Visual Studio, voc no ter todos os Visual Studio 2005 arquivos da Ajuda que esto disponveis para os desenvolvedores de dispositivo inteligente. Especificamente, a Minimum instalao no inclui seo Mobile e Embedded Development da biblioteca. A seo Mobile and Embedded Development inclui esses materiais como Pocket PC e Smartphone SDK documentao, informaes Windows CE, e assim por diante. Tpicos na seo geralmente so referenciados pela tpicos na seo Visual Studio inteligente Development dispositivo, da qual est sempre instalado e concentra-se no uso do Visual Studio ambiente para desenvolver aplicativos de dispositivo inteligente. Os procedimentos a seguir mostram como determinar o que ajuda voc instalou, como adicionar Mobile e Embedded Development ajuda, e como filtrar ajuda. Para verificar se a seo Mobile and Embedded Development ajuda est instalado

Visual C# Consolidado

1188

Clique em Pocket Guia do Desenvolvedor PC. Se o tpico exibido, a seo Mobile and Embedded Development est instalada. Se o tpico no for encontrado, voc pode adicionar a seo Mobile and Embedded Development, seguindo as etapas abaixo.

Para incluir tpicos Mobile e Embedded Development 1. 2. 3. 4. 5. 6. 7. 8. No Painel de controle, Windows clique em Add or Remove Programs. Selecionar MSDN Library for Visual Studio 2005, e, em seguida clique em Change. Na pgina Welcome da clique Setup WizardNext,. Na pgina Program Maintenance, clique em Modify. Na pgina Custom Setup, selecione Mobile and Embedded Development. No menu de atalho disponvel a partir do boto drop-down, selecione This feature, and all subfeatures, will be installed on local hard drive. Clique em Next. Na pgina Ready to Modify the Program, clique em Install.

Filtragem tpicos da Ajuda Fornece Visual Studio um filtro inteligente Development dispositivo para o ndice de Contedo e ndice. Quando voc aplica esse filtro, os tpicos visveis so reduzidos para incluir apenas documentao considerada bsica para os desenvolvedores de dispositivo inteligente. Mais importante, aplicar este filtro uma maneira excelente para exibir somente os subconjuntos de dispositivo inteligente de tpicos de referncia em tempo de execuo, incluindo .NET Compact Framework e as bibliotecas da MFC e ATL. Se voc aplicar um filtro de idioma (por exemplo, C Visual) #, tpicos de desenvolvimento de dispositivo inteligente so excludos dos tpicos visveis. Por esse motivo melhor para usar o filtro inteligente Development dispositivo ou nenhum filtro em todos os. Observe tambm que um filtro de idioma atribudo pelo padro caso voc tenha efetuado logon para Visual Studio usar uma configurao de desenvolvimento de idioma, como configuraes Development Visual C#.

Para definir o filtro inteligente Development dispositivo


1. 2. No menu visual studio Help, clique em Contents ou Index. Na caixa Filtered by, selecione Smart Device Development.

Para alterar a configurao de desenvolvimento


1. 2. No menu visual studio Tools, clique em Import and Export Settings. Na pgina Welcome do assistente, clique em Reset all settings, e clique em Next Se voc no tiver certeza da suas opes, pressione F1 para abrir o tpico da Ajuda para o assistente. 3. 4. Na pgina Save Current Settings, selecione se deseja salvar as configuraes atuais, e clique em Next. Na pgina Choose a Default Collection of Settings, selecionar General Development Settings, e clique em Finish

Como se Conectar ao Emulador de Dispositivo a partir de uma Sesso de PC Virtual Visual C# Consolidado 1189

Voc no pode usar TCP / IP para conectar ao emulador de dispositivo durante uma sesso virtual PC (VPC) porque VPC no oferece suporte o driver virtual chave de rede. O emulador precisa esse driver para uma conexo TCP / IP. Em vez disso, use as etapas a seguir. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Para conectar-se para o emulador durante uma sesso Virtual PC 1. 2. 3. 4. 5. 6. 7. Instalar 4.x Microsoft ActiveSync na imagem Virtual PC. No menu do ActiveSync File, clique em Connection Settings. Na caixa Connection Settings de dilogo, altere o transporte de conexo para DMA. Inicie o emulador. No menu visual studio Tools, clique em Device Emulator Manager. Na caixa Available Emulators, clique com o boto direito do mouse o emulador desejado, e clique Cradle no menu de atalho Siga as instrues no Assistente do ActiveSync para estabelecer uma parceria.

Como Acessar o Sistema de Arquivos do Emulador do Smartphone


O emulador Smartphone tenha nenhum Explorer arquivo. Use a tcnica a seguir para acessar o sistema de arquivos Smartphone. Para concluir o processo, voc deve ter o ActiveSync 4.0 ou posterior instalado. Antes de tentar usar o ActiveSync com um emulador, certifique-se de que nenhum dispositivo esteja conectado ao computador de mesa e que conexes USB esto desativadas no ActiveSync. Observao Se voc fechar o Gerenciador de emulador de dispositivo ou feche o emulador aps concluir as etapas a seguir, a conexo ActiveSync tambm fecha. Para acessar o sistema de arquivos do emulador Smartphone 1. 2. 3. 4. No menu visual studio Tools, clique em Device Emulator Manager. Na caixa Available Emulators, selecione o emulador cujo sistema arquivos voc deseja acessar. No menu Gerenciador Actions de emulador de dispositivo, clique em Connect. Um cone aparece ao lado o emulador selecionado indicando que uma conexo foi feita. Clique com o boto direito do mouse o emulador selecionado, e, em seguida clique em Cradle. As alteraes cone para mostrar o emulador est aninhado. 5. 6. Abra o ActiveSync. No menu do ActiveSync File, clique em Connection Settings.

Visual C# Consolidado

1190

7. 8.

Marque a Allow connections to one of the following caixa de seleo. Selecione DMA a partir da lista de portas, e depois clique em OK. O ActiveSync agora inicia uma parceria com o emulador. Siga as instrues fornecidas pelo New Partnership Wizard. Observao Se uma parceria no iniciada automaticamente, clique Connect na caixa Connection Settings de dilogo, e siga os prompts no Get Connected Wizard.

9.

Depois voc concluiu as etapas de parceria ActiveSync, clique em Explore Barra de Ferramentas ActiveSync para acessar o sistema de arquivos do emulador Smartphone no. Observao Sempre que desejar para usar um emulador conectado com Visual Studio usando o ActiveSync, usar o dispositivo, emulador, destino da plataforma correspondente no.

Como se Conectar Usando Bluetooth


As etapas a seguir descrevem como se conectar um dispositivo a seu computador de desenvolvimento com o Bluetooth. Para concluir o processo, voc deve ter o ActiveSync 4.0 ou posterior instalado. Para se conectar usando Bluetooth 1. 2. 3. 4. 5. 6. 7. No computador de desenvolvimento, verifique que a antena Bluetooth corretamente inserido e instalado. Na caixa de dilogo Propriedades Bluetooth no computador de desenvolvimento, altere a descoberta para ON. No dispositivo, toque no cone Bluetooth, e toque em Turn Bluetooth ON. Toque Bluetooth Manager. No menu Janela Bluetooth, clique New Para iniciar uma pesquisa por dispositivos habilitados Bluetooth-. Selecione o computador de desenvolvimento que voc deseja se conectar usando o ActiveSync. Quando solicitado, digite uma chave de acesso temporrio, e digite a mesma chave de acesso no computador de desenvolvimento rapidamente. Voc agora ter uma conexo Bluetooth com o dispositivo. Para configurar o ActiveSync, voc criar uma porta COM Virtual para esta conexo Bluetooth. Use as etapas a seguir. Para configurar ActiveSync 1. 2. 3. 4. No computador de mesa, v na configurao Bluetooth e adicione uma porta COM de entrada para a conexo Bluetooth. No ActiveSync, abrir a Connection Settings caixa de dilogo, e selecione Allow connections to one of the following. Selecione a porta COM do dispositivo Bluetooth, e clique em OK No dispositivo, inicie o ActiveSync.

Visual C# Consolidado

1191

5.

No menu do ActiveSync, toque Connect via Bluetooth. Agora voc deve ter uma conexo do ActiveSync.

Como se Conectar Usando Infravermelho


As etapas a seguir descrevem como se conectar um dispositivo a seu computador de desenvolvimento com porta de infravermelho (IR). Para concluir o processo, voc deve ter o ActiveSync 4.0 ou posterior instalado. Para configurar o computador de desenvolvimento 1. 2. 3. 4. 1. 2. 3. No computador de desenvolvimento, abra o Microsoft ActiveSync. No menu do ActiveSync File, clique em Connection Settings. Selecione Allow connections to one of the following. Selecionar Infrared Port (IR), e, em seguida clique em OK. Verifique se o dispositivo Porta de INFRAVERMELHO est apontando para o computador de desenvolvimento, porta de INFRAVERMELHO e est no intervalo boa. No dispositivo, abra o ActiveSync. No menu do ActiveSync Tools, toque Connect via IR. A conexo estabelecida.

Para configurar o dispositivo

Como se Conectar ao Device do Windows CE sem o ActiveSync


No automaticamente quando no estiver disponvel, Visual Studio 2005 o ActiveSync no copiar arquivos de conectividade necessrios, como um CEPC, para o dispositivo. Siga estas etapas para instalar esses arquivos no dispositivo, modificar a Visual Studio configurao de conexo, e estabelecer segurana do dispositivo. As duas primeiras etapas preparao do dispositivo e Visual Studio, necessidade de ser feito apenas uma vez. O ltimo conjunto de etapas, configurao de segurana e estabelecer a conexo, deve ser repetido sempre que voc quer se conectar de uma nova instncia do Visual Studio. Para preparar o dispositivo de conexo 1. Usando qualquer conexo com o dispositivo voc possui, copie os seguintes arquivos para a pasta \Windows\ no dispositivo. These files are located on the development computer by default at \Program Files\Common Files\Microsoft Shared\CoreCon\1.0\Target\wce400\<CPU>. Clientshutdown.exe ConmanClient2.exe CMaccept.exe eDbgTL.dll TcpConnectionA.dll A partir do prompt de comando no dispositivo, execute conmanclient2.exe. Determinar o endereo IP do dispositivo. No menu visual studio Tools, clicar Options, clicar Device Tools, e clique em Devices.

o o o o o

2. 3. 1.

Para preparar Visual Studio para conectar

Visual C# Consolidado

1192

2. 3. 4. 5.

Selecionar Windows CE Device, e, em seguida clique em Properties. Para direita caixa Transport, clique em Configure. Na caixa Configure TCP/IP Transport de dilogo, selecionar Use specific IP address, e digite o endereo IP do dispositivo. Feche as caixas de dilogo. Uma caixa de mensagem pode exibida solicitando que voc para redefinir o dispositivo. Nesse caso, uma redefinio de disco suficiente.

Para definir a segurana e estabelecer a conexo 1. 2. No prompt de comando no dispositivo, execute cMaccept.exe. Se em trs minutos, conectar o dispositivo. Se voc estabelecer a sua primeira conexo em trs minutos, voc pode continuar implantao e depurao indefinidamente, desde que voc estiver usando a mesma Visual Studio instncia. Se voc precisa se conectar de outra instncia do Visual Studio, voc precisar executar essas etapas de segurana novamente. Observao de segurana Voc pode eliminar a etapa cMaccept, desativando a segurana no dispositivo. Do Editor do Registro remoto para fazer isso, use para definir HLKM\CoreConOverrideSecurity = 1. Desativar segurana expe seu dispositivo para ataques mal-intencionados e no recomendado a menos que voc tiver fornecido protees apropriadas.

Como Acessar Arquivos de Computador de Desenvolvimento a partir do Emulador


As etapas a seguir demonstram como usar Pasta compartilhamento para acessar arquivos no computador de desenvolvimento do emulador de dispositivo. Observao Emuladores Smartphone normalmente no tem visualizadores de arquivo para o visualizador arquivos remota usado no Smartphone teste etapas a seguir. Para obter mais informaes, consulte Visualizador de arquivos remoto. Para configurar uma pasta compartilhada 1. 2. 3. 4. 1. 2. No computador de desenvolvimento, crie uma pasta a ser compartilhada entre o computador de desenvolvimento e o emulador de dispositivo. No menu emulador File de dispositivo, clique em Configure. Na caixa Shared folder do guia General, digite ou navegue at a pasta compartilhada no computador de desenvolvimento. Clique em OK. No emulador Pocket PC, abra File Explorer. Toque e selecione My Device. A Storage Card entrada a pasta compartilhada. Para testar sua pasta compartilhada no emulador Smartphone

Para testar sua pasta compartilhada no emulador Pocket PC

Visual C# Consolidado

1193

1.

No menu Windows Start, aponte para All Programs, aponte para Microsoft Visual Studio 2005, em seguida, aponte para Visual Studio Remote Tools, e clique em Remote File Viewer. No Select a Windows CE Device, selecione o emulador Smartphone, e, em seguida, clique OK para abrir a Windows CE Remote File Viewer janela. A Storage Card entrada a pasta compartilhada.

2.

Como Configurar Opes de Conexo (Dispositivos)


oferece Visual Studio 2005 vrias opes para conectar o computador de desenvolvimento para um dispositivo. Utilize a Device Properties caixa de dilogo para gerenciar essas conexes. ships Visual Studio com conexes do emulador defaulted para o transporte de DMA e dispositivos fsicos defaulted ao TCP / IP. Para definir opes de conexo 1. 2. No menu visual studio Tools, clique em Options. Expanda Device Tools, clique em Devices, selecione um dispositivo ou emulador, e clique em Properties. Use as caixas de dilogo associada para selecionar e configurar suas conexes.

Diferenas entre depuradores de dispositivos e de desktop


rea de trabalho debuggers suporte, com as seguintes excees depuradores dispositivo oferecer suporte a maioria dos mesmos recursos. Editar e continuar sem suporte Suporte no fazer depuradores dispositivo para a capacidade de editar a fonte e continuar enquanto no modo de interrupo. Se voc quiser modificar o seu cdigo durante a depurao, voc precisa para interromper a depurao, editar seu cdigo, e reinicie com as fontes modificados. Se voc tentar alterar seu cdigo enquanto no modo de interrupo, o depurador emite um aviso. Funo evaluation no aceita no depurador nativo O depurador de dispositivo nativo no oferece suporte Funo evaluation. Voc no pode digitar em uma expresso que contm uma funo dentro dela e a funo avaliada e o resultado ter retornado. Funo evaluation no suporte o depurador dispositivo gerenciado. Interoperabilidade limitaes de depurao Voc no pode depurar cdigo nativo e gerenciados em uma nica instncia do depurador. Para depurar aplicativos que possui mistos cdigo gerenciado e nativo (ou cdigo que usa pInvoke gerenciado), definir pontos de interrupo no cada seo onde voc deseja comear depurao atravs de seu cdigo. Em seguida, anexar o depurador necessrio para uma determinada seo (por exemplo, uma seo gerenciada). Desanexar que depurador e anexe a outra quando o outro for necessria. Voc pode repetir essas Detach / anexar etapas com freqncia conforme necessrio para percorrer o programa..

Visual C# Consolidado

1194

No h suporte atualmente para usando as instncias de depurao dois ao mesmo tempo no mesmo processo. Atributo-Based depurao sem suporte O.NET Compact Framework no oferece suporte baseado no atributo-depurao. A capacidade de definir atributos para visualizadores e assim por diante, portanto, no est disponvel para usurios dos depuradores do dispositivo. rea de trabalho Depurao No com suporte Voc no pode usar os depuradores do dispositivo para depurar aplicativos escritos para rea de trabalho. Use os depuradores de mesa. Ncleo depurao sem suporte Voc no pode usar os depuradores do dispositivo para depurao do ncleo. Apenas meus depurao no aceita do cdigo No possvel usar apenas cdigo meu depurao. Adies depurador Runtime (Cordbg.exe) O depurador Runtime ajuda fornecedores ferramentas e desenvolvedores localizar e corrigir erros em programas que destino o Common Language Runtime (CLR).Net Framework. Projetos de dispositivo adicionar um novo comando e um novo argumento de modo ao depurador Runtime. A sintaxe para o novo comando e argumento de modo (dentro uma sesso Cordbg.exe) descrita na tabela abaixo. Para obter mais informaes e sintaxe completa, consulte Depurador Runtime (Cordbg.exe). Comando [mode Descrio EmbeddedCLR um argumento de modo que define o depurador como projetos de dispositivo de destino. Para controlar essa configurao, especifique 1 para on ou 0 para off. Conecta a um dispositivo CLR incorporado remoto. Parmetros: Machine_name Necessrio. O nome ou endereo IP do computador remoto. Port Necessrio. A porta para usar para conectar-se para o computador remoto. Problemas de Conexo Desativando o dispositivo enquanto o depurador est sendo executado faz o depurador para fechar por causa da falha de conexo. A falha de conexo ocorre porque o aplicativo ainda est sendo executado em segundo plano para o dispositivo. O boto X no Pocket PC um recurso

conn[ect] machine_name port

Visual C# Consolidado

1195

inteligente minimizar e no no fechar o aplicativo. Em vez dele define o aplicativo para executar em segundo plano. Para corretamente fechar um aplicativo executado em segundo plano em um PC de bolso, no menu Start, toque Settings, toque na System guia e toque em Memory. Na guia Running Programs, selecione o aplicativo que voc deseja fechar, e toque Stop.

Como: Anexar a processos de dispositivo gerenciados


Voc anexar a um processo em um dispositivo do muito o mesmo modo como voc faria na rea de trabalho, exceto que voc deve definir uma chave de Registro no dispositivo para ativar depurao gerenciado se o processo est sendo executado sem o depurador j. A configurao dessa chave persiste at voc alter-lo, ou, no caso de um emulador, at que o emulador seja fechado sem salvar suas configuraes. Observao Definio da chave de depurao do dispositivo reduz o desempenho. Quando voc no est depurando, redefinir a chave. Uma mensagem de erro exibida se voc tentar se anexar dois depuradores ou tente se conectar com um depurador gerenciado quando a chave registro dispositivo no tiver sido definida. Voc pode iniciar um processo de vrias formas, incluindo Explorer arquivo, da linha de comando, e assim por diante. Na etapa seguinte, voc iniciar o processo por iniciar a partir do Debug menu. Voc pode tambm iniciar um processo sem o depurador gerenciado, e depois anex-lo posteriormente. Se o objetivo for uma plataforma Windows CE gerada a partir construtor Platform, voc precisar ter a biblioteca toolhelp.dll para preencher o Available Processes painel. Esta biblioteca est includa no SDKs Windows Mobile. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Depurar um processo gerenciado

Para depurar um processo gerenciado

No menu Debug, clique em Start. Observao Anexe se voc desconectar-se de processos iniciados no menu Debug, voc no pode novamente sem executar as seguintes etapas para anexar aps um processo est sendo executado. Isto , a chave do Registro para o dispositivo a ser definido.

Visual C# Consolidado

1196

Anexar a um j est em execuo Managed processo Se voc planeja fazer anexar a um processo que j est executando, por, por exemplo, clicando Start Without Debugging e ento anexar a processo gerenciado em execuo, precisar primeiro definir a chave registro dispositivo antes do incio do processo e voc tentar se conectar usando a Attach to Process caixa de dilogo antes. As seguintes etapas detalham o processo.

Para definir a chave do Registro do dispositivo para ativar anexar a um processo em execuo
1. 2. 3. 4. 5. No menu Windows Start, aponte para All Programs, aponte para Microsoft Visual Studio 2005, aponte para Visual Studio Tools, e clique em Remote Registry Editor. Usando o Editor do Registro remoto, se conectar o dispositivo. Para navegar ou crie a seguinte chave: depurador HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ .NETCompactFramework\Managed Definir ou crie um valor DWORD nomeado AttachEnabled. Definir os dados para o valor em 1. Observao Definio da chave de depurao do dispositivo significativamente reduz o desempenho. Quando voc no est depurando, desativar gerenciado anexar, redefinindo o valor de dados para 0 ou excluir o AttachEnabled valor. 6. Feche o Editor do Registro remoto. Gerenciado anexar. e voc podero para iniciar um processo sem o depurador e, em seguida, anexar ao processo usando a Attach to Process caixa de dilogo est ativado,

Para anexar a processo gerenciado aps o processo est sendo executado


1. 2. 3. 4. Aps definir a chave conforme descrito nas etapas anteriores, iniciar um processo sem o depurador. No menu Tools, clique em Attach to Process. Na caixa Transport, clique em Smart Device. Na caixa Qualifier, clique em Browse. Observao A Qualifier caixa prepopulated com os dispositivos usados recentemente da sesso atual. 5. 6. Na caixa Connect to Device de dilogo, marque a plataforma, o dispositivo, e clique em Connect. No painel Available Processes, selecione um ou mais processos para anexar a, e clique em Attach. Observao Por padro, Tipo de cdigo definido automaticamente para Managed (.NET Compact Framework) se estiver disponvel,. caso contrrio para Native (Smart Device) Para substituir as configuraes padro, clique Select para abrir a Select Code Type caixa de dilogo. Observe que

Visual C# Consolidado

1197

voc no pode selecionar ambos. Observao No h suporte para interoperabilidade depurao. Isto , voc no pode depurar os dois tipos cdigo gerenciado e nativo ao mesmo tempo. Desanexar do ou Terminate um processo

Para desconectar-se de ou encerrar um processo


1. 2. 3. No menu Debug, aponte para Windows, e clique em Processes. Clique com boto direito na janela Processes, mouse o processo voc deseja desanexar do ou terminar. No menu de atalho, clique em Terminate Process ou Detach from Process. Observao Voc pode reabri caixa Attach to Process de dilogo a partir neste mesmo menu de atalho. Preencher o painel de processos disponveis

Para preencher o painel processos disponveis no Windows CE projetos

Incluir o toolhelp.dll arquivo na imagem de sistema OPERACIONAL do Windows CE. ou O toolhelp.dll arquivo copiar manualmente para o dispositivo de destino.

Como Alterar as Configuraes do Registro do Dispositivo:


Use o Editor do Registro Remoto para alterar configuraes do Registro para o dispositivo. Para alterar as configuraes do Registro 1. 2. No menu Windows Start, aponte para All Programs, aponte para Visual Studio 2005, aponte para Visual Studio Remote Tools, e clique em Remote Registry Editor. Na janela Select a Windows CE Device, clique no dispositivo de destino cujo Registro voc deseja editar. Um n que representa o registro do dispositivo de destino exibido no painel esquerdo da Registry Editor. 3. Expanda o n para fazer as alteraes.

Passo-a-passo: Depurando uma Soluo que Inclui Cdigo Cdigo Gerenciado e Cdigo Nativo
Essa explicao passo a passo Fornece as etapas para depurao uma soluo que inclui ambas gerenciado,.NET Compact Framework e componentes nativos. No Visual Studio 2005 oferece suporte interoperabilidade Depurao de aplicativos do dispositivo como tal. Isto , voc no pode ter os depuradores nativos e gerenciados anexados ao mesmo tempo.

Visual C# Consolidado

1198

A tcnica recomendada para depurao uma soluo que incorpora elementos tanto nativos quanto gerenciados a anexar o depurador necessrio para uma determinada seo, por exemplo, uma seo gerenciada, e desanexar que depurador e anexar a outra quando o outro for necessria. Voc pode repetir essas Detach / anexar etapas com freqncia conforme necessrio para percorrer o programa. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings (Importar e Exportar Configuraes) no menu Tools (Ferramentas). Para obter mais informaes, consulte Configuraes do Visual Studio. Essa explicao passo a passo foi escrito usando configuraes Development Visual C#. Ele contm as sees a seguir:

Ativar anexo do depurador gerenciado Iniciar o aplicativo Definir um ponto de interrupo no cdigo nativo Anexando com o depurador nativo Executando para o ponto de interrupo Native Anexando com o depurador gerenciado Definir um ponto de interrupo no cdigo gerenciado Executando para o ponto de interrupo gerenciado Concluso Pr-requisitos

Essa explicao passo a passo depende da soluo criada com outro explicao passo a passo, Passo-a-passo: Hello World: Um exemplo de interoperabilidade COM para dispositivos inteligentes. Certifique-se de que essa explicao passo a passo hello world possui com xito criado e executado foi. Ativar anexo do depurador gerenciado Por padro, dispositivos, incluindo emuladores, no permitir o depurador gerenciado para anexar a processos que j esto em execuo. Anexar o depurador gerenciado a um processo j em execuo uma situao que geralmente encontrados em solues de dispositivo que incluir cdigo gerenciado e nativo. A primeira etapa, em seguida, para definir o dispositivo para permitir que o depurador gerenciado para anexar a um processo j em execuo. Faa isso definindo uma chave do Registro para o dispositivo. Observao Definio da chave afeta somente anexando a processos gerenciados j-execuo. Ele no afeta iniciar um projeto usando Start with Debugging (F5). No entanto, se voc desconectar aps Start with Debugging, ser necessrio este processo para anexe novamente e iniciar a depurao

Visual C# Consolidado

1199

novamente.

Para ativar o depurador gerenciado para anexar a um processo em execuo


1. 2. 3. No menu Windows Start, aponte para All Programs, aponte para Visual Studio 2005, aponte para Visual Studio Remote Tools, e clique em Remote Registry Editor. Na janela Select a Windows CE Device, expandir Pocket PC 2003, e clique em Pocket PC 2003 SE Emulator. Este o dispositivo de destino para essa explicao passo a passo. Clique em OK. A Connecting to Device janela de andamento abre, seguido pela abertura do emulador de dispositivo e CE Windows o Editor do Registro remoto. 4. No Editor do Registro, expandir Pocket PC 2003 SE Emulator, e crie a seguinte chave: depurador HKEY_LOCAL_MACHINE\SOFTWARE\Microsot\ .NETCompactFramework\Managed. Criar a chave, com o boto direito do mouse .NETCompactFramework, apontando para New, e, em seguida, clicando em Key. Observe que h um espao entre " Managed " e " depurador ". 5. Criar uma DWORD chamado AttachEnabled. Criar a DWORD clicando com o boto direito do mouse Managed Debugger, apontando para New, e, em seguida, clicando em DWORD Value. 6. Definir como AttachEnabled o Name, e como 1 o Value. Observao Definir essa chave de depurao do dispositivo significativamente reduz o desempenho. Quando voc no est depurando, desativar essa funcionalidade, redefinindo o valor de dados para 0. 7. Deixe o emulador de dispositivo aberto para as etapas restantes para preservar a configurao do Registro. Voc pode fechar o Editor do Registro. Iniciar o aplicativo A prxima etapa para iniciar o aplicativo InteropSolution.

Para iniciar o aplicativo


1. Abra a soluo que voc criou na Passo-a-passo: Hello World: Um exemplo de interoperabilidade COM para dispositivos inteligentes. Certifique-se que Pocket PC 2003 SE Emulator aparece na caixa Target Device Na barra de ferramentas. 2. No menu visual studio Debug, clique em Start Debugging ou pressione F5. Essa etapa imediatamente implanta o projeto nativo, HelloCOMObject, para o emulador sem interveno do usurio mais. 3. Quando a Deploy SayHello caixa de dilogo Abrir, selecione Pocket PC 2003 SE Emulator, e depois clique em Deploy. Essa etapa implanta o projeto gerenciado. O aplicativo abre no emulador. No clique o boto ainda.

Visual C# Consolidado

1200

Definir um ponto de interrupo no cdigo nativo A prxima etapa configurar um ponto de interrupo no cdigo nativo para preparar para anexar o depurador nativo.

Para definir um ponto de interrupo no cdigo nativo


1. 2. No Solution Explorer, clique com o boto direito do mouse Hello.cpp e depois no menu de atalho, clique em View Code. Insira um ponto de interrupo na linha que comea *text clicando na margem esquerda do editor do cdigo. O smbolo ponto de interrupo aparece como um crculo vazio com um ponto de exclamao, indicando que atualmente no possvel resolver o ponto de interrupo. Isso ocorre porque no possui o smbolos corretos e fontes no momento. 3. No menu visual studio Debug, aponte para Windows, e clique em Modules. A Modules janela exibe todos os mdulos carregados at agora, por exemplo, o aplicativo gerenciado SayHello.exe. Observe que o HelloCOMObject.dll nativo ainda no foram carregada, porque voc no tiver clicado no boto no aplicativo. Anexando com o depurador nativo A prxima etapa para desanexar o depurador gerenciado para que voc pode anexar com o depurador nativo. Lembre-se que ambos os depuradores no podem ser anexados ao mesmo tempo para projetos de dispositivo. Essas so as etapas voc usaria qualquer tempo necessrio para alternar entre o gerenciado e o depurador nativo.

Para anexar com o depurador nativo


1. No menu visual studio Debug, clique em Detach All. Essa etapa desanexa o depurador gerenciado mas permite que o aplicativo para continuar sendo executado. 2. 3. 4. 5. 6. 7. 8. No menu Debug, clique em Attach to Process. Na caixa Transport, selecione Smart Device. Para preencher a Qualifier caixa, clique em Browse. Na caixa Connect to Device de dilogo, selecionar Pocket PC 2003 SE Emulator, e clique em Connect Para preencher a Attach to caixa, clique em Select. Na caixa Select Code Type de dilogo, marque Debug these code types e desmarque a Managed caixa de seleo, a Native caixa de seleo e, em seguida, clique em OK. Na caixa Available Processes Selecionar SayHello.exe, e clique em Attach Voc est agora conectado com o depurador nativo. Executando para o ponto de interrupo Native Voc est pronto para avanar para o ponto de interrupo voc definir no cdigo nativo. Quando voc examine a Modules janela novamente, voc v nativo mdulos agora apresentar. No entanto, HelloCOMObject.DLL ainda no est carregado porque voc ainda no clicou button1. Observao

Visual C# Consolidado

1201

Se voc executou essa explicao passo a passo anterior, smbolos de depurao j podem ser carregados, e voc pode ignorar essas etapas. Caso contrrio, a seo a seguir fornece as etapas para carreg-los.

Para avanar execuo para o ponto de interrupo nativo


1. No formulrio Emulador de dispositivo, clique em button1. O mundo hello! mensagem aparece no formulrio, e hellocomobject.dll aparece na janela Modules. Se a Symbol Status coluna de hellocomobject.dll apresentaes No symbols loaded, siga estas etapas: 1. 2. Clique com o boto direito do mouse hellocomobject.dll e, em seguida no menu de atalho, clique em Load Symbols. Na caixa de dilogo da Find Symbols, navegue at InteropSolution\HelloCOMObject\Pocket PC 2003 (ARMV4)\Debug\HelloCOMObject.pdb. Clique em Open. A Symbol Status coluna altera de No symbols loaded para Symbols loaded, e agora o indicador ponto de interrupo mostre o ponto de interrupo como resolvido. 2. Sobre o formulrio no emulador de dispositivo, clique OK da Hello World! janela, em
button1 novamente.

3.

O indicador ponto de interrupo mostra que a execuo parou no ponto de interrupo. 3. No menu Debug, clique em Step into OU pressione F11. Observe que a execuo movido para a linha seguinte. Isso mostra que voc pode percorrer a parte da sua soluo nativa agora. Anexando com o depurador gerenciado A prxima etapa para desanexar o depurador nativo para que voc pode anexar com o depurador gerenciado. Lembre-se que ambos os depuradores no podem ser anexados ao mesmo tempo para projetos de dispositivo. Essas so as etapas voc usaria qualquer tempo necessrio para alternar do nativo para o depurador gerenciado.

Para anexar com o depurador gerenciado


1. 2. 3. 4. No menu visual studio Debug, clique em Detach All. Essa etapa desanexa o depurador nativo, mas o aplicativo continua a executar. No menu Debug, clique em Attach to Process e garantir que a Transport caixa contm Smart Device. Preencher a Qualifier caixa, clicando Select, selecionar Pocket PC 2003 SE Emulator, clique em Connect. Para preencher a Attach to caixa, clique em Select Selecionar Debug these code types, e marque a Managed caixa, desmarque a Native caixa e, em seguida, clique em OK. Se aparecer uma mensagem lembr-lo que gerenciado e nativo depurao no so compatveis, clique em OK. 5. Na caixa Available Processes Selecionar SayHello.exe, e clique em Attach Agora o depurador gerenciado est conectado.

Visual C# Consolidado

1202

Definir um ponto de interrupo no cdigo gerenciado A prxima etapa para definir um ponto de interrupo no cdigo gerenciado para preparar para conectar o depurador gerenciado.

Para definir um ponto de interrupo no cdigo gerenciado


1. 2. No Solution Explorer, clique com o boto direito do mouse Form1.cs e depois no menu de atalho, clique em View Code. Insira um ponto de interrupo na linha string text;. Executando para o ponto de interrupo gerenciado Voc est pronto para avanar para o ponto de interrupo voc definir no cdigo gerenciado.

Para avanar execuo para o ponto de interrupo gerenciado

No emulador de dispositivos, clique em button1. A execuo pra no ponto de interrupo. Concluso

Por razes de desempenho, lembre-se redefinir a chave do Registro do dispositivo como 0 quando voc no for mais necessrio anexar o depurador gerenciado a um processo j em execuo. Consulte tambm

Como Gerar Cdigo SqlCeResultSet (Dispositivos)


As seguintes etapas presumem tiver um banco de dados do SQL Server Mobile disponvel na janela Data Sources. Para obter mais informaes, consulte Como Criar um Banco de Dados SQL Server Mobile (Dispositivos) ou Como Adicionar um Banco de Dados SQL Server Mobile a um Projeto de Dispositivo. Em um dispositivo projeto, Visual Studio por padro gera cdigo para somente um DataSet. Voc pode alterar esse valor padro para gerar um resultset em vez disso, ou para gerar ambos. Para obter mais informaes sobre as diferenas entre os dois tipos, consulte Resultsets versus DataSets (dispositivos). As opes ResultSet e ResultSet / DataSet tm suporte somente para arquivos.xsd criados contra conexes SQL Server Mobile. A opo DataSet tem suporte para todas as conexes, e o cdigo gerado pelo padro. Observao Se voc desejar converter um aplicativo DataSet existente para um aplicativo resultset, defina a Custom Tool propriedade para MSDataSetResultSetGenerator. Essa configurao gera os dois tipos de classes de acesso a dados. Em seguida, voc pode migrar seu cdigo de uma rede para a outra sem erros de compilao. Depois de migrar o cdigo, defina a Custom Tool propriedade para MSResultSetGenerator. Recrie para confirmar se todos os uso DataSet foi removido do cdigo. Para gerar cdigo para Resultsets somente

Visual C# Consolidado

1203

1. 2. 3. 1. 2. 3. 1. 2. 3.

No Solution Explorer, clique com o boto direito do mouse no arquivo.xsd banco de dados e clique Properties no menu de atalho Definir o Custom Tool valor como MSResultSetGenerator. Recrie a soluo. No Solution Explorer, clique com o boto direito do mouse no arquivo.xsd banco de dados e clique Properties no menu de atalho Definir o Custom Tool valor como MSDataSetGenerator. Esse valor o valor padro. Recrie a soluo. No Solution Explorer, clique com o boto direito do mouse no arquivo.xsd banco de dados e clique Properties no menu de atalho Definir o Custom Tool valor como MSDataSetResultSetGenerator. Recrie a soluo.

Para gerar cdigo para DataSets somente

Para gerar cdigo para Resultsets e DataSets

Como Alterar a Seqncia de Caracteres de Conexo do Tempo de Design (Dispositivos)


Uma seqncia de conexo Design-time criada por padro quando voc cria uma fonte de dados SQL Mobile para seu projeto. Usa Visual Studio esta seqncia para se conectar ao banco de dados em tempo de criao para recuperar informaes de esquema. Durante o curso de desenvolvimento do projeto, talvez queira alterar essa seqncia. Observao Distinguir essa seqncia de seqncia de conexo em tempo de execuo. Para obter mais informaes, consulte Propriedade Connection String Property, File Properties Dialog Box (Devices). Para alterar a seqncia de conexo Design-time 1. 2. 3. 4. Duas no Solution Explorer, vezes no arquivo.xsd para abrir o DataSet Designer. Clique com o boto direito do mouse e, em seguida clique Properties no menu de atalho. o TableAdapter, Expanda a Connection propriedade. Digite um novo valor para ConnectionString.

Como Alterar a Seqncia de Caracteres de Conexo de Tempo de Execuo (Dispositivos)


Quando voc adiciona uma fonte de dados a um projeto, uma seqncia de conexo gerada no arquivo.xsd. Essa seqncia considerada uma seqncia de conexo Design-time, adequada para se conectar Visual Studio fonte de dados em tempo de design. Essa mesma seqncia de conexo serve como a seqncia de conexo em tempo de execuo padro. Se voc precisar uma seqncia de conexo diferentes quando o aplicativo executado em um dispositivo, voc pode especificar a seqncia de tempo de execuo usando as seguintes etapas. Para obter mais informaes, consulte Propriedade Connection String Property, File Properties Dialog Box (Devices).

Visual C# Consolidado

1204

Para alterar a seqncia de conexo em tempo de execuo 1. 2. 3. No Solution Explorer, selecione o arquivo.xsd. No menu View, clique em Properties Window. Digitar uma seqncia de conexo em tempo de execuo para a Connection String propriedade.

Como Adicionar Botes de Navegao (Dispositivos)


Usar estes procedimentos para fornecer botes de navegao para exibir linhas diferentes em uma fonte de dados. Essa tcnica funciona em torno a falta de suporte .NET Compact Framework para a DataNavigator classe do .NET Framework. As etapas abaixo, escrito em C# e contar com a tabela Clientes do banco de dados Northwind, suponha que voc tiver um DataSet ou resultset na janela Data Sources. Para obter mais informaes, consulte Como Adicionar um Banco de Dados SQL Server Mobile a um Projeto de Dispositivo.Em um projeto real, voc incluiria limites verificao, que no exibido nos exemplos de cdigo aqui. Para configurar o para adicionar navegao botes 1. 2. 3. 4. 5. Arrastar e soltar uma tabela da janela Data Sources para um formulrio do Windows. Arraste e solte um boto no formulrio. Defina a Text propriedade do boto apropriadamente (por exemplo, ' Avanar '). Clique duas vezes no boto no formulrio para abrir o Editor de Cdigo no boto clique manipulador de eventos. Usar os exemplos de cdigo a seguir ao cdigo First, Next, Previous. e Last Boto manipuladores de eventos Tipo this.customersBindingSource.MoveFirst(); Tipo this.customersBindingSource.MoveNext(); Tipo this.customersBindingSource.MovePrevious(); Tipo this.customersBindingSource.MoveLast();

Para cdigo um boto primeiro

Para cdigo um boto Avanar

Para cdigo um boto anterior


Para um boto ltimo cdigo

Como Persistir Alteraes de Dados no Banco de Dados (Dispositivos)


Usar estes procedimentos para manter as alteraes feitas em dados em projetos de dispositivo. As etapas abaixo, escrito em C# e contar com a tabela Clientes do banco de dados Northwind, suponha que voc tiver um DataSet (no qualquer outro tipo de fonte de dados) na Data Sources janela. Para obter mais informaes, consulte Como Adicionar um Banco de Dados SQL Server Mobile a um Projeto de Dispositivo. Para tornar dados alteraes o banco de dados 1. 2. Arraste uma tabela da janela Data Sources at um formulrio do Windows. Arraste um boto para o formulrio.

Visual C# Consolidado

1205

3. 4. 5.

Alterar a Text propriedade do boto para Save. Clique duas vezes no boto no formulrio para abrir o Editor de Cdigo no boto clique manipulador de eventos. Digite o seguinte cdigo:
this.customersBindingSource.EndEdit(); this.customersTableAdapter.Update(this.northwindDataSet. Customers);

Como Criar um Banco de Dados SQL Server Mobile (Dispositivos)


Voc pode criar um banco dados do SQL Server Mobile se voc tiver um projeto abrir ou no. Se o banco de dados est se torne parte de um projeto, considere cri-lo dentro do projeto como uma fonte de dados para o projeto. Mesmo se voc criar o banco de dados fora de um projeto, voc pode adicion-lo a um projeto mais tarde. Para obter mais informaes, consulte Como Adicionar um Banco de Dados SQL Server Mobile a um Projeto de Dispositivo. Observao SQL Server Mobile no oferece suporte abrir arquivos de banco de dados em um compartilhamento de rede. Para criar o banco de dados fora um projeto 1. 2. 3. 4. 5. 6. 1. 2. 3. 4. 5. 6. 1. 2. 3. 4. No menu View, clique em Server Explorer. Clique com o boto direito do mouse Data Connections e clique Add Connection para abrir a Add Connection caixa de dilogo. Clique Change para abrir a Change Data Source caixa de dilogo. Na caixa Data source Selecionar Microsoft SQL Server Mobile Edition, e clique em OK Selecionar Microsoft SQL Server Mobile Edition, e, em seguida clique em OK. Continue com " para continuar o processo e configurar a conexo " abaixo. Com um projeto aberto, clique Add New Data Source no menu Data. O Data Source Configuration Wizard abre. Na pgina Choose a Data Source Type, selecionar Database, e clique em Next Na pgina Choose Your Data Connection, clique New Connection para abrir a Add Connection caixa de dilogo. Clique Change para abrir a Change Data Source caixa de dilogo. Selecionar Microsoft SQL Server Mobile Edition, e, em seguida clique em OK. Continue com " para continuar o processo e configurar a conexo " abaixo. Na caixa Add Connection de dilogo, selecione My Computer. Clique em Create. Na caixa Create New SQL Server 2005 Mobile Edition Database de dilogo, digite um caminho totalmente qualificado para o novo banco de dados (por exemplo, c:\MyDB). Do New Password em e Confirm Password caixas, digite uma senha (por exemplo, MyPassword) como a senha para o novo banco de dados, e clique em OK.

Para criar o banco de dados em um projeto

Para continuar o processo e configurar a conexo

Visual C# Consolidado

1206

Observao de segurana Para projetos que sero usados em aplicativos do mundo real, escolha uma senha de alta segurana. 5. Na caixa Add Connection de dilogo, clique Test Connection para garantir que a conexo foi feita. Uma mensagem aparece, indicando que a conexo de teste xito. Observao SQL Server Mobile no oferece suporte abrir arquivos de banco de dados em um compartilhamento de rede. 6. 7. Clique OK para retornar para a Add Connection caixa de dilogo e clique OK para fechlo. Na pgina Choose Your Data Connection, selecione Yes, include sensitive data in the connection string. Observao de segurana Para projetos que sero usados em aplicativos do mundo real, voc deve escolher a exclude dados confidenciais da seqncia de conexo. No mnimo, voc deve garantir que os dados confidenciais so criptografados. 8. Clique em Next. Ser a Local database file caixa de mensagem exibida inquiring se voc deseja incluir o arquivo de dados no projeto atual. Clique em Yes. 9. Na pgina Choose Your Database Objects, selecione as tabelas ou outros objetos que deseja incluir no seu projeto. Agora voc pode exibir o novo banco de dados como um DataSet na janela Data Sources clicando Show Data Sources no Data menu. Para adicionar tabelas, colunas, restries, e assim por diante para o banco de dados, consulte Gerenciar fontes de dados em projetos de dispositivo.

10. Clique em Finish.

Como Adicionar um Banco de Dados SQL Server Mobile a um Projeto de Dispositivo


As seguintes etapas presumem tiver um banco de dados do SQL Server Mobile disponvel na janela Server Explorer. Para obter mais informaes, consulte Como Criar um Banco de Dados SQL Server Mobile (Dispositivos). Para adicionar um banco de dados do SQL Server Mobile como uma fonte de dados 1. 2. 3. Com um projeto Smart Device aberto, clique Add New Data Source no menu Data. Na pgina Choose a Data Source Type, selecionar Database, e clique em Next Na pgina Choose Your Data Connection, selecione a seqncia de conexo de dados que contm o nome do seu banco de dados, e clique em Next

Visual C# Consolidado

1207

Esta conexo deve ser exibida na caixa suspensa se seu banco de dados j estiver disponvel em Server Explorer. Se a conexo de banco de dados no aparecer na lista, clique New Connection para abrir a Add Connection caixa de dilogo, clique Browse para abrir a Select SQL Server Mobile Edition Database File caixa de dilogo, navegue para seu banco de dados, e, em seguida clique em Open. Em seguida clique OK para fechar a Add Connection caixa de dilogo. 4. Na pgina Choose Your Data Connection, clique em Next. Ser a Local database file caixa de mensagem exibida inquiring se voc deseja incluir o arquivo de dados no projeto atual. Clique em Yes. 5. 6. Na pgina Choose Your Database Objects, selecione os objetos que deseja usar como fontes dados em seu projeto. Clique em Finish. Objetos que voc selecionou no SQL Server Mobile Database so exibidos como fontes de dados para o projeto na janela Data Sources. Para abrir a janela, clique Show Data Sources no Data menu.

Como: Adicionar um banco de dados do SQL Server como uma fonte de dados (Dispositivos)
Voc pode usar bancos de dados do SQL Server como fontes de dados em seu projetos dispositivo gerenciado. Para adicionar uma conexo de dados SQL Server ao Explorer Server 1. 2. 3. 4. 5. 6. No menu View, clique em Server Explorer. Na janela Explorer Server, clique com o boto direito do mouse Data Connections e clique Add Connection no menu de atalho. Na caixa Add Connection de dilogo, clique em Change. Na caixa Change Data Source de dilogo, selecionar Microsoft SQL Server, e clique em OK Para reabrir a Add Connection caixa dilogo Na caixa Server name, especifique o nome do servidor onde a fonte de dados est localizada. Faa logon no servidor. Se o servidor usa a autenticao do SQL Server, voc precisar fornecer um nome de usurio e senha. 7. Na caixa Select or enter a database name, selecione ou digite o nome do banco de dados, e, em seguida, clique em OK. A nova conexo de dados exibida no Server Explorer. Para usar uma conexo de dados SQL Server como fonte de dados em um projeto 1. 2. 3. 4. 5. Pr-requisito: Voc deve ter um Projeto de Dispositivo Inteligente .NET Compact Framework j abrir no IDE Visual Studio. No menu Data, clique em Add New Data Source Para abrir o Data Source Configuration Wizard. Na pgina Choose a Data Source Type, selecionar Database, e clique em Next Na pgina Choose Your Data Connection, clique em New Connection. Na caixa Add Connection de dilogo, clique em Change.

Visual C# Consolidado

1208

6. 7. 8.

Na caixa Change Data Source de dilogo, selecionar Microsoft SQL Server, e clique em OK Para reabrir a Add Connection caixa dilogo Na caixa Server name, digite ou selecione o nome do servidor onde a fonte de dados est localizada. Faa logon no servidor. Se o servidor usa a autenticao do SQL Server, voc precisar fornecer um nome de usurio e senha.

9.

Na caixa Select or enter a database name, selecione ou digite o nome do banco de dados, e, em seguida, clique em OK.

10. Na pgina Choose Your Data Connection, optar por excluir dados confidenciais da seqncia de conexo, e clique em Next. Observao de segurana Incluindo dados confidenciais na seqncia de conexo representa um risco de segurana. 11. Na pgina Choose Your Database Objects, selecione os objetos voc deseja usar como fontes de dados, e clique em Finish. A conexo de dados agora aparece como uma fonte de dados na Data Sources janela.

Como: Adicionar um objeto corporativo como uma fonte de dados (Dispositivos)


Voc pode adicionar um objeto comercial como uma fonte de dados em seu projetos de dispositivo inteligente. Para obter mais informaes, consulte Ferramentas de Banco de Dados Visual. Para criar uma nova fonte de dados de um objeto 1. 2. 3. No menu Data, clique em Add New Data Source. Na pgina Choose a Data Source Type, selecione Object. Na pgina Select an Object you wish to bind to, selecione um objeto j em seu aplicativo. Observao Talvez seja necessrio criar o projeto que contm o objeto antes o objeto aparece no assistente. Voc tambm pode adicionar uma referncia a um objeto no est em seu aplicativo, clicando Add Reference e localizar o conjunto desejado no Caixa de dilogo Add Reference. O assembly adicionado ao modo de exibio de rvore. 4. 5. Expanda o conjunto que contm o objeto ao qual deseja vincular a, e selecione o objeto no modo de exibio de rvore. Clique em Finish. A fonte de dados adicionada janela Data Sources. Para adicionar uma fonte de dados ao seu formulrio 1. 2. No menu Data, clique Show Data Sources para abrir a Data Sources janela. Selecionar itens na janela Data Sources, e arraste-os em um formulrio do Windows para criar controles acoplados s propriedades em seu objeto. Para obter mais informaes, consulte Viso Geral da Exibio dados.

Visual C# Consolidado

1209

Como: Adicionar um servio da Web como uma fonte de dados (Dispositivos)


Voc pode adicionar um servio da Web como uma fonte de dados em seu projetos de dispositivo inteligente. Conectar seu aplicativo a um servio da Web 1. 2. 3. 4. No menu Data, clique em Add New Data Source. Na pgina Choose a Data Source Type, selecionar Web Service, e clique em Next Adicionar uma referncia ao servio da Web usando o desejado a Adicionar caixa de dilogo Referncia da Web. Clique em Finish. A fonte de dados adicionada janela Data Sources. Para adicionar uma fonte de dados ao seu formulrio

Selecionar itens na janela Data Sources e arraste-os em um formulrio do Windows para criar controles acoplados. Para obter mais informaes, consulte Viso Geral da Exibio dados.

Como Gerenciar Tabelas em um Banco de Dados SQL Server Mobile (Dispositivos)


As seguintes etapas presumem tiver um banco de dados do SQL Server Mobile disponvel na janela Server Explorer. Para obter mais informaes, consulte Como Criar um Banco de Dados SQL Server Mobile (Dispositivos). Adicionar uma tabela 1. 2. 3. 4. 5. 6. No menu View, clique em Server Explorer. Na janela Server Explorer, expanda a conexo de dados ao qual voc deseja adicionar uma tabela. Clique com o boto direito do mouse Tables e, em seguida clique em Create Table. Na caixa New Table de dilogo, digite um nome na caixa Name de tabela. Para a primeira coluna, insira valores para Column Name, Data Type, Length, Allow Nulls, Unique, e Primary Key. Continuar para colunas adicionais. Clique em OK. A nova tabela for exibida na lista de tabelas para a conexo de dados. Para editar um esquema da tabela existente 1. 2. 3. 4. 1. 2. No menu View, clique em Server Explorer. Na janela Server Explorer, expanda a conexo de dados em que o esquema da tabela a ser editado for localizada. Clique com o boto direito do mouse na tabela para ser editado, e no menu de atalho, clique em Edit Table Schema. Na caixa Edit Table <Tablename> de dilogo, faa as alteraes e clique em OK No menu View, clique em Server Explorer. Na janela Server Explorer, expanda a conexo de dados do qual voc deseja soltar uma tabela.

Para remover uma tabela

Visual C# Consolidado

1210

3. 4.

Clique com boto direito em Tables, mouse a tabela voc deseja excluir e, em seguida, no menu de atalho, clique em Drop Table. Na caixa Delete Objects de dilogo, clique em Remove, e clique em OK Observao No possvel remover uma tabela at que todas as referncias para a tabela sejam excludas.

Como Gerenciar Colunas em um Banco de Dados SQL Server Mobile (Dispositivos)


As seguintes etapas presumem tiver um banco de dados do SQL Server Mobile disponvel na janela Server Explorer. Para obter mais informaes, consulte Como Criar um Banco de Dados SQL Server Mobile (Dispositivos). Para adicionar uma coluna 1. 2. 3. 4. 1. 2. 3. 4. No menu View, clique em Server Explorer. Na janela Server Explorer, expanda a conexo dados para exibir suas tabelas. Clique com o boto direito do mouse na tabela qual voc deseja adicionar uma coluna, e depois clique Edit Table Schema no menu de atalho. Na janela Edit Table, adicionar a coluna e suas propriedades, e clique em OK. No menu View, clique em Server Explorer. Na janela Server Explorer, expanda a conexo dados para exibir suas tabelas. Clique com o boto direito do mouse na tabela que contm a coluna cujas propriedades voc deseja editar e, em seguida, clique Edit Table Schema no menu de atalho. Tornar suas edies, e, em seguida clique em OK. Observao Voc no pode fazer uma edio que violaria integridade referencial (por exemplo, tentando se alterar a Primary Key propriedade para No quando essa coluna referida por outra restrio). Para remover uma coluna de uma tabela 1. 2. 3. 4. No menu View, clique em Server Explorer. Na janela Server Explorer, expanda a conexo dados para exibir suas tabelas. Clique com o boto direito do mouse na tabela da qual voc deseja remover a coluna, e depois clique Edit Table Schema no menu de atalho. Na janela Edit Table, selecione a coluna voc deseja excluir e clique em Delete e clique em OK. Observao No possvel remover uma coluna at que todas as referncias para a coluna sejam excludas.

Para editar as propriedades da coluna

Como Gerenciar ndices em um Banco de Dados SQL Server Mobile (Dispositivos) Visual C# Consolidado 1211

As seguintes etapas presumem tiver um banco de dados do SQL Server Mobile disponvel na janela Server Explorer. Para obter mais informaes, consulte Como Criar um Banco de Dados SQL Server Mobile (Dispositivos). Para criar um ndice para um banco de dados do SQL Server Mobile 1. 2. 3. 4. 5. 6. 7. 1. 2. 3. 4. No menu View, clique em Server Explorer. Na janela Server Explorer, expanda a fonte de dados no qual voc deseja criar um novo ndice. Expandir a tabela para o qual voc deseja o novo ndice, e em seguida, clique com o boto direito do mouse a Indexes pasta. No menu de atalho, clique em Create Index. Na caixa New Index de dilogo, digite um nome para o ndice, e clique em Add. Na caixa Select Columns from <Table> de dilogo, selecione as colunas a serem adicionados chave de ndice, e clique em OK. Clique OK para fechar a New Index caixa de dilogo. No menu View, clique em Server Explorer. Na janela Server Explorer, expanda a Conexo de Dados e Tabela que contm o ndice cujas propriedades voc deseja editar. Clique com o boto direito do mouse o ndice, e, em seguida clique Index Properties no menu de atalho. Voc pode alterar a ordem de classificao na caixa de dilogo No possvel alterar outras propriedades do ndice exceto, substituindo o ndice existente por um novo nome. Para descartar um ndice de um banco de dados do SQL Server Mobile 1. 2. 3. 4. 5. No menu View, clique em Server Explorer. Na janela Server Explorer, expanda a conexo de dados do qual voc deseja descartar um ndice. Expandir tabela que possui o ndice, expandir Indexes, e em seguida, clique com o boto direito do mouse o ndice para ser descartado. No menu de atalho, clique em Drop Index. Na caixa Delete Objects de dilogo, clique em Remove, e clique em OK

Para editar propriedades do ndice na ordem classificao-somente

Como Gerenciar Senhas para um Banco de Dados SQL Server Mobile (Dispositivos)
Voc pode definir uma senha quando voc cria um banco de dados do SQL Server Mobile, e voc pode alterar a senha em um banco de dados existente. Observao de segurana Incluindo uma senha em uma seqncia de conexo representa um risco de segurana. Para obter mais informaes, consulte Securing Databases (SQL Server Mobile Edition). As etapas de exemplo a seguir presumem voc tiver um aplicativo Windows Forms Pocket PC abrir.

Visual C# Consolidado

1212

Para definir uma senha ao criar um banco de dados SQL Server Mobile 1. 2. 3. 4. 5. 6. 7. 8. No menu Data, clique em Add New Data Source. Na pgina Choose a Data Source Type, selecionar Database, e clique em Next Na pgina Choose Your Data Connection, clique New Connection para abrir a Add Connection caixa de dilogo. Clique em Change, selecione Microsoft SQL Server Mobile Edition, e clique em OK. Na caixa Add Connection de dilogo, selecione My Computer. Clique em Create. Na caixa Create New SQL Server 2005 Mobile Edition Database de dilogo, digite um caminho qualificado fullly-para o novo banco de dados (por exemplo, c:\MyDatabase.sdf). Do New Password em e Confirm Password caixas, digite uma senha para o novo banco de dados, e clique em OK. No menu View, clique em Server Explorer. Na Server Explorer janela, clique com boto direito a fonte de dados para que voc deseja alterar a senha. No menu de atalho, clique em Database Properties. Na caixa Database Properties de dilogo, clique em Set password. Digite as senhas antiga e nova na conforme solicitado, e clique em OK.

Se alterar uma senha atravs um SQL Server Mobile Database existente 1. 2. 3. 4. 5.

Como Reduzir e Reparar um Banco de Dados SQL Server Mobile (Dispositivos)


As seguintes etapas presumem tiver um banco de dados do SQL Server Mobile disponvel na janela Server Explorer. Para obter mais informaes, consulte Como Criar um Banco de Dados SQL Server Mobile (Dispositivos). Para reduzir e reparar um banco de dados 1. 2. 3. 4. 5. No menu View, clique em Server Explorer. Clique com boto direito na janela do Server Explorer mouse na conexo de dados voc deseja reduzir e reparar, e seguida, no menu de atalho, clique em Database Properties. No painel Select a page, clique Shrink & Repair. Escolha entre as opes na pgina Shrink & Repair. A parte inferior da pgina exibe uma explicao para a opo voc selecionar. Clique OK Para iniciar a reduo selecionada e reparar opo, ou clique Cancel para deixar o banco de dados em sua condio atual.

Como: Criar consultas parametrizadas (Dispositivos)


As seguintes etapas presumem tiver um banco de dados do SQL Server Mobile disponvel na janela Data Sources. Para obter mais informaes, consulte Como Criar um Banco de Dados SQL Server Mobile (Dispositivos) ou Como Adicionar um Banco de Dados SQL Server Mobile a um Projeto de Dispositivo. Quando voc desejar que os usurios sejam capazes para inserir valores diferentes para um parmetro, use um ponto de interrogao (. "? como o parmetro quando voc cria sua consulta) " Se voc criar sua consulta usando a marca inteligente no Windows Forms Designer, como mostrado na seguinte conjunto de etapas, uma interface de usurio gerado no formulrio

Visual C# Consolidado

1213

Windows automaticamente. Do TableAdapter se voc criar sua consulta de no criador DataSet, como mostrado no ltimo conjunto de etapas, nenhuma interface de usurio gerado automaticamente. Para configurar para especificar um parmetro usando o Windows Forms Designer 1. Arraste uma tabela no formato DataGrid ou Detalhes da janela Data Sources para o formulrio no designer. Voc pode selecionar o formato, clique na seta no canto direito do nome da tabela. 2. Clique na marca inteligente no componente arrastada, e no menu de atalho, clique em Add Query Se voc no estiver usando um mouse, o atalho de teclado para abrir a Tasks caixa de dilogo SHIFT + ALT + F10. 3. 4. Na caixa Search Criteria Builder de dilogo, selecione New query name. Usar o nome padro ou criar um nome de sua escolha. Agora voc pode especificar os parmetros ou clicando Query Builder, alterando a instruo SQL na caixa Query Text. Adicionar uma WHERE clusula ao final da instruo SELECT. Clique OK para fechar a Search Criteria Builder caixa de dilogo. Um boto vinculado consulta- exibido no formulrio no designer. Para especificar um parmetro usando Construtor de consultas 1.
o

Para especificar um parmetro usando a caixa Query Text 1. 2.

Na caixa Query Builder de dilogo, ambos: Adicione uma WHERE clusula no painel da instruo SQL. OuInsira seu parmetro Filter na listagem apropriada Column. Essa abordagem grava a WHERE clusula para voc no painel da instruo SQL. Clique OK para fechar a Query Builder caixa de dilogo. Clique OK para fechar a Search Criteria Builder caixa de dilogo. Um boto vinculado consulta- exibido no formulrio no designer.

2. 3.

Para especificar um parmetro utilizando o criador DataSet 1. 2. 3. 4. 5. 6. No Solution Explorer, clique com o boto direito do mouse no arquivo.xsd, e clique em Open. No Dataset Designer, clique com boto direito aponte para Add, e, no menu de atalho, clique em Query. o TableAdapter, No Assistente para configurao Query TableAdapter, selecionar Use SQL Statements, e clique em Next Na pgina Choose a Query Type, selecionar Select which returns a single value, e clique em Next Na pgina Specify a SQL SELECT statement, clique em Query Builder. Se voc desejar, voc pode adicionar a WHERE clusula aqui. Use Construtor de Consultas conforme descrito anteriormente contidas neste tpico. Observao

Visual C# Consolidado

1214

H elementos da interface do usurio so gerados automaticamente quando voc cria suas consultas usando o TableAdapter Query Configuration Wizard.

Passo-a-passo: Um Aplicativo de Consulta Parametrizado do SQL Server Mobile


Essa explicao passo a passo mostra como usar o Visual Studio 2005 ambiente para desenvolver um aplicativo simples consulta parametrizada. DataBinding e grande parte da interface do usurio sero gerados automaticamente para voc. Confiar no banco de dados Northwind familiarizado, este aplicativo fornece para o cenrio em que os usurios de dispositivo inteligente precisam para determinar o pas remessa quando eles sabem somente o nmero do pedido. O aplicativo voc criar aqui fornece para entrada de usurio do nmero do pedido e a exibio de pas correspondente remessa consequent. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings (Importar e Exportar Configuraes) no menu Tools (Ferramentas). Para obter mais informaes, consulte Configuraes do Visual Studio. Essa explicao passo a passo foi escrito usando configuraes de desenvolvimento do Visual Basic e Visual C# configuraes Development. Pr-requisitos O banco de dados Northwind para SQL Server Mobile Edition, includo no Visual Studio 2005. Observao Se voc for um administrador no no seu computador de desenvolvimento, voc no pode abrir o Northwind.sdf arquivo no seu local padro, \Program Files\Microsoft Server\Mobile\v3.0 8\SmartDevices\SDK\SQL Visual Studio. Copie o arquivo para a rea de trabalho ou para My Documents e abri-lo de l quando voc for solicitado. Escolher um dispositivo de destino Para garantir que voc ser solicitado para selecionar um dispositivo quando voc implantar a soluo, conclua o procedimento a seguir.

Para solicitar para opes do dispositivo no momento da implantao


1. 2. Clique Options no menu Tools, e Device Tools Clique em General. Marque a Show device choices before deploying a device project caixa de seleo. Criando o aplicativo Isso um aplicativo Windows Forms simples para hospedar a funcionalidade de dados dessa explicao passo a passo.

Para criar um projeto de dispositivo Windows Forms

Visual C# Consolidado

1215

1.

(Visual Basic) No menu File em Visual Studio 2005, clique em New Project. ou (Visual C#) No menu File do Visual Studio 2005, aponte para New, e clique em Project.

2.

Project Types Na caixa New Project de dilogo, expanda Visual Basic ou Visual C# expandir Smart Device, e clique em Pocket PC 2003. Se no o idioma a ser exibido, no no primeiro expandir Other Languages. Esta tela regida por suas configuraes de desenvolvimento.

3.

Em Templates, clique em Device Application. Observao No selecione Device Application (1.0), que depende da verso 1,0 do .NET Compact Framework e no adequado para essa explicao passo a passo.

4. 5. 6.

Na caixa Name, digite ParamQuerySample. (C Visual #) somente Na caixa Location, Verifique onde voc deseja armazenar seus arquivos de projeto. Clique em OK. Aparece uma representao de um dispositivo Pocket PC no Windows Forms Designer. Adicionando funcionalidade de dados

Esta seo consiste das seguintes tarefas:


Selecionar um tipo de fonte de dados. Selecionando e configurando uma conexo de dados. Selecionar objetos de banco de dados. Adicionando controles ligados a dados ao formulrio.

Para selecionar um tipo de fonte de dados


1. 2. No menu Data, clique em Add New Data Source Para abrir o Data Source Configuration Wizard. Na pgina Choose a Data Source Type, selecionar Database, e clique em Next

Para selecionar e configurar uma conexo de dados


1. 2. Na pgina Choose Your Data Connection, clique em New Connection. Na caixa Choose Data Source de dilogo, selecionar Microsoft SQL Server Mobile Edition, e clique em Continue Observao Dependendo configuraes e projetos anteriores, caixa Add Connection de dilogo pode aparecer em vez da caixa Choose Data Source de dilogo. Se isso acontecer, clique Change na caixa Add Connection de dilogo para abrir a Change Data Source caixa de dilogo. Selecione Microsoft SQL Server Mobile Edition, e clique em OK.

Visual C# Consolidado

1216

3. 4. 5. 6. 7.

Na caixa Add Connection de dilogo, selecione My Computer. Novamente na caixa Add Connection de dilogo, clique em Browse. Na caixa Select SQL Server Mobile Edition Database File de dilogo, selecionar Northwind.sdf, e clique em Open Na caixa Add Connection de dilogo, deixe a Password caixa vazia. Este banco de dados tem nenhuma senha. Clique Test Connection para verificar a conexo. Observao Se o acesso para o Northwind.sdf arquivo for negado, copiar o arquivo para a rea de trabalho, e procure a essa cpia para abrir. Esta situao pode ocorrer se voc no tem direitos suficientes no computador de desenvolvimento para abrir o arquivo no seu local padro, que listado para o incio dessa explicao passo a passo.

8. 9.

Clique OK na caixa de mensagem que mostra a conexo bem-sucedida, e clique OK para fechar a Add Connection caixa de dilogo. Feche a Choose Your Data Connection pgina clicando Next.

10. Na caixa de mensagem que pergunta se voc deseja copiar o arquivo para seu projeto, clique em Yes.

Para selecionar objetos de banco de dados


1. 2. Na pgina Choose Your Database Objects, expanda o Tables n, e selecione a Orders tabela. Clique em Finish. O NorthwindDataset criado. Voc pode exibir esta fonte de dados, selecionando Show Data Sources no menu Data.

Para criar a consulta


1. 2. 3. 4. 5. 6. Na janela Data Sources, expanda a Orders tabela. Clique na Ship Country coluna, e clique na seta suspensa e selecione a Label opo. Arraste a Ship Country coluna para o formulrio no designer. Sobre o controle rtulo no designer, clique na marca inteligente, e no menu de atalho, clique em Add Query Na caixa Search Criteria Builder de dilogo, clique em Query Builder. Na coluna Filter da linha Order ID, digite um ponto de interrogao (?). Este smbolo indica que usurios do aplicativo ser tem para inserir um valor para identificao do pedido. 7. 8. Clique em OK. A WHERE clusula na caixa Query Text deve ler ([Order ID]=@PARAM1) agora. Clique OK para fechar a Search Criteria Builder caixa de dilogo. Um painel aparece no formulrio no designer.

Para refinar a interface do usurio Visual C# Consolidado 1217

1. 2. 3. 4.

Clique com o boto direito do mouse no PARAM1 controle rtulo no designer, e no menu de atalho, clique em Properties Alterar a Text propriedade para Order ID. Selecionar o FillBy boto, e altere sua propriedade de texto como Show country. Expanda Painel e controles para eliminar as barras de rolagem e mostrar todo o texto. Cuidado principalmente que. e sua caixa de texto no estiver oculto atrs e seus controles o Ship_CountryLabel o FillByPanel Testar o aplicativo

Nesta seo voc criar o aplicativo, baix-lo para o emulador se Pocket PC 2003, e verifique se o aplicativo funciona corretamente.

Para testar o aplicativo


1. 2. No menu Debug, clique em Start ou Start Debugging. Na caixa Deploy de dilogo, selecionar Pocket PC 2000 SE Emulator, e clique em Deploy Andamento implantao aparece na barra Status. Implantao para o emulador pode levar algum tempo. 3. Quando o aplicativo est sendo executado no emulador, digite um nmero ordem, que execute de 10000 para 11077 no banco de dados Northwind, e clique em Show country. O pas Navio para esse pedido aparece no controle rtulo. Preparando para Walkthroughs adicionais Se voc pretende fazer orientaes adicionais ou abrir outros projetos, voc deseja desligar completamente o emulador e sair desta soluo.

Para fechar o emulador e a soluo


1. 2. 3. No menu File do emulador, clique em Exit. Na caixa Device Emulator de mensagem, clique em No para a mensagem perguntando se voc deseja salvar o estado do emulador. (Visual Basic) No menu File, clique em Close Project. ou (Visual C#) No menu File, clique em Close Solution. Se voc for solicitado para salvar o projeto ou soluo, clique Save se voc deseja us-lo novamente mais tarde; caso contrrio, clique em Discard e os arquivos no sero salvas.

Como Criar Aplicativos Master-Detail (Dispositivos)


As seguintes etapas presumem tiver um banco de dados do SQL Server Mobile com relacionamentos de tabelas disponveis na janela fontes de dados. Para obter mais informaes, consulte Como Criar um Banco de Dados SQL Server Mobile (Dispositivos). Ao arrastar tabelas de detalhes, considere arrastando somente as colunas que servem sua finalidade, em vez da grade inteira. Voc pode fazer essa opo, clique na seta no canto direito do nome da tabela. Para criar um aplicativo principal-detalhes

Visual C# Consolidado

1218

1. 2. 3.

Arraste a tabela mestre da janela Data Sources para o formulrio no designer. Na janela Data Sources, expanda a tabela mestre para expor a tabela de detalhes. Arraste a tabela de detalhes que voc encontrar dentro do n de tabela mestre para o formulrio. Observao Esta a tabela de detalhes como ele aparece dentro da tabela mestre, no a tabela de detalhes que est no mesmo nvel de rvore como a tabela mestra.

4.

O designer detecta automaticamente a Relao mestre-detalhes das restries de chave externas. Para obter mais informaes, consulte Passo-a-passo: Um Aplicativo MasterDetail do SQL Server Mobile. Ajuste os controles no formulrio para atender seu aplicativo.

5.

Passo-a-passo: Um Aplicativo Master-Detail do SQL Server Mobile


Descreve como para usar o Visual Studio 2005 ambiente para conectar a um banco de dados, selecione Objetos de banco de dados para incluso em um projeto, e criar controles ligados a dados para exibir os dados em um aplicativo de dispositivo inteligente essa explicao passo a passo. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings (Importar e Exportar Configuraes) no menu Tools (Ferramentas). Para obter mais informaes, consulte Configuraes do Visual Studio. Essa explicao passo a passo foi escrito usando configuraes de desenvolvimento do Visual Basic e Visual C# configuraes Development. Pr-requisitos O banco de dados Northwind para SQL Server Mobile Edition, includo no Visual Studio 2005. Observao Se voc for um administrador no no seu computador de desenvolvimento, voc no pode abrir o Northwind.sdf arquivo em sua localizao padro (\Program Files\Microsoft Server\Mobile\v3.0 8\SmartDevices\SDK\SQL Visual Studio). Copie o arquivo para a rea de trabalho ou para Meus documentos e abri-lo de l quando voc for solicitado. Escolher um dispositivo de destino Para garantir que voc ser solicitado para selecionar um dispositivo quando voc implantar a soluo, conclua o procedimento a seguir.

Para solicitar para opes do dispositivo no momento da implantao


1. Clique Options no menu Tools, e Device Tools Clique em General.

Visual C# Consolidado

1219

2.

Marque a Show device choices before deploying a device project caixa de seleo. Criando o aplicativo

Isso um aplicativo Windows Forms simples para hospedar a funcionalidade de dados dessa explicao passo a passo.

Para criar um projeto de dispositivo Windows Forms


1. (Visual Basic) No menu File em Visual Studio 2005, clique em New Project. ou (Visual C#) No menu File do Visual Studio 2005, aponte para New, e clique em Project. 2. Project Types Na caixa New Project de dilogo, expanda Visual Basic ou Visual C# expandir Smart Device, e clique em Pocket PC 2003. Se no o idioma a ser exibido, no no primeiro expandir Other Languages. Esta tela regida por suas configuraes de desenvolvimento. 3. Em Templates, clique em Device Application. Observao No selecione Device Application (1.0), que depende da verso 1 do .NET Compact Framework e no adequado para essa explicao passo a passo. 4. 5. 6. Na caixa Name, digite MasterDetailSample. (C Visual #) somente Na caixa Location, Verifique onde voc deseja armazenar seus arquivos de projeto. Clique em OK. Aparece uma representao de um dispositivo Pocket PC no Windows Forms Designer. Adicionando funcionalidade de dados Esta seo consiste das seguintes tarefas:

Selecionando um tipo de origem de dados Selecionando e configurando uma conexo de dados Selecionar objetos de banco de dados Adicionando controles ligados a dados ao formulrio

Para selecionar um tipo de fonte de dados


1. 2. No menu Data, clique em Add New Data Source Para abrir o Data Source Configuration Wizard. Na pgina Choose a Data Source Type, selecionar Database, e clique em Next

Para selecionar e configurar uma conexo de dados


1. 2. Na pgina Choose Your Data Connection, clique em New Connection. Na caixa Choose Data Source de dilogo, selecionar Microsoft SQL Server Mobile Edition, e clique em Continue

Visual C# Consolidado

1220

Observao Dependendo configuraes e projetos anteriores, caixa Add Connection de dilogo pode aparecer em vez da caixa Choose Data Source de dilogo. Se isso acontecer, clique Change na caixa Add Connection de dilogo para abrir a Change Data Source caixa de dilogo. Selecione Microsoft SQL Server Mobile Edition e clique em OK. 3. 4. 5. 6. 7. Na caixa Add Connection de dilogo, selecione My Computer. Novamente na caixa Add Connection de dilogo, clique em Browse. Na caixa Select SQL Server Mobile Edition Database File de dilogo, selecionar Northwind.sdf, e clique em Open Na caixa Add Connection de dilogo, deixe a Password caixa vazia. Este banco de dados tem nenhuma senha. Clique Test Connection para verificar a conexo. Observao Se o acesso para o Northwind.sdf arquivo for negado, copiar o arquivo para a rea de trabalho, e procure a essa cpia para abrir. Esta situao pode ocorrer se voc no tem direitos suficientes no computador de desenvolvimento para abrir o arquivo no seu local padro, que listada no incio dessa explicao passo a passo. 8. 9. Clique OK na caixa de mensagem que mostra a conexo bem-sucedida, e clique OK para fechar a Add Connection caixa de dilogo. Feche a Choose Your Data Connection pgina clicando Next.

10. Na caixa de mensagem que pergunta se voc deseja copiar o arquivo para seu projeto, clique em Yes.

Para selecionar objetos de banco de dados


1. 2. Do Customers na pgina Choose Your Database Objects, expanda o Tables n, e selecione e Orders tabelas. Clique em Finish. O NorthwindDataset criado. Voc pode exibir esta fonte de dados, selecionando Show Data Sources no menu Data.

Para adicionar controles ligados a dados ao formulrio


1. 2. 3. Na Data Sources janela, selecione a Customers Tabela, e clique na seta suspensa, e selecione a DataGrid opo. Arraste a Customers tabela da janela Data Sources para o formulrio no designer. Localize a grade em direo parte superior da janela. Na janela Data Sources, expanda a Customers tabela para expor a Orders tabela. Observao Esta a Orders tabela como ele aparece dentro da Customers tabela, no a Orders tabela que

Visual C# Consolidado

1221

est no mesmo nvel de rvore como a Customers tabela. 4. 5. Clique na seta suspensa para esta Orders Tabela, e selecione a DataGrid opo. Arraste esta Orders tabela da janela Data Sources para o formulrio no designer. Localize a grade a parte inferior da janela. Testar o aplicativo Nesta seo voc criar o aplicativo, baix-lo para o emulador se Pocket PC 2003, e verifique se o aplicativo funciona corretamente.

Para testar o aplicativo


1. 2. No menu Debug, clique em Start ou Start Debugging. Na caixa Deploy de dilogo, selecionar Pocket PC 2000 SE Emulator, e clique em Deploy Andamento implantao aparece na barra de status. Implantao para o emulador pode levar algum tempo. 3. Quando o aplicativo executado no emulador, use a cima e para baixo setas no seu teclado ou no controle NAVIGATION no emulador para alterar os registros selecionados na grade Customers. Verifique os registros selecionados alterar na grade Orders. Preparando para Walkthroughs adicionais Se voc pretende fazer orientaes adicionais ou abrir outros projetos, voc deseja desligar completamente o emulador e sair desta soluo.

Para fechar o emulador e a soluo


1. 2. 3. 4. No menu File do emulador, clique em Exit. Na caixa Device Emulator de mensagem, clique em No para a mensagem perguntando se voc deseja salvar o estado do emulador. Na mensagem caixa Que advises a conexo foi perdida, clique em OK. (Visual Basic) No menu File, clique em Close Project. Se voc for solicitado para salvar o projeto ou soluo, clique Save se voc deseja us-lo novamente mais tarde; caso contrrio, clique em Discard e os arquivos no sero salvas. ou (Visual C#) No menu File, clique em Close Solution.

Como Visualizar Dados em um Banco de Dados SQL Server Mobile (Dispositivos)


As seguintes etapas presumem tiver um banco de dados do SQL Server Mobile disponvel na janela Server Explorer. Para obter mais informaes, consulte Como Criar um Banco de Dados SQL Server Mobile (Dispositivos). Voc pode visualizar dados fora usando Server Explorer Um do projeto, ou dentro de um projeto usando a Data Sources janela, onde voc tambm pode parameterize a consulta que produz o modo de exibio. Para obter mais informaes, consulte Como: Criar consultas parametrizadas (Dispositivos). Para exibir dados usando Explorer Server

Visual C# Consolidado

1222

1. 2. 3.

No menu View, clique em Server Explorer. Na janela Server Explorer, expanda a conexo dados para expor a listagem de tabela. Clique com o boto direito do mouse na tabela cujos dados voc deseja exibir e, no menu de atalho, clique em Open. No menu Data, clique em Show Data Sources. Na Data Sources janela, clique com boto direito a fonte de dados cujos dados voc deseja exibir (por exemplo, uma tabela). No menu de atalho, clique em Preview Data. Na caixa Data Preview de dilogo, clique em Preview. No designer, clique na marca inteligente sobre o controle DataGrid. No menu DataGrid Tasks de atalho, clique em Preview Data. Na caixa Preview Data de dilogo, selecione o objeto para visualizar e clique em Preview. Os dados aparecero na caixa Results. O nmero de colunas e linhas na grade tambm exibido na parte inferior da caixa Preview Data de dilogo.

Para exibir dados usando a janela fontes de dados em um projeto 1. 2. 3. 4. 1. 2. 3.

Para exibir dados usando a marca inteligente sobre o controle DataGrid

Como: Gerar resumo e modos de exibio de edio para aplicativos de dados (Dispositivos)
Usar formulrios de dados para exibir e editar linhas de dados em um DataGrid nica. A interface do usurio de formulrio de dados consiste de duas caixas de dilogo: caixa View de dilogo exibe uma exibio de resumo de uma linha DataGrid selecionado, e a Edit caixa de dilogo permite a edio de linha.

Abrir a View caixa de dilogo em um aplicativo em execuo clicando duas vezes uma linha no DataGrid no emulador de dispositivo ou tocando em uma linha em um dispositivo. Voc abrir a Edit caixa de dilogo ao clicar em (tocando) New quando o DataGrid exibida Esta ao cria uma nova linha no DataGrid ou clicando (tocando) Edit quando a View caixa de dilogo exibida.

Formulrios de dados so criados como modelos para personalizao. Voc deve adicionar cdigo adequado para validar e confirmar alteraes para o banco de dados como parte dessa personalizao. As seguintes etapas presumem tiver um banco de dados do SQL Server Mobile disponvel na janela Data Sources. Para obter mais informaes, consulte Como Criar um Banco de Dados SQL Server Mobile (Dispositivos). Para gerar os formulrios de dados 1. Arraste uma tabela no formato DataGrid da janela Data Sources para o formulrio no designer. Voc pode selecionar o formato, clique na seta no canto direito do nome da tabela. 2. Clique na marca inteligente no componente arrastada, e no menu de atalho, selecione Generate Data Forms. (Se no estiver usando um mouse, o atalho do teclado para abrir a Tasks caixa de dilogo SHIFT + ALT + F10.) Observao

Visual C# Consolidado

1223

As caixas de dilogo brevemente so exibidas como eles so gerados no designer. Para verificar se as caixas de dilogo so agora parte do projeto, procure-los Solution Explorer. Para modificar dados em um aplicativo em execuo 1. 2. Iniciar o aplicativo de dados. O DataGrid exibida, preenchida com dados. Clique duas vezes uma linha de dados. Uma exibio de linha de resumo aparece na caixa View de dilogo. Esta exibio consiste em um rtulo e dados para cada coluna que possui contedo. Isto , caixa View de dilogo oculta qualquer coluna cujo valor DBNULL. 3. No menu principal, clique Edit para abrir a Edit caixa de dilogo. Usar a Edit caixa de dilogo que exibe todas as colunas, para modificar os dados, e clique em OK. Os dados revisados so exibidos no DataGrid. Para criar uma nova linha no DataGrid em um aplicativo em execuo 1. Com um aberto DataGrid, no menu principal, clique em New. A Edit caixa de dilogo ser exibida.Use esta caixa de dilogo para adicionar uma nova linha de dados. 2. Clique em OK. A nova linha ser adicionada para o DataGrid.

Passo-a-passo: Empacotando uma Soluo de um Dispositivo Inteligentes para Implantao


Essa explicao passo a passo demonstra como usar Visual Studio 2005 para compactar seu aplicativo e seus recursos em um arquivo CAB para que ele pode ser implantado em Dispositivo Inteligente uma usurio fim na. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings (Importar e Exportar Configuraes) no menu Tools (Ferramentas). Para obter mais informaes, consulte Configuraes do Visual Studio. Nessa explicao passo a passo, voc comea com qualquer soluo de dispositivo inteligente escrita Visual Basic 2005, Visual C# 2005, ou Visual C++ 2005. Para obter mais informaes, consulte Criando um aplicativo Simple Walkthrough:. Essa explicao passo a passo mostra como fazer o seguinte:

Adicione um projeto CAB para a soluo. Alterar o nome do produto. Alterar o caminho de sada. Preencher o arquivo CAB com a sada do aplicativo principal. Adicionar dependncias se necessrio.

Visual C# Consolidado

1224

Criar um atalho para o aplicativo. Editar uma entrada do Registro. Pr-requisitos

Uma soluo Smart Device existente. Para fins dessa explicao passo a passo de embalagem, considere criar e criar um projeto simples,, conforme o projeto descrito no Passo-a-passo: Criando aplicativos do Windows Forms para um dispositivo. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Configurando o projeto CAB

Para adicionar um projeto CAB dispositivos inteligentes da soluo


1. 2. 3. 4. Abra o projeto de dispositivos inteligentes existente e verifique se que Solution Explorer esteja visvel. No menu File, aponte para Add, e clique em New Project. A Add New Project caixa de dilogo ser exibida. No painel Project Types no lado esquerdo, expanda o Other Project Types n e clique em Setup and Deployment. No Templates painel direita, selecione Smart Device CAB Project. Isso o nico tipo de projeto CAB vlido para dispositivos inteligentes. Os outros tipos de projeto so para somente solues de mesa. 5. Na caixa Name, digite CABProject, e depois clique em OK. O projeto CAB adicionado sua soluo e estar visvel na Solution Explorer. Agora os dois painis do File System Editor so exibidas. Personalizando o projeto CAB

Para alterar o nome do produto e outras propriedades do projeto


1. 2. 3. No Solution Explorer, selecionar CABProject caso ele j no esteja selecionado. No menu View, clique Properties Window para abrir a Properties janela. No campo ProductName da grade da propriedade, altere o valor para MyProduct. O valor da propriedade ProductName determina o nome que exibido para o aplicativo em nomes Pasta e na caixa Add or Remove Programs de dilogo.
o o

Voc tambm pode usar esta janela para alterar o nome do fabricante e para especificar o mnimo e mximo permitido verses do sistema operacional. Voc pode definir a OSVersionMin propriedade para 4.21 para indicar que o aplicativo Pocket PC possui reconhecimento orientao da tela. No entanto, definindo essa propriedade para 4.21 voc impedir o aplicativo de instalao em Pocket PCs baseados no Windows Mobile 2003 e anteriormente. Para permitir instalao em dispositivos e tambm indicar conscientizao orientao de tela a dispositivos mais recentes voc deve editar o

Visual C# Consolidado

1225

arquivo.inf para definir a BuildMax propriedade com um dos seguintes valores: manualmente 0xA0000000 para indicar o aplicativo oferece suporte (pixels) 240x240 telas quadradas 0xC0000000 para indicar o aplicativo suporta Rotao da tela Ou0xE0000000 para indicar o aplicativo suporta telas quadradas e Rotao da tela. Para obter mais informaes, consulte o informe oficial Desenvolvendo aplicativos Aware Orientation-da tela MSDN.
o

Para solues Pocket PC baseadas em Windows Mobile 2003SE e anterior, a Compress propriedade e a NoUninstall Device Deployment propriedade deve ser falsos. Digite observe essa opo pode ser definida como true para dispositivos equipados com Compact Framework 2.0. Para obter mais informaes, consulte Janela Propriedades, Project CAB de dispositivos inteligentes. Se voc estiver usando uma configurao Windows CE DLL, usar essa grade propriedade para especificar o nome e local do arquivo. Para obter mais informaes sobre instalao Windows CE DLLs, consulte a documentao Pocket PC ou Smartphone SDK.

Para alterar o nome do arquivo CAB e adicionar autenticao


1. Na Solution Explorer, clique com o boto direito do mouse CABProject e, em seguida clique em Properties. A Property Pages caixa de dilogo ser exibida para o projeto CAB. Na caixa Output file name, alterar o nome do arquivo CAB e caminho para Debug\MyApp.cab, e clique em OK. 2. Tambm pode usar esta pgina Propriedade para adicionar autenticao ao seu projeto. Autenticao necessrio para solues Smartphone, e no oferece suporte para solues Pocket PC baseadas em Windows Mobile 2003 se e anteriormente. Para obter mais informaes, consulte Segurana em projetos de dispositivos.

Para adicionar o aplicativo de projeto de dispositivo para o projeto CAB


1. No painel esquerdo da File System Editor, selecione o Application Folder n para especificar os arquivos que voc selecione nas etapas a seguir ser instalado para esta pasta para o dispositivo de destino. Se o File System Editor no estiver visvel, clique com o boto direito do mouse o CAB Nome do projeto no Solution Explorer, selecionar View, e clique em File System. 2. 3. 4. No menu Action do Visual Studio, aponte para Add, e clique em Project Output. Na caixa Add Project Output Group de dilogo, selecione o Project dispositivos inteligentes na lista Project drop-down. A lista de sadas, selecionar Primary output e, em seguida clique em OK.

Observao Ao criar um projeto CAB dispositivo inteligente para um aplicativo escrito em C++, voc deve adicionar dependncias, tais como atl80.dll / mfc80U.dll, ou MSVCRT.dll, para o projeto CAB se voc estiver vinculando a essas DLLs dinamicamente manualmente. Vinculao esttica altamente recomendvel, entretanto, a fim de reduzir dependncias nas DLLs MFC / ATL. Se voc estiver vinculando estaticamente, as DLLs no devem ser redistribudas com o aplicativo. Se voc est vinculando, dinamicamente e precisar redistribuir as DLLs no CAB, no instale as DLLs para a pasta do sistema, como \windows, para o dispositivo. Em vez disso, instale as DLLs no diretrio

Visual C# Consolidado

1226

do aplicativo local. Se voc estiver redistribuindo um conjunto de aplicativos, todos os quais dinamicamente vincular a ATL / MFC executar vezes, recomendvel para instalar todos os aplicativos, e as DLLs em tempo de execuo, para um diretrio nico aplicativo, e fornecer atalhos para os aplicativos que podem ser colocados em suas prprias pastas. Isso ir salvar alguns tamanho Ao evitar o perigo das DLLs no diretrio do sistema est sendo substituda posteriormente e quebra os aplicativos que dinamicamente vincule a eles.

Para adicionar dependncias para o CAB projeto somente (projetos C++)


1. 2. 3.
o

No Solution Explorer, clique com o boto direito do mouse em seu nome de projeto CAB, depois aponte para Add, e clique em File Navigate to <Visual Studio installation folder>\VC\ce\dll\armv4. Selecione os arquivos para adicionar. Para um projeto MFC, pressione CTRL e clique MFC80U.DLL, atl80.dll, e msvcrt80.dll. Talvez tambm precise Clique em uma ou mais das DLLs especficos do idioma se seu aplicativo exigir recursos especficos do idioma MFC. Para um Projeto ATL, pressione CTRL e clique atl80.dll e msvcrt80.dll. Se sua soluo ATL suporta MFC, clique em MFC80U.DLL tambm. Para um projeto Win32, clique em msvcrt80.dll. Clique Open na caixa Add Files de dilogo para adicionar os arquivos no seu projeto CAB. No painel esquerdo do File System Editor, clique com boto direito File System on Target Machine. Clique em Add Special Folder e, clique em Windows Folder. No painel esquerdo de File System Editor, clique na pasta que contm a sada principal. As DLLs tenham sido adicionadas por padro para a mesma pasta como a Sada principal. Para mov-los para a pasta Windows, selecione os arquivos no painel central da File System Editor, arraste.-los sobre para o Windows Folder cone Use o mesmo procedimento para adicionar qualquer outras dependncias exigidas pela sua soluo. Voc pode adicionar dependncias em qualquer pasta; no necessrio para adicion-los pasta Windows.

o o

4. 5. 6. 7.

8.

Para criar um atalho para o aplicativo de projeto de dispositivo


1. 2. No painel direito da File System Editor, selecione Primary output from <your application project name>. No menu Action, selecione Create Shortcut to Primary output from <your application project name>. Este comando adiciona um item atalho abaixo do item de sada. 3. Clique com o boto direito do mouse o item atalho, clique Rename, e renomear o atalho para algo adequado para um atalho.

Para adicionar uma entrada de Registro


1. 2. 3. No Solution Explorer, selecione o projeto CAB. No menu View, aponte para Editor, e clique em Registry. Na Registry Editor, HKEY_CURRENT_USER, clique com o boto direito do mouse e, em seguida clique New Key no menu de atalho.

Visual C# Consolidado

1227

4. 5. 6. 7.

Quando a New Key entrada for exibida na, a Registry Editor renomeao-lo SOFTWARE. Clique com o boto direito do mouse essa nova chave, aponte para New, e clique em Key Quando a New Key entrada for exibida na, a Registry Editor renomeao-lo MyCompany. Clique com o boto direito do mouse na MyCompany entrada, e clique em Janela de Propriedades no menu de atalho O Name valor foi alterado para MyCompany. Criando e Implantando o arquivo CAB

Para criar o arquivo CAB


1. No menu Build, clique em Build CABProject. OuClique com o boto direito do mouse CABProject no Solution Explorer, e clique em Build. 2. No menu File, clique em Save All. Arquivos CAB para solues Smartphone devem ser assinados digitalmente antes que so implantados para dispositivo uma usurio fim na. No h suporte para assinatura digital sobre solues Pocket PC baseadas em Windows Mobile 2003SE e anteriormente. Para obter mais informaes, consulte Como Assinar um Arquivo CAB (Dispositivos).

Para implantar o arquivo CAB para o dispositivo


1. 2. No Windows Explorer, navegue at a pasta onde voc armazenados nesta soluo. Voc encontrar o arquivo cab na pasta CABProject\Release da sua soluo. Copie o arquivo CAB para um dispositivo que esteja conectado com o ActiveSync 4.0 ou posterior. Quando um usurio toques no nome de arquivo CAB File Explorer no dispositivo, Windows CE explodir o CAB, e instalar o aplicativo no dispositivo. Para obter mais informaes, consulte a documentao e Smartphone Pocket PC SDK. Consulte tambm

Como Importar e Aplicar Certificados em Projetos de Dispositivos


A Select Certificate caixa de dilogo est o portal central para assinar projetos de dispositivo. Ele fornece uma entrada caixa Manage Certificates de dilogo caixa e a Certificate Import Wizard como descritos nas etapas a seguir. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Exibindo a caixa de dilogo Selecionar de certificados

Visual C# Consolidado

1228

Como voc acessar a Select Certificate caixa de dilogo depende do tipo de projeto que voc deseja assinar.

Para exibir a caixa de dilogo Selecionar certificado


1. 2.
o o o

No Solution Explorer, clique com o boto direito do mouse <Projectname> e depois no menu de atalho, clique em Properties. Continuar usando um dos seguintes procedimentos: Para projetos do Visual Basic e Visual C# selecione Authenticode Signature, e clique em Select Certificate.: a Project Designer, clique Devices em Em projetos Visual C++, selecionar Authenticode Signing, e clique no boto de reticncias na linha Certificate propriedade Em projetos inteligente CAB dispositivo, selecione Authenticode Signing, e depois clique em Select from Store.

Selecionar um certificado para um projeto de dispositivo Aps voc ter exibido caixa Select Certificate de dilogo conforme descrito em etapas anteriores, voc pode selecionar o certificado a ser.

Para selecionar um certificado para o projeto usando a caixa de dilogo Selecionar certificado

Se a Select Certificate caixa de dilogo exibe o certificado a ser para o projeto, selecione o certificado, e clique em OK O projeto est assinado com esse certificado quando o projeto criado. Se a Select Certificate caixa de dilogo no exibir o certificado a ser para o projeto, voc pode importar um certificado usando o Certificate Import Wizard.

Importar um certificado para um projeto de dispositivo As etapas a seguir mostram como preencher a Select Certificate caixa de dilogo ao importar os certificados de teste fornecidos pelo Visual Studio e aplicao da um projeto. Voc pode seguir esse mesmo procedimento se voc desejar aplicar um certificado diferente. Fornece Visual Studio trs elementos da interface do usurio para a tarefa de importar um certificado para aplicar a um projeto:

A Select Certificate caixa de dilogo que especifica quais certificados so a serem aplicadas ao projeto atual. A Manage Certificates caixa de dilogo que lista o certificado arquivos disponvel no computador de desenvolvimento. O Assistente para importao de certificados que guiar voc selecionar o arquivo de certificado e especificar onde deseja armazen-lo.

Para importar um certificado de teste usando o Assistente para importao de certificados


1. Na caixa Select Certificate de dilogo, clique em Manage Certificates. Caixa Manage Certificates de dilogo exibe uma lista de certificados armazenados no computador de desenvolvimento. 2. 3. Clique Import para abrir o Certificate Import Wizard. Clique Next para abrir a File to Import pgina do assistente.

Visual C# Consolidado

1229

4.

Clique Browse para navegar para a TestCertificates pasta no Visual Studio. Por padro, esta pasta est localizada em \Program Files\Microsoft 8\SmartDevices\SDK\SDKTools Visual Studio.

5. 6. 7. 8. 9.

Alterar a Files of Type seleo para All Files (*.*), selecionar TestCert_Privileged.pfx ou TestCert_Unprivileged.pfx. e, em seguida clique em Open Na pgina File to Import do assistente, clique Next para abrir a Password pgina. Deixe a Passwod caixa em branco. Esses teste certificados no tem uma senha. Clique Next para abrir a Certificate Store pgina. Certifique-se de que Personal est marcada na caixa Certificate store. Clique Next para exibir a pgina de concluso, e clique em Finish. A mensagem Import was successful exibida. Clique OK para ignorar a mensagem. O certificado agora aparece na lista Manage Certificates. Clique Close para retornar caixa Select Certificate de dilogo.

10. Selecione o certificado que desejar e clique em OK. O certificado agora listado na pgina de propriedades iniciado a partir.

Como Iniciar Signtool.exe como um Evento Post-Build (Dispositivos)


Executar signtool.EXE como um evento Post-Build quando outros eventos Post-Build alterar os binrios originais. Alteraes binrios assinados invalida a assinatura original. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Para iniciar signtool.EXE como um evento Post-Build em projetos do dispositivo Visual Basic e Visual C# 1. 2. 3. No Solution Explorer, clique com o projeto, e no menu de atalho, clique em Properties Da Build Events pgina (Visual C#) ou a Compile pgina (Visual Basic), clique em Edit Post-build. Na caixa Post-build Event Command Line de dilogo, digite a linha de comando signtool com as opes selecionadas. Para obter mais informaes sobre como executar signtool a partir da linha de comando, consulte SignTool. Para iniciar signtool.EXE como um evento Post-Build em projetos de dispositivo Visual C++ 1. 2. 3. 4. 5. No Solution Explorer, clique com o projeto, e no menu de atalho, clique em Properties Em Configuration Properties, expanda o Build Events n. Clique em Post-Build Event. Selecione a Command Line propriedade, e clique no ellipsis boto. Para abrir a Command Line caixa de dilogo () Digite a linha de comando signtool com as opes selecionadas.

Visual C# Consolidado

1230

Para obter mais informaes sobre como executar signtool a partir da linha de comando, consulte SignTool.

Como Consultar um Dispositivo por seu Modelo de Segurana


Voc pode consultar um dispositivo para ver quais certificados j esto instalados no armazenamento de certificados do dispositivo. Voc pode usar essas informaes para determinar qual certificado desejado para assinar seu aplicativo COM. Consultando feito pelo executando RapiConfig.exe e passando em um arquivo XML StoreQuery, que contm a consulta de armazenamento de certificado. RapiConfig.exe depois envia um arquivo XML que contm o resultado da consulta. RapiConfig.exe, CertStoreQuery.xml, e vrios arquivos de consulta XML de exemplo esto localizados por padro no \Program Files\Microsoft 8\SmartDevices\SDK\SDKTools Visual Studio. Os seguintes componentes so necessrios para consultar o armazenamento de certificados do dispositivo:

O ActiveSync. RapiConfig.exe. Consulta armazenamento certificado XML arquivo (CertStoreQuery.xml). 1. 2. Estabelecer uma conexo do ActiveSync para o dispositivo. Digite o seguinte comando no prompt de comando, onde certstorequery.xml armazenamento de certificado o arquivo XML de consulta:
Rapiconfig.exe /P /M <certstorequery.xml>

Para consultar um dispositivo para seu modelo de segurana

3.

Exibir o arquivo RapiConfigOut.XML gerado.

Como: Assinar um aplicativo Visual Basic ou Visual C# (Dispositivos)


As seguintes etapas presumem voc tiver um dispositivo inteligente Visual Basic ou Projeto Visual C# na sua soluo. Para obter mais informaes, consulte Programao para Dispositivos usando o .NET Compact Framework. Essas etapas so os mesmos para projetos tanto EXE e DLL. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Para assinar um projeto Visual Basic ou Visual C# dispositivo 1. 2. 3. No Solution Explorer, clique com o projeto Visual Basic ou Visual C#, e seguida, no menu de atalho, clique em Properties. Na pgina Devices, clique em Authenticode Signature. Clique em Select Certificate.

Visual C# Consolidado

1231

4.
o o

Na caixa Select Certificate de dilogo: Se o certificado a ser exibido na lista, selecione-, e clique OK para fechar a caixa de dilogo. Se o certificado a ser no aparecer na lista, clique Manage Certificates para abrir a Manage Certificates caixa de dilogo. Para obter mais informaes, consulte Como Importar e Aplicar Certificados em Projetos de Dispositivos. Quando voc tiver terminado adquirir o certificado, clique OK na caixa Select Certificate de dilogo. Detalhes do Certificado aparecem na janela Application Signing da pgina Devices.

Como Assinar um Assembly Visual Basic ou Visual C# (Dispositivos)


As etapas abaixo presumem ter um dispositivo inteligente Visual Basic ou Visual C# projeto na soluo. Para obter mais informaes sobre como criar esses projetos, consulte Programao para Dispositivos usando o .NET Compact Framework. Essas etapas so os mesmos para projetos tanto EXE e DLL. Observao As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Para assinar um conjunto em um projeto de dispositivo Visual Basic ou Visual C# 1. 2. 3.
o o

No Solution Explorer, clique com o projeto Visual Basic ou Visual C#, e seguida, no menu de atalho, clique em Properties. Na pgina Signing, clique em Sign the assembly. Na caixa Choose a strong name key file: Se voc desejar usar um arquivo de chave de nome de alta segurana j existente, clique <Browse> para abrir caixa Select File de dilogo. Se voc desejar criar um novo arquivo de chave de nome de alta segurana, clique para abrir a Create Strong Name Key caixa de dilogo. New Aps completar as etapas acima, clique em Delay sign only.

Para atrasar uma assinatura de Assembly

Use este recurso quando voc no tem acesso a uma chave particular necessrio. Atraso assinatura fornece a chave pblica e adia adicionando a chave particular at o conjunto enviado a. Para obter mais informaes, consulte Como: Assinar com atraso um Assembly (Visual Studio).

Como Assinar um Arquivo CAB (Dispositivos)


As etapas abaixo presumem voc tiver um projeto CAB dispositivos inteligentes em sua soluo. Para obter mais informaes, consulte Viso geral Solutions do dispositivo de embalagem. Observao

Visual C# Consolidado

1232

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Para assinar um arquivo.cab de Dispositivo Inteligente 1. 2. 3. 4.
o o

No Solution Explorer, clique com o projeto CAB dispositivo inteligente, e clique Properties no menu de atalho Na pgina Build, selecione Authenticode Signature. Clique em Select from Store. Na caixa Select Certificate de dilogo: Se o certificado a ser exibido na lista, selecione-, e clique OK para fechar a caixa de dilogo. Se o certificado a ser no aparecer na lista, clique Manage Certificates para abrir a Manage Certificates caixa de dilogo. Para obter mais informaes, consulte Como Importar e Aplicar Certificados em Projetos de Dispositivos. Quando voc tiver terminado adquirir o certificado, clique OK na caixa Select Certificate de dilogo. O certificado aparecer na caixa Certificate da pgina Build.

5.

Na pgina Build, clique em OK.

Como Prover um Dispositivo em um Projeto Visual Basic ou Visual C#


Configurao um dispositivo se refere ao adicionar certificados digitais a armazenamentos de certificados do dispositivo. Para obter mais informaes, consulte Um Practical guia para a segurana do Smartphone e cdigo modelo assinatura para desenvolvedores. Pressuponha as seguintes etapas:

Voc ter um projeto de dispositivos inteligentes Visual Basic ou Visual C# em sua soluo. Para obter mais informaes, consulte Programao para Dispositivos usando o .NET Compact Framework. Voc entrou o aplicativo. Para obter mais informaes, consulte Como: Assinar um aplicativo Visual Basic ou Visual C# (Dispositivos). Observao

As caixas de dilogo e comandos de menu que voc v podem ser diferentes das descritas em Help (Ajuda) dependendo das configuraes ativas ou edio. Para alterar as configuraes, escolha Import and Export Settings No menu Tools. Para obter mais informaes, consulte Configuraes do Visual Studio. Para configurar um dispositivo em um projeto de dispositivo gerenciado 1. 2. 3.
o o

No Solution Explorer, clique com o projeto Visual Basic ou Visual C#, e seguida, no menu de atalho, clique em Properties. Abra a Devices pgina. Na caixa Device provisioning, selecione uma das opes a seguir: O dispositivo de destino no Provision Configurar o armazenamento Privileged

Visual C# Consolidado

1233

Configurar o armazenamento Unprivileged

Como Prover um Dispositivo com um Modelo de Segurana


Voc pode definir o modelo de segurana do dispositivo explicitamente para testar um aplicativo em vrios modelos de segurana. Depois configurao um modelo de segurana diferente se o dispositivo j est bloqueado por fabricante do equipamento original (OEM), talvez no possvel. No entanto, se o dispositivo no estiver protegido, voc pode prover ele com qualquer modelo de segurana. Os seguintes arquivos XML de modelo de segurana esto includos no Visual Studio 2005. O local padro \Program Files\Microsoft 8\SmartDevices\SDK\SDKTools\SecurityModels Visual Studio.
o o o o o o

Locked.XML define o seguinte modelo de segurana em duas camadas: Notifique-o antes de executar aplicativos. No execute aplicativos no assinados. Prompt.XML define o seguinte modelo de segurana em duas camadas: Notifique-o antes de executar aplicativos. Executar aplicativos sem assinatura como sem privilgios. Open.XML define o modelo de segurana-uma camada a seguir: No solicitar. Executar todos os aplicativos, incluindo no assinados, como privilegiado.

Os seguintes componentes sero necessrias a fim de configurar o dispositivo com um modelo de segurana:

O ActiveSync. RapiConfig.exe, localizado, por padro em \Program Files\Microsoft 8\SmartDevices\SDK\SDKTools Visual Studio. Arquivo XML de segurana. 1. 2. Estabelecer uma conexo do ActiveSync para o dispositivo. Digite o seguinte comando no prompt de comando, onde securityfile.xml o arquivo XML de modelo de segurana:
RapiConfig.exe /P /M <securityfile.xml>

Para configurar um dispositivo com um modelo de segurana

Visual C# Consolidado

1234

Implantao (Como fazer em C#)


Os links desta pgina ajudam nas tarefas de implantao mais comuns. Para ver outras categorias de tarefas populares abordadas na Ajuda, consulte Como fazer em C#. ClickOnce COMO: Publicar um aplicativo ClickOnce Demonstra como tornar um aplicativo ClickOnce disponvel aos usurios publicando-o em um servidor Web, compartilhamento de arquivo, ou mdia removvel. COMO: Especificar uma publicao local Demonstra como especificar o local onde os arquivos de aplicativo e manifesto sero colocados. COMO: Especificar uma URL de Instalao Demonstra como utilizar a propriedade URL de Instalao para especificar o servidor Web onde os usurios iro fazer download do aplicativo. COMO: Especificar uma URL de Suporte Demonstra como utilizar a propriedade URL de Suporte para identificar uma pgina da Web ou compartilhamento de arquivo onde usurios podem ir para obter informaes sobre o aplicativo. COMO: Especificar o modo de instalao ClickOnce Demonstra como definir o modo de instalao para especificar se o aplicativo ser disponvel off-line ou on-line. COMO: Ativar AutoIniciar para instalaes a partir de CD Demonstra como ativar AutoIniciar para que o aplicativo ClickOnce seja automaticamente iniciado quando a mdia for inserida. COMO: Definir o Verso de Publicao do ClickOnce Demonstra como definir a propriedade Verso de Publicao, que determina se o aplicativo que voc est publicando ser tratado como uma atualizao. COMO: Automaticamente incrementar a Verso de Publicao do ClickOnce Demonstra como alterar a propriedade Verso de Publicao para fazer com que o aplicativo seja publicado como uma atualizao. COMO: Especificar qual arquivo foi publicado via ClickOnce Demonstra como excluir arquivos, marcar os arquivos como arquivos de dados ou prrequisitos, e criar grupos de arquivos para instalao condicional. COMO: Instalar pr-requisitos com um aplicativo ClickOnce

Visual C# Consolidado

1235

Demonstra como especificar um conjunto de componentes de pr-requisito para ser empacotado junto com seu aplicativo. COMO: Gerenciar atualizaes para um aplicativo ClickOnce Demonstra como especificar quando e como verificaes de atualizao so executadas, se as atualizaes so obrigatrias, e onde o aplicativo deve verificar por atualizaes. COMO: Incluir um arquivo de dados em um aplicativo ClickOnce Fornece procedimentos que mostram como adicionar um arquivo de dados de qualquer tipo em um aplicativo ClickOnce. COMO: Implantar o .NET Framework usando o Systems Management Server Fornece tarefas que devem ser executadas no servidor que executa o Systems Management Server. COMO: Adicionar um Publisher confivel a um computador cliente para aplicativos ClickOnce Mostra como usar a ferramenta de linha de comando CertMgr.exe para adicionar um certificado de editor aos editores de confiana armazenados no computador cliente. COMO: Especificar um local alternativo para implantao de atualizaes Mostra como especificar um local alternativo para atualizaes em seu manifesto de implantao para que o aplicativo possa atualizar a si prprio a partir da Web aps sua instalao inicial. COMO: Implantar o .NET Framework usando o Active Directory Fornece um procedimento para implantar o .NET Framework usando o Active Directory. COMO: Recuperar informaes de seqncia de consulta em um aplicativo ClickOnce Fornece procedimento para mostrar como usar um aplicativo ClickOnce para obter informaes de seqncia de consulta. Ele tambm mostra como seu aplicativo ClickOnce pode usar um pedao pequeno de cdigo para ler esses valores na primeira vez que inicia o aplicativo. COMO: Ativar configuraes de segurana ClickOnce Demonstra como desabilitar temporariamente as configuraes de segurana durante o desenvolvimento. COMO: Definir uma Zona de Segurana para um aplicativo ClickOnce Demonstra como definir uma zona de segurana para preencher as permisses exigidas pela tabela de aplicativo. COMO: Definir permisses personalizadas para um aplicativo ClickOnce Demonstra como restringir o aplicativo s permisses especficas que ele precisa para operar corretamente.

Visual C# Consolidado

1236

COMO: Determinar as permisses para um aplicativo ClickOnce Demonstra como analisar o aplicativo para determinar as permisses necessrias, executando a ferramenta Permission Calculator. COMO: Depurar um aplicativo ClickOnce com permisses restritas Demonstra como depurar o aplicativo com as mesmas permisses que o usurio final. O Windows Installer Implantao do Windows Installer Links para artigos sobre como usar a implantao do Windows Installer para criar pacotes instaladores a serem distribudos aos usurios. Passo a passo: Distribuindo um aplicativo baseado no Windows Demonstra o processo de criao de um instalador para um aplicativo do Windows que inicia o bloco de notas. Passo a passo: Instalando componentes compartilhados usando mdulos de mesclagem Como usar mdulos de mesclagem para garantir que componentes compartilhados so empacotados e entregues para implantao consistente. Passo a passo: Criando uma ao personalizada Demonstra o processo de criao de uma DLL de ao personalizada para direcionar um usurio a uma pgina da Web no final de uma instalao. Passo a passo: Usando uma ao personalizada para exibir uma mensagem na instalao Demonstra como usar uma ao personalizada para tirar a entrada do usurio e pass-la a uma caixa de mensagem que aparece durante a instalao. Passo a passo: Usando uma ao personalizada para pr-compilar um assembly na instalao Demonstra como passar o caminho de uma DLL para a propriedade CustomActionData para pr-compilar o assembly para cdigo nativo durante a instalao. Passo a passo: Usando uma ao personalizada para criar um banco de dados na instalao Demonstra o uso de uma ao personalizada e a propriedade CustomActionData para criar um banco de dados e tabela de banco de dados durante a instalao. Passo a passo: Redirecionando um aplicativo para alcanar um XML Web Service diferente na instalao Demonstra como criar um aplicativo da Web que pode ser redirecionado para alcanar um XML Web Service diferente usando a propriedade Comportamento da URL, uma classe de instalador, e um projeto de Configurao Web. COMO: Instalar pr-requisitos na implantao do Windows Installer

Visual C# Consolidado

1237

Demonstra como detectar a existncia de componentes durante a instalao e instala um conjunto pr-determinado de pr-requisitos, um processo conhecido como inicializao. COMO: Criar ou adicionar projetos de implantao Demonstra como especificar onde e como sua soluo ser implantada durante e depois do desenvolvimento. COMO: Criar ou adicionar um instalador de projeto Demonstra como criar arquivos do Windows Installer (.msi), que so usados para distribuir seu aplicativo para instalao em outro computador ou servidor Web. COMO: Criar ou adicionar um projeto de mdulo de mesclagem Demonstra como criar um projeto de mdulo de mesclagem para arquivos de pacote ou componentes que sero compartilhados entre vrios aplicativos. COMO: Criar ou adicionar um projeto CAB Demonstra como criar um projeto CAB para criar arquivos de gabinete (.CAB) que podem ser usados por componentes baixados em um navegador da Web. COMO: Definir propriedades do projeto de implantao Demonstra como definir propriedades dependentes de configurao usando a caixa de dilogo de Propriedades de Implantao. COMO: Adicionar itens a um projeto de implantao Demonstra como especificar o que precisa ser includo no instalador e onde instal-lo no computador de destino. COMO: Adicionar mdulos de mesclagem a um projeto de implantao Demonstra como usar mdulos de mesclagem (arquivos .msm) para compartilhar componentes entre vrios projetos de implantao. COMO: Adicionar e remover cones Demonstra como instalar e associar cones a seu aplicativo em um computador de destino durante a instalao. COMO: Excluir itens do Projeto de Implantao Demonstra como excluir um arquivo ou arquivos de um projeto de implantao. COMO: Definir instalao condicional com base em verses do sistema operacional Demonstra como definir a propriedade Condio para adicionar lgica condicional a um instalador, por exemplo, instalando diferentes arquivos ou definindo valores diferentes de registro para verses diferentes do sistema operacional.

Visual C# Consolidado

1238

Você também pode gostar