Você está na página 1de 1238

Nvel I - Iniciante

Autor: Elzevir Jr.


Janeiro, 2007

Visual C# Consolidado 1
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 2
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 3
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 4
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 5
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 6
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 7
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 8
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 9
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. No menu File, aponte para New, e em seguida, clique em Project
2. 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. No menu View, clique em Toolbox para tornar a lista de controles visvel.
4. Expanda a lista Common Controls, e arraste o controle Label para seu formulrio.
5. Tambm da lista Common Controls, arraste um boto para o formulrio, prximo ao
Label.

Visual C# Consolidado 25
6. 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.
7. Altere o mtodo para ter esta aparncia:
private void button1_Click(object sender, EventArgs e) {label1.Text = "Hello, World!";}
8. 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. Selecione um tipo de aplicativo Starter Kit, e clique em OK.
O Starter Kit carregado no Visual C#.
3. 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:

"" Uma seqncia


@" " Uma seqncia verbatim
#if, #endif Pr-processamento diretivas para sees condicionais
#region, #endregion Pr-processamento diretivas para sees condicionais
case, break Palavras-chave instruo controle
default, break Palavras-chave instruo controle
for, break Palavras-chave expresso avaliao
for, continue Palavras-chave expresso avaliao
foreach, break Palavras-chave expresso avaliao
foreach, continue Palavras-chave expresso avaliao
while, break Palavras-chave expresso avaliao
while, continue 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 Exibido por padro? Observaes


Class View No Exibir de classe est disponvel no menu
View.
Filtragem est ativada.
Janela de No
Comando
Dynamic Help No Pressionar a tecla F1 no exibe a janela da Ajuda
Window 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 No No exibida membros herdados por padro.
objetos
Janela Output No
Solution Explorer Sim Explorer de soluo aparece encaixado no lado direito
de IDE.
Start Page Sim, quando voc A pgina inicial Exibe artigos na alimentao RSS
inicia o IDE MSDN no Visual C#.
Lista de tarefas No
(Visual Studio)
Toolbox Sim, quando voc A caixa de ferramentas aparece como uma janela que
cria um aplicativo do encaixada no lado esquerdo de IDE recolhida.
Windows Forms

Teclado

Recurso Comportamento
Teclas de atalho 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 ALT + Abre o menu Programa, permitindo ao usurio para gerenciar
aplicativo espaos o estado da janela do aplicativo, por exemplo, mover ou
redimensionar.
Ativar menu ALT + HFEN Abre o menu de documento, permitindo ao usurio para
Janela gerenciar o estado da janela do documento ativo, por
Documento exemplo, mover ou redimensionar. Disponvel somente
enquanto no modo MDI de dentro uma janela de documento.
Ativar ferramenta ALT + HFEN Abre o menu Janela ferramenta, permitindo ao usurio para
menu Janela mover a janela ferramenta no IDE. Disponvel somente ao
dentro de uma janela ferramenta.
Aplicativo de ALT + F4 Fecha o IDE.
fechamento
Fechar CTRL+F6 Fecha o documento aplicativo ativo.
documento
Recolher Todos Num +- Recolhe todos os ns no modo de exibio de rvore atual.
os ns de rvore
Expandir todos os Num + * Expande todos os ns no modo de exibio de rvore atual.
ns de rvore
Mover para Barra ALT Ativa a barra de menus IDE principal.
de menus
Mova para CTRL + TAB Move para a prxima barra de ferramentas visvel. Disponvel
ferramentas somente enquanto a barra de menus principal estiver ativa.
prxima
Mover para Barra CTRL + Move para a barra de ferramentas visvel anterior. Disponvel
de ferramentas SHIFT + TAB somente enquanto a barra de menus principal estiver ativa.
anterior
Mova para SHIFT + ALT Ativa a barra de ferramentas Janela ferramenta. Disponvel
ferramentas somente em uma janela ferramenta contendo uma barra de
Janela ferramenta ferramentas.
Mover o foco de CTRL + Move o foco em modo de exibio de rvore para baixo sem
rvore abaixo DOWN. alterar a seleo. Este atalho pode ser utilizado para
selecionar vrios itens na rvore.
Move o foco de CTRL + UP Move o foco em modo de exibio de rvore backup sem
rvore cima alterar a seleo. Este atalho pode ser utilizado para
selecionar vrios itens na rvore.
Menu de atalho SHIFT + F10 Exibe o menu de atalho.
Alternar F4 Oculta e mostra uma lista drop-down. Disponvel somente de
visibilidade lista uma lista drop-down.
drop-down
Alternar seleo CTRL + Alterna uma seleo para o foco atual em modo de exibio
foco de rvore SPACEBAR de rvore.

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 as combinaes de teclas de atalho
disponveis ao trabalhar no Editor de dilogo.
Lista Teclas de acelerao para o editor de imagem as combinaes de teclas de atalho
disponveis ao trabalhar no editor de imagem.
Lista Depurao teclas de atalho, definies gerais de desenvolvimento as combinaes
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 as
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 as
combinaes de teclas de atalho disponveis ao exibir e procurar tpicos da Ajuda.
Lista Objeto teclas de atalho do navegador, definies gerais de desenvolvimento as
combinaes de teclas de atalho disponveis ao trabalhar no Pesquisador de objetos.
Lista Macro teclas de atalho, definies gerais de desenvolvimento as combinaes de
teclas de atalho disponveis para trabalhar com macros.
Lista Ferramenta janela teclas de atalho, definies gerais de desenvolvimento as
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. Leia as informaes e avisos na primeira tela, e clique em Next.
3. 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.
4. Clique em Next.
5. Clique em Finish se tudo na pgina de resumo est correto.

Visual C# Consolidado 69
Uma caixa de dilogo aparece com informaes sobre propriedades padro para
depurao do projeto.
6. 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.
7. 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. Mover o cdigo do arquivo classe principal antigo para o novo ThisDocument,
ThisWorkbook,. e Sheet Classes
9. 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. Selecione a clula A1 no Sheet1.
2. 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. Selecione o projeto WinFormInput no Solution Explorer.
2. No menu Project, clique em Add Windows Form.
3. Nome do formulrio GetInputString.vb ou GetInputString.cs. e, em seguida
clique em Add
O novo formulrio aberto no designer.
4. Adicionar um TextBox e um Button. para o formulrio
5. 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. Clique com o boto direito do mouse ThisWorkbook.vb ou ThisWorkbook.cs em
Solution Explorer e selecione View Code.
2. 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. Clique duas vezes no boto para abrir o arquivo de cdigo com manipulador de eventos do
boto Click adicionado.
3. 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. Pressione F5 para executar o projeto.
2. Confirme se o formulrio Windows aparece.
3. Digite Hello World na caixa de texto e clique em OK.
4. 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. Verifique se a pasta de trabalho est abra no designer visual studio e que Sheet1 est
aberto.
2. Na guia Common Controls da Toolbox, arraste um CheckBox controle para ou
prxima clula B2 na Sheet1.
3. No menu View, selecione Properties Janela.
4. 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 Value (Valor)


Name applyBoldFont
Text Negrito

5. Arraste uma segunda caixa de seleo ou prxima clula B4 e alterar as seguintes


propriedades:

Propriedade Value (Valor)


Name applyItalicFont
Text Itlico

6. Arraste uma caixa de seleo terceira ou prxima clula B6 e alterar as seguintes


propriedades:

Propriedade Value (Valor)


Name applyUnderlineFont
Text Sublinhado

7. Selecione todos os controles caixa de seleo trs mantendo a tecla CTRL.


8. 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.

Visual C# Consolidado 74
Para adicionar texto a um controle NamedRange
1. Na guia Excel Controls da caixa de ferramentas, arraste um NamedRange controle
clula B9.
2. 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.
3. Clique em OK.
4. 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:

Propriedade Value (Valor)


Name textFont
Value2 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
1. Clique com o boto direito do mouse Sheet1 e clique View Code no menu de atalho
2. 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. Pressione F5 para executar o projeto.
2. Marque ou desmarque uma caixa de seleo.
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 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. Verifique se a My Excel Button.xls pasta de trabalho aberta no designer visual
studio, com Sheet1 exibido.
2. Na guia Common Controls da caixa de ferramentas, arraste para Sheet1. um TextBox
3. No menu View, selecione Properties Window.
4. Certifique-que TextBox1 est visvel na caixa Properties drop-down janela e alterar a
Name propriedade da caixa de texto para displayText.
5. Arraste um Button controle at Sheet1 e alterar as seguintes propriedades:

Propriedade Value (Valor)


Name insertText
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
1. Na Solution Explorer, clique com o boto direito do mouse Sheet1 e, em seguida
clique View Code no menu de atalho.
2. 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. Pressione F5 para executar o projeto.
2. 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. Verifique se a My Named Range Events.xls pasta de trabalho aberta no designer
visual studio, com Sheet1 exibido.
2. 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. 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.
4. 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. Adicionar um outro NamedRange controle a clula B3.
6. 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.
7. Clique em OK.
Clula B3 se torna um intervalo nomeado namedRange2.
Para adicionar texto a sua planilha
1. Na clula A1, digite o seguinte texto:
Este um Exemplo de um controle NamedRange.
2. 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
1. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou
Sheet1.cs. e selecione View Code
2. 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. Pressione F5 para executar o projeto.
2. 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. Duplo clique dentro namedRange1, e verifique se o texto sobre BeforeDoubleClick
eventos est inserido com texto em itlico em namedRange2 vermelho.
4. 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.
5. Alterar o texto dentro namedRange1.
6. 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. 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
3. 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. No menu File, clique em Save All.
5. Na caixa Save Project de dilogo, digite C:\Walkthroughs na caixa Location.
6. Clique em Save.
7. Pressione F5 para executar o projeto.
O Excel iniciado e aparecer a caixa de mensagem.
8. Fechar a caixa de mensagem.
9. 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. No Painel de Controle, abra Administrative Tools.
2. Executar Microsoft .NET Framework 2.0 Configuration.
3. 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. Clique em Yes.
6. 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. No menu Project no Visual Studio, clique em My Security Test Properties.
2. Clique na Signing guia.
3. Selecione Sign the assembly.
4. No, o Choose a strong name key file list clique New.
5. Na caixa Create Strong Name Key de dilogo, digite SecurityTestKey na caixa
Key file name.
6. Desmarque a Protect my key file with a password caixa de seleo.
7. Clique em OK.
O arquivo SecurityTestKey.snk de chave aparece no Solution Explorer.
8. 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. Abra Microsoft .NET Framework 2.0 Configuration novamente.
2. Clique com o boto direito do mouse no VSTOProjects n e clique New no menu de
atalho
3. Digite o nome Security Test Strong Name para o novo grupo de cdigos, e clique
em Next.
4. Na lista Choose the condition type for this code group, clique Strong Name.
5. Clique em Import.
6. 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.
7. Clique em Next.
8. Clique Next para aceitar o FullTrust conjunto de permisses e clique em Finish.
9. 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

Visual C# Consolidado 83
1. Pressione F5 para executar o projeto.
2. 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
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. Clique Add New Data Source Para iniciar o Data Source Configuration
Wizard.
3. 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. Aps uma conexo foi selecionado ou criado, clique em Next.
5. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next.
6. Expanda o Tables n na janela Database objects.
7. Marque a caixa de seleo ao lado da Customers tabela.
8. 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. Verifique se a My Simple Data Binding.xls pasta de trabalho aberta no designer
visual studio, com Sheet1 exibido.
2. Abra a Data Sources janela e expanda o Customers n.
3. Selecione a CompanyName coluna, e clique na seta suspensa que aparece.
4. 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. Selecione a CustomerID coluna na janela Data Sources, e clique na seta suspensa
que aparece.
6. Clique NamedRange na lista drop-down, e arraste a CustomerID coluna clula B1.
7. criado na clula B1, e vinculado a outro NamedRange controle chamado
customerIDNamedRange o BindingSource.
Para adicionar quatro botes
1. 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:

Clula (Nome)

Visual C# Consolidado 85
B3 Button2
C3 Button3
D3 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. 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
2. 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. Pressione F5 para executar o projeto.
2. Confirme se o primeiro registro aparece nas clulas A1 e B1.
3. Clique em e B1. (Button3) boto e confirme se o registro seguinte aparece na clula A1
a>
4. 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.
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
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. Clique Add New Data Source Para iniciar o Data Source Configuration
Wizard.
3. 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. Aps uma conexo foi selecionado ou criado, clique em Next.
5. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next.
6. Expanda o Tables n na janela Database objects.
7. Marque a caixa de seleo ao lado da Employees tabela.
8. 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. Verifique se a My Complex Data Binding.xls pasta de trabalho aberta no designer
visual studio, com Sheet1 exibido.
2. Abra a Data Sources janela e selecione o Employees n.
3. Clique na seta suspensa que aparece.
4. 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,
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
1. 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
2. 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. Clique em Clula B7, que deve conter o nome Davolio.
2. Digite o nome Anderson, e pressione ENTER.
Para modificar um cabealho de coluna
1. Clique na clula que contm no cabealho LastName da coluna.
2. Digitar Last Name, incluindo um espao entre as duas palavras, e pressione ENTER.
Para salvar dados
1. Clique Save na planilha.
2. Feche a pasta de trabalho. Clique em No Quando solicitado a salvar as alteraes feitas.
3. 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.
Para adicionar novas linhas
1. 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:

CdigoDoFuncionrio Sobrenome FirstName Ttulo


10 ITO Shu Gerenciador de vendas

Para excluir linhas


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

Visual C# Consolidado 90
As linhas so classificadas em ordem alfabtica por sobrenome.
Para filtrar informaes
1. Selecione uma clula dentro da lista.
2. Clique no boto SETA no cabealho da Title coluna.
3. Clique em Sales Representative.
A lista mostra somente as linhas que tm Sales Representative na coluna Title.
4. Clique no boto SETA no cabealho da Title coluna novamente.
5. 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 Master-
Detail 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.
2. Clique Add New Data Source Para iniciar o Data Source Configuration
Wizard.
3. 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. Aps selecionar ou criar uma conexo, clique em Next.
5. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next.
6. Expanda o Tables n na janela Database objects.
7. Selecione a Orders tabela e a Order Details tabela.
8. 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. Verifique se a My Master-Detail.xls pasta de trabalho aberta no designer visual
studio, com Sheet1 exibido.
2. Abra a Data Sources janela e expanda o Orders n.
3. Selecione a OrderID coluna, e clique na seta suspensa que aparece.
4. 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. Clique ListObject na lista drop-down, e arraste a Order Details tabela clula A6.
7. Um ListObject controle denominado Order_DetailsListObject criado na clula A6,
e vinculado BindingSource.
Para adicionar dois botes
1. 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.
Armazenar em cache DataSet
1. Selecione NorthwindDataSet No bandeja de componentes.
2. Na janela Properties, alterar a Modifiers propriedade para Public.
DataSets dever ser pblica antes cache est ativado.
3. 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. 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
2. 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. Pressione F5.
2. Verifique que o intervalo nomeado e o objeto lista so preenchidos com dados da fonte de
dados.
3. Rolar pelos alguns dos registros clicando nos botes.
4. Pasta de trabalho, salve e feche a pasta de trabalho e Visual Studio.
5. 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.
6. 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#.
7. Rolar pelos alguns dos registros para ver que a planilha opera normalmente quando
desconectado.
8. 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:
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. Abra o Excel 2003.
Abre uma nova pasta de trabalho.
2. Clique com o boto direito do mouse na Sheet3 guia e, em seguida clique Rename no
menu de atalho.
3. Renomear a planilha para Data for Chart.
4. 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
Oeste 500 550 550 600
Leste 600 625 675 700
Norte 450 470 490 510
Sul 800 750 775 790

Em seguida, adicione o grfico para a primeira planilha.


Para adicionar um grfico
1. No menu Insert, clique em Chart.
O Chart Wizard abre.
2. Clique em Next, deixando os padres selecionados.
3. Clique na caixa Data Range e desmarque qualquer seleo padro.
4. 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.
5. Para aceitar todos os padres para Step 3, clique Next em Next novamente.
6. No Step 4, garantir que As object in: est selecionado.

Visual C# Consolidado 95
7. Na lista As object in:, selecione Sheet1.
8. Clique em Finish.
9. 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:.
2. Clique no Browse boto e v para a pasta de trabalho que voc criou anteriormente
nessa explicao passo a passo.
3. 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
Para alterar o nome do controle grfico
Selecione o Chart controle no designer e alterar as seguintes propriedades na janela
Properties:

Propriedade Value (Valor)


Name dataChart
HasLegend False

Adicionar um controle de usurio ao projeto


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

Propriedade Value (Valor)

Visual C# Consolidado 96
Name columnChart
Text Grfico de coluna

3. Adicionar um boto de opo segundo para o controle de usurio, e alterar as


propriedades a seguir:

Propriedade Value (Valor)


Name barChart
Text Grfico de barras

4. Adicionar um boto de opo terceiro para o controle de usurio, e alterar as propriedades


a seguir:

Propriedade Value (Valor)


Name lineChart
Text Grfico de linha

5. Adicionar um boto de opo quarto para o controle de usurio, e alterar as propriedades a


seguir:

Propriedade Value (Valor)


Name areaBlockChart
Text 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
1. No Solution Explorer, clique com o boto direito do mouse no controle de usurio e
selecione View Code.
2. 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. No menu Build, clique em Build Solution.
O ChartOptions controle de usurio adicionado Toolbox.
2. 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. Pressione F5 para executar o projeto.
2. Selecione vrios botes de opo.
3. 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.
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
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. Clique Add New Data Source Para iniciar o Data Source Configuration
Wizard.
3. 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. Clique em Next.
5. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next.
6. Expanda o Tables n na janela Database objects.

Visual C# Consolidado 100


7. Marque a caixa de seleo ao lado da Suppliers tabela.
8. Expandir a Products tabela e selecione ProductName, SupplierID,
QuantityPerUnit. e UnitPrice
9. 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. Verifique se a My Excel Actions Pane.xls pasta de trabalho aberta no designer
visual studio, com Sheet1 exibido.
2. Na janela Data Sources , expanda a Suppliers tabela.
3. Clique na seta suspensa no n Company Name, e selecione NamedRange.
4. 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.
6. 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.
Para adicionar um controle painel Aes
1. Selecione o My Excel Actions Pane projeto no Solution Explorer.
2. No menu Project, selecione Add New Item.
3. 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. Alterar a Size propriedade para 171, 21.
3. 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. Clique com o boto direito do mouse no controle painel Aes e selecione View Code a
partir do menu de atalho
2. 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. 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
2. 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. Pressione F5 para executar o projeto.
2. 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.
4. Selecione vrias empresas para verificar o nome da empresa e Detalhes do Produto altere
conforme apropriado.
Prximas etapas
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. 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
2. 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. Pressione F5 para executar o projeto.
Inicia o Word e a caixa de mensagem aparece.
4. Fechar a caixa de mensagem.
5. 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
1. Clique com o boto direito do mouse o n de projeto no Solution Explorer.
2. Clique Publish no menu de atalho.
O Publish Wizard aparece.
3. Na caixa Specify the location to publish this application, digite
C:\TestDeploy.
4. 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. Criar um novo projeto Console Application.
2. Do Microsoft.VisualStudio.Tools.Applications.Runtime Adicionar referncias para e
System.Windows.Forms montagens para este projeto.
3. 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.
2. 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.
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.
2. 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.
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. Copiar o documento de Soluo e a manifesto de implantao para
\\DeployServer\ShareFolder.
3. 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. No computador de desenvolvimento, abra o WordDeployment.doc arquivo no
\\DeployServer\ShareFolder\.
2. 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 pr-
requisitos 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. 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
2. 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. Pressione F5 para executar o projeto.
O Excel iniciado e aparecer a caixa de mensagem.
4. Fechar a caixa de mensagem.
5. 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
1. Clique com o boto direito do mouse no n na Solution Explorer soluo.
2. Aponte para Add no menu de atalho, e clique em New Project.
A Add New Project caixa de dilogo ser exibida.
3. No painel Project types, expanda Other Project types e selecione Setup and
Deployment.
4. No painel Templates, selecione Setup project.
5. Nome do projeto ExcelSetup.
6. 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. Clique com o boto direito do mouse no ExcelSetup project n em Solution
Explorer.
2. Selecione View no menu de atalho, e depois clique em File System.
3. Clique com o boto direito do mouse Application Folder no painel esquerdo.
4. Aponte para Add no menu de atalho, e clique em Project Output.
5. Selecione ExcelDeployment na caixa Project.
6. Selecione Primary output na lista de tipos de sada.
7. Clique em OK.
A sada do projeto e dependncias aparecem no painel direito.
8. No Solution Explorer, expanda Detected Dependencies sob o ExcelSetup n
de projeto.
9. 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. Clique com o boto direito do mouse no n na Solution Explorer soluo.
2. Aponte para Add no menu de atalho, e clique em New Project.
A Add New Project caixa de dilogo ser exibida.
3. No painel Project types, expanda o n para a linguagem de programao, e selecione
Windows.
4. No painel Templates, selecione Class Library.
5. Nome do projeto ExcelCustomAction.
6. Clique em OK.
O novo projeto aparece na Solution Explorer.
7. 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. Clique com o ExcelCustomAction projeto no Solution Explorer.
2. Aponte para Add no menu de atalho, e clique em New Item.
A Add New Item caixa de dilogo ser exibida.
3. Selecionar Installer Class, e nome da classe ManifestEditor.
4. Adicione uma referncia ao conjunto Microsoft.VisualStudio.Tools.Applications.Runtime
para o ExcelCustomAction projeto.
5. Do ManifestEditor.cs clique com o boto direito do mouse no Solution Explorer,
ou ManifestEditor.vb arquivo e clique em View Code.
6. 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. Clique com o boto direito do mouse no ExcelSetup project n em Solution
Explorer.
2. Aponte para View no menu de atalho, e clique em Custom Actions.
3. O Custom Actions Editor, clique com boto direito no n e Install Clique em Add
Custom Action.
4. Na caixa Look In Selecionar Application Folder, e clique em Add Output
5. Selecione ExcelCustomAction na caixa Project.
6. Selecione Primary output na lista de tipos de sada, e depois clique em OK.
7. 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. Em expandir Install. o Custom Actions Editor,
9. 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. Clique com o boto direito do mouse e, em seguida clique em Run. Em Solution
Explorer, o ExcelSetup project
2. Siga as instrues no Assistente de Instalao, e especificar uma pasta de instalao no
seu computador de desenvolvimento.
3. Abrir a pasta de trabalho do Excel a partir da pasta de instalao.
4. 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. Verifique se a My Security Test.xls pasta de trabalho aberta no designer visual
studio, com Sheet1 exibido.
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
3. 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. No menu File, clique em Save All.
5. Na caixa Save Project de dilogo, digite C:\Walkthroughs na caixa Location.
6. Clique em Save.
7. Pressione F5 para executar o projeto.
O Excel iniciado e aparecer a caixa de mensagem.
8. Fechar a caixa de mensagem.
9. 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. No Painel de Controle, abra Administrative Tools.
2. Executar Microsoft .NET Framework 2.0 Configuration.
3. 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. Clique em Yes.
6. 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.
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. No menu Project no Visual Studio, clique em My Security Test Properties.
2. Clique na Signing guia.
3. Selecione Sign the assembly.
4. No, o Choose a strong name key file list clique New.
5. Na caixa Create Strong Name Key de dilogo, digite SecurityTestKey na caixa
Key file name.
6. Desmarque a Protect my key file with a password caixa de seleo.
7. Clique em OK.
O arquivo SecurityTestKey.snk de chave aparece no Solution Explorer.
8. 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. Abra Microsoft .NET Framework 2.0 Configuration novamente.
2. Clique com o boto direito do mouse no VSTOProjects n e clique New no menu de
atalho
3. Digite o nome Security Test Strong Name para o novo grupo de cdigos, e clique
em Next.
4. Na lista Choose the condition type for this code group, clique Strong Name.
5. Clique em Import.
6. 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. Clique em Next.
8. Clique Next para aceitar o FullTrust conjunto de permisses e clique em Finish.
9. 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. Pressione F5 para executar o projeto.
2. 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. Verifique se o documento est aberto no designer visual studio.
2. Na Common Controls guia e arraste-o para o documento. da Toolbox, arraste um
CheckBox
3. No menu View, selecione Properties Window.
4. 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 Value (Valor)


Name applyBoldFont
Text Negrito

5. Pressione Enter para mover o ponto de insero abaixo da primeira caixa de seleo.
6. Adicionar uma segunda caixa de seleo para o documento abaixo da ApplyBoldFont
caixa de seleo e alterar as propriedades a seguir:

Propriedade Value (Valor)


Name applyItalicFont
Text Itlico

7. Pressione Enter para mover o ponto de insero abaixo da segunda caixa de seleo.
8. Adicionar uma caixa de seleo terceira para o documento abaixo da ApplyItalicFont
caixa de seleo e alterar as propriedades a seguir:

Propriedade Value (Valor)


Name applyUnderlineFont
Text Sublinhado

9. 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


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. Clique com o boto direito do mouse ThisDocument no Solution Explorer, e, em
seguida clique View Code no menu de atalho.
2. 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. Pressione F5 para executar o projeto.
2. 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. Verifique se o documento est aberto no designer visual studio.
2. 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. No menu View, selecione Properties Window.


4. Certifique-que TextBox1 est visvel na caixa Properties drop-down janela e alterar a
Name propriedade da caixa de texto para displayText.
5. Arraste um Button controle para o documento e alterar as seguintes propriedades:

Propriedade Value (Valor)


Name insertText
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
1. Na Solution Explorer, clique com o boto direito do mouse ThisDocument e, em
seguida clique View Code no menu de atalho.
2. 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. Pressione F5 para executar o projeto.
2. Clique no boto.
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 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. No Solution Explorer, clique com o boto direito do mouse ThisDocument e
selecione View Code.
2. 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. Pressione F5 para executar o projeto.
2. Clique com o boto direito do mouse dentro do indicador e selecione Bold primeiro.
3. Verificar se todos os o texto no bookmark1 formatados como negrito.
4. Clique com o boto direito do mouse dentro do texto dos indicadores sobrepostos e
selecione Italic.
5. 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. Feche a Datasheet janela para aceite os valores padro no grfico e clique dentro do
documento para mover foco fora do grfico.
4. Clique com o boto direito do mouse no grfico e selecione Format Object.
5. 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. Selecione o My Chart Options projeto no Solution Explorer.
2. No menu Project, clique em Add New Item.
3. Na caixa Add New Item de dilogo, clique User Control, nome do controle
ChartOptions, e clique em Add
Para adicionar controles Windows Form ao controle de usurio
1. Se o controle de usurio estiver no visvel no designer, clique duas vezes em
ChartOptions no Solution Explorer.
2. Na guia Common Controls Da arraste um Radio Button controle para o controle de
usurio, e alterar as seguintes propriedades: o Toolbox,

Propriedade Value (Valor)


Name columnChart
Text Grfico de coluna

3. Adicionar um segundo Radio Button ao controle de usurio, e alterar as seguintes


propriedades:

Propriedade Value (Valor)


Name barChart
Text Grfico de barras

4. Adicionar um terceiro Radio Button ao controle de usurio, e alterar as seguintes


propriedades:

Propriedade Value (Valor)


Name lineChart
Text Grfico de linha

5. Adicionar um quarto Radio Button ao controle de usurio, e alterar as seguintes


propriedades:

Propriedade Value (Valor)


Name areaBlockChart
Text Grfico bloquear de rea

Adicionar Referncias

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. No menu Project, clique em Add Reference.
A Add Reference caixa de dilogo ser exibida.
2. Clique na COM guia.
3. 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. No Solution Explorer, clique com o boto direito do mouse no controle de usurio e
selecione View Code.
2. 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. No menu Build, clique em Build Solution.
O ChartOptions controle de usurio adicionado Toolbox.
2. Clique com o boto direito do mouse ThisDocument.vb no Solution Explorer, ou
ThisDocument.cs. e selecione View Designer
3. 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. Pressione F5 para executar o projeto.
2. Selecione vrios botes de opo.
3. 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.
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
1. Selecione o My Word Actions Pane projeto no Solution Explorer.
2. No menu Project, selecione Add New Item.
3. Na caixa Add New Item de dilogo, selecione Actions Pane Control, nome-la
ActionsControl, e clique em Add
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 do documento do Word e marque novamente. no estiver
disponvel,

2. Clique Add New Data Source Para iniciar o Data Source Configuration
Wizard.
3. 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. Clique em Next.
5. Desmarque a opo para salvar a conexo se ele estiver selecionado e clique em Next.
6. Expanda o Tables n na janela Database objects.
7. Marque a caixa de seleo ao lado e Products tabelas. o Suppliers
8. 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. Na janela Data Sources, expanda a Suppliers tabela.
2. Clique na seta suspensa no n Company Name, e selecione ComboBox.
3. 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. Mover a caixa de combinao para que ele seja sob o rtulo e alterar a Size propriedade
171, 21.
5. Expandir a Products tabela na janela Data Sources.
6. Clique na seta suspensa no n ProductName, e selecione ListBox.
7. 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 Value (Valor)


Name Inserir
Text 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. Selecione o CompanyNameComboBox controle.
2. Na janela Properties, clique no boto para a direita da propriedade DataSource, e
selecione SuppliersBindingSource.
3. Na janela Properties, clique no boto para a direita da propriedade DisplayMember,
e selecione CompanyName.
4. Selecione o ProductNameListBox controle.
5. Na janela Properties, clique no boto para a direita da propriedade DataSource,
expanda SuppliersBindingSource, e selecione FK_Products_Suppliers.
6. 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. Pressione F5 para executar o projeto.
2. Confirme se o painel Actions est visvel.
3. Selecione uma empresa na caixa de combinao e verifique que os itens na caixa
Products Lista alterar.
4. Selecione um produto, clique Insert no painel de aes, e verifique se os detalhes do
produto foram adicionados tabela no Word.
5. 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. No menu Project, clique em Add Reference.
2. Na guia COM, selecione biblioteca tipo 2.0 marcas inteligentes Microsoft e clique em OK.
3. 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.
4. 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[0-
9]+)?\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. Pressione F5 para executar o projeto.
2. 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. Clique no cone de marca inteligente que aparece sobre a seqncia reconhecida e clique
em Convert to Celsius.
4. 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. 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
2. 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. Pressione F5 para executar o projeto.
Inicia o Word e a caixa de mensagem aparece.
4. Fechar a caixa de mensagem.
5. 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
1. Clique com o boto direito do mouse o n de projeto no Solution Explorer.
2. Clique Publish no menu de atalho.

Visual C# Consolidado 136


O Publish Wizard aparece.
3. Na caixa Specify the location to publish this application, digite
C:\TestDeploy.
4. 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. Criar um novo projeto Console Application.
2. Do Microsoft.VisualStudio.Tools.Applications.Runtime Adicionar referncias para e
System.Windows.Forms montagens para este projeto.
3. 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.
2. 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.
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.
2. 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.

Visual C# Consolidado 138


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.
2. Copiar o documento de Soluo e a manifesto de implantao para
\\DeployServer\ShareFolder.
3. 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. No computador de desenvolvimento, abra o WordDeployment.doc arquivo no
\\DeployServer\ShareFolder\.
2. 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 pr-
requisitos 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. 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
2. 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. Pressione F5 para executar o projeto.
O Excel iniciado e aparecer a caixa de mensagem.
4. Fechar a caixa de mensagem.
5. 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
1. Clique com o boto direito do mouse no n na Solution Explorer soluo.
2. Aponte para Add no menu de atalho, e clique em New Project.
A Add New Project caixa de dilogo ser exibida.
3. No painel Project types, expanda Other Project types e selecione Setup and
Deployment.
4. No painel Templates, selecione Setup project.
5. Nome do projeto ExcelSetup.
6. 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. Clique com o boto direito do mouse no ExcelSetup project n em Solution
Explorer.
2. Selecione View no menu de atalho, e depois clique em File System.
3. Clique com o boto direito do mouse Application Folder no painel esquerdo.
4. Aponte para Add no menu de atalho, e clique em Project Output.
5. Selecione ExcelDeployment na caixa Project.
6. Selecione Primary output na lista de tipos de sada.
7. Clique em OK.

Visual C# Consolidado 141


A sada do projeto e dependncias aparecem no painel direito.
8. No Solution Explorer, expanda Detected Dependencies sob o ExcelSetup n
de projeto.
9. 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. Clique com o boto direito do mouse no n na Solution Explorer soluo.
2. Aponte para Add no menu de atalho, e clique em New Project.
A Add New Project caixa de dilogo ser exibida.
3. No painel Project types, expanda o n para a linguagem de programao, e selecione
Windows.
4. No painel Templates, selecione Class Library.
5. Nome do projeto ExcelCustomAction.
6. Clique em OK.
O novo projeto aparece na Solution Explorer.
7. 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. Clique com o ExcelCustomAction projeto no Solution Explorer.
2. Aponte para Add no menu de atalho, e clique em New Item.
A Add New Item caixa de dilogo ser exibida.
3. Selecionar Installer Class, e nome da classe ManifestEditor.
4. Adicione uma referncia ao conjunto Microsoft.VisualStudio.Tools.Applications.Runtime
para o ExcelCustomAction projeto.

Visual C# Consolidado 142


5. Do ManifestEditor.cs clique com o boto direito do mouse no Solution Explorer,
ou ManifestEditor.vb arquivo e clique em View Code.
6. 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. Clique com o boto direito do mouse no ExcelSetup project n em Solution
Explorer.
2. Aponte para View no menu de atalho, e clique em Custom Actions.
3. O Custom Actions Editor, clique com boto direito no n e Install Clique em Add
Custom Action.
4. Na caixa Look In Selecionar Application Folder, e clique em Add Output
5. Selecione ExcelCustomAction na caixa Project.
6. Selecione Primary output na lista de tipos de sada, e depois clique em OK.
7. Verifique que Primary output from ExcelCustomAction (Active) foi adicionado
lista de sadas primria para o projeto de instalao e clique em OK
8. Em expandir Install. o Custom Actions Editor,
9. 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. Clique com o boto direito do mouse e, em seguida clique em Run. Em Solution
Explorer, o ExcelSetup project
2. Siga as instrues no Assistente de Instalao, e especificar uma pasta de instalao no
seu computador de desenvolvimento.
3. Abrir a pasta de trabalho do Excel a partir da pasta de instalao.
4. 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. Verifique se a My Security Test.xls pasta de trabalho aberta no designer visual
studio, com Sheet1 exibido.
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
3. 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. No menu File, clique em Save All.
5. Na caixa Save Project de dilogo, digite C:\Walkthroughs na caixa Location.
6. Clique em Save.
7. Pressione F5 para executar o projeto.
O Excel iniciado e aparecer a caixa de mensagem.
8. Fechar a caixa de mensagem.
9. 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. No Painel de Controle, abra Administrative Tools.
2. Executar Microsoft .NET Framework 2.0 Configuration.
3. 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. Clique em Yes.
6. 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. Clique em OK.
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. No menu Project no Visual Studio, clique em My Security Test Properties.
2. Clique na Signing guia.
3. Selecione Sign the assembly.
4. No, o Choose a strong name key file list clique New.
5. Na caixa Create Strong Name Key de dilogo, digite SecurityTestKey na caixa
Key file name.
6. Desmarque a Protect my key file with a password caixa de seleo.
7. Clique em OK.
O arquivo SecurityTestKey.snk de chave aparece no Solution Explorer.
8. 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. Abra Microsoft .NET Framework 2.0 Configuration novamente.
2. Clique com o boto direito do mouse no VSTOProjects n e clique New no menu de
atalho
3. Digite o nome Security Test Strong Name para o novo grupo de cdigos, e clique
em Next.
4. Na lista Choose the condition type for this code group, clique Strong Name.
5. Clique em Import.
6. 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.
7. Clique em Next.
8. Clique Next para aceitar o FullTrust conjunto de permisses e clique em Finish.
9. Fechar Microsoft .NET Framework 2.0 Configuration.
Testar o aplicativo

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. Pressione F5 para executar o projeto.
2. 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:.
2. 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


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:.
2. Na guia Common Controls da caixa de ferramentas, clique no controle voc deseja
adicionar.
3. 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.

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:.
2. Na guia Common Controls Da clique Toolbox, o controle voc deseja adicionar
3. 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
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:.
2. 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
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:.
2. 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
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 Consulte o tpico


Herana: em C++, classes e estruturas so praticamente idnticas Classe
enquanto em C#, eles so bem diferentes. Classes C# pode implementar Interface
qualquer nmero de interfaces, mas pode herdar de apenas uma classe struct (Referncia do
base. Alm disso, estruturas C# no oferece suporte a herana, e no C#)
oferecerem suporte para construtores padro explcito (um fornecida
por padro).
Matrizes: em C++ uma matriz simplesmente um ponteiro. No C#, Matrizes (Guia de
matrizes so objetos que incluem mtodos e propriedades. Por exemplo, programao do C#)
o tamanho de uma matriz pode ser consultado via a Length propriedade. Indexadores (guia de
Matrizes C# tambm empregar Indexadores que verificam cada ndice programao C#)
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 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 long
bits,
Passar parmetros: em C++, todas as variveis so passados por valor, struct
a menos que explicitamente passados com um ponteiro ou uma Classe
referncia. Do ref no C#, classes so passados por referncia e (referncia) C# ref
estruturas so passadas pelo valor a menos que explicitamente Fora (referncia C#)
passados por referncia com ou out modificadores de parmetro.
A switch instruo: ao contrrio a instruo C++ switch, C# no oferece Alternar
suporte through fall-de um rtulo case para outro.
Representantes: representantes C# so aproximadamente semelhantes Delegar
aos indicadores de funo em C++, so de tipo seguro e segura.
Mtodos de classe base: C# oferece suporte a base palavra-chave para Base
chamar os membros de substitudo classe base de classes derivadas. Consulte tambm os
Alm disso, substituir mtodos virtual ou abstract explcito em C#, exemplos para
usando a override palavra-chave. Substituir
Ocultando mtodo: C++ oferece suporte a implcito " ocultar " do mtodo Novo
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 Directives
condicional. Nenhum arquivo de cabealho so usados em C#. Preprocessor C#
A manipulao de exceo e exceo acionada.: C# fornece palavra- finally try-
chave finally para fornecer para cdigo que deve ser executado finally try-catch-
independentemente de se
Operadores C# e typeof.: C# oferece suporte, como is operadores & Operator
adicionais Ele tambm apresenta funcionalidade diferente para alguns Operador |
operadores lgicos. Operador ^

TypeOf
Palavra-chave extern: em C++, extern usado para importar tipos. No extern
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 static
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 Main() e argumentos
em C++. Em C#, ele seja maiscula e sempre static. Alm disso, o de linha de comando
suporte para processamento de argumentos de linha de comando (Guia de programao
muito mais robusta em C#. C#)
Ponteiros so permitidos em C#, mas somente no unsafe modo. No seguro
Sobrecarga operadores ser executada de maneira diferente em C#. Operadores C#
Seqncias: em C++ uma seqncia simplesmente um arra de string
caracteres. Em C#, seqncias so objeto que oferecem suporte String
robustos mtodos de pesquisa.
Palavra-chave foreach permite-lhe percorrer matrizes e colees. foreach, em

Visual C# Consolidado 156


Globals: em C#, no h suporte para mtodos globais e variveis Estrutura geral de um
Mtodos e variveis precisa estar contidos em ou struct. um class programa C#
Importando Tipos: em C++, tipos comuns a vrios mdulos so Usando
colocados em arquivos de cabealho. No C#, essas informaes est Viso Geral Sobre
disponveis atravs de metadados. Metadados
Variveis locais em C# no podem ser usadas antes que eles sejam Mtodos (Guia de
inicializados. programao do C#)
Gerenciamento de memria: C++ no uma linguagem de lixo coletado; Coleta de Lixo
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 Destructors
recursos no gerenciados. Instruo using
(Referncia do C#)
Construtores: similar ao C++, se voc no fornecer um construtor de Construtores da
classe em C#, um construtor padro gerado automaticamente para instncia
voc. O construtor padro inicializa todos os campos para seus valores Tabela de valores
padro. padro
C# no oferece suporte campos Bit. Campos bit C++
Servios de entrada / sada C# e formatao contam com a biblioteca de Tour linguagem C#
tempo de execuo do .NET Framework. Formatao numrica
tabela de resultados
Em C#, parmetros de mtodo no podem ter valores padro. Use Compilador CS0241 de
overloads mtodo se voc desejar obter o mesmo efeito. erro
Em C#, tipos genricos e mtodos fornecem para parametrizao Tipo Generics em C#
de uma maneira que semelhante aos modelos C++, embora existem
diferenas significativas.
Palavra-chave as semelhante a um efeito padro, exceto que em vez Como referncia (C#)
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

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) { //... }
Ou-
CSharp
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:
csc Hello.cs
Se seu programa no contm quaisquer erros de compilao, um arquivo chamado Hello.exe
ser criado.
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 Matriz de seqncias de caracteres passado para principal


executable.exe a b c "a"
"b"
"c"
executable.exe one two " um "
" dois "
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.
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

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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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.
Para criar e executar o Exemplo matrizes a partir da linha de comando
Digite o seguinte no prompt de comando:
csc arrays.cs arrays

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 event new struct


as explicit null switch
base extern object this
bool false operator throw
break finally out true
byte fixed override try
case foat params typeof
catch for private uint
char foreach protected uong
checked goto public unchecked
class if readonly unsafe
const implicit ref ushort
continue in return using
decimal int sbyte virtual
default interface sealed volatile
delegate internal short void
do is sizeof while
double ock stackaloc
else ong static
enum namespace string

Palavras-chave contextuais

Obter parcial Definir


Valor Onde 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.
member-name
Mome do evento.
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.
3. Utilize ou evento:
Crie um objeto da classe que contm a declarao do evento.
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 modifique-
o 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 classe-
base 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 classe-
base. 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)
Lista que contm as interfaces implementadas pela estrutura, todas separadas por comas.
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:

Extenses administradas Para obter mais


C# para C++ informao...
class __gc struct palavra chave __gc
ou
__gc class
struct __value struct palavra chave __value
ou
__value class

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++:
cl /LD /MD Cmdll.c
Compile CM.cs mediante a lnea de comandos:
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:
CalcTax(this);
Declarar indicadores, por exemplo:
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.
unary-operator
Uno de os seguintes: + - ! ~ ++ true false
op-type
Tipo do primeiro (o nico) parmetro.
operand
Mome do primeiro (o nico) parmetro.
binary-operator
Uno de os seguintes: ^ << >> == != > < >= <=
op-type2
Tipo do segundo parmetro.
operand2
Mome do segundo parmetro.
conv-type-out
Tipo de destino de um operador de converso de tipos.
conv-type-in
Tipo de entrada de um operador de converso de tipos.

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.
finally-bock
Contm o controlador da exceo e ou cdigo que realiza a liberao de recursos.
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 do .NET
Tipo Intervalo Tamanho Framework
byte 0 a 255 Inteiro de 8 bits sem signo System.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;

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
Mome de ponteiro.
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:

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.
exception-declaration, exception-declaration-1, exception-declaration-2
Declarao do objeto exceo.
catch-bock, catch-bock-1, catch-bock-2
Contm o controlador da exceo.
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 do .NET
Tipo Intervalo aproximado Precisin Framework
45 38
foat 1.5 10 a 3.4 10 7 dgitos System.Single

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).
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 palavras-
chave 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.
exception-declaration, exception-declaration-1, exception-declaration-2
Declarao do objeto exceo.
catch-bock, catch-bock-1, catch-bock-2
Contm o controlador da exceo.
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.
statement
Instrues que se devem executar dentro do lao.
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 do .NET
Tipo Intervalo Tamanho Framework
uint 0 a 4.294.967.295 Inteiro de 32 bits sem signo System.UInt32

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.

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
Tipo Intervalo Tamanho Framework

char U+0000 a U+ffff Carcter Unicode de 16 bits System.Char

Literais
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.
identifier
Mome do delegado.
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
Tipo no administrado.
ptr
Mome de ponteiro.
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]);
}
}
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 Operadores
Aritmtica + - * / %
Lgico (boolean e bit a bit) & | ^ ! ~ && || True False
Concatenao de seqncia de caracteres +
Incremento, decrement ++ --
SHIFT << >>
Relacional == != < > <= >=
Atribuio = += -= *= /= %= &= |= ^= <<= >>= ??
Acesso membro .
Indexao []
Converso ()
Condicional ?:
Concatenao representante e remoo + -
A criao do objeto Novo
Informaes de Tipo Como sizeof TypeOf
Estouro Controle de exceo Marcada desmarcada
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:
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 Posibilidade de sobrecarrega


+, -, !, ~, ++, --, true, false 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.
=, ., ?:, ->, new, is, sizeof, typeof Estes operadores no podem ser sobrecarregados.

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 pr-
processamento.
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 pr-
processamento.
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-890f-
8fceb2a794a2}" "{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. No prompt de comando, mude para a subpasta Common7\Tools da instalao.
2. 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 Propsito
/filealign Especifica o tamanho das sees no arquivo de sada.
/ Otimizar Ativa / desativa otimizaes.

Arquivos de sada
Opo Propsito
/Doc Especifica um arquivo XML onde os comentrios documentao processados so a
serem gravados.
/ Fora Especifica o arquivo de sada.
/PDB Especifica o nome de arquivo e local do arquivo.pdb.
/platform Especificar a plataforma de sada.
/target Especifica o formato do arquivo de sada usando uma das quatro opes:
/Target:exe/Target:Library/Target:Module/Target:winexe

Conjuntos .NET Framework


Opo Propsito
/addmodule Especifica um ou mais mdulos que faa parte deste conjunto de mdulos
(assembly).
/delaysign Instrui o compilador para adicionar a chave pblica mas para deixar o conjunto no
assinado.
/keycontainer Especifica o nome do recipiente de chave de criptografia.
/KeyFile Especifica o nome do arquivo que contm a chave criptogrfica.
/lib Especifica o local de conjuntos referenciado por meio de /Reference.

Visual C# Consolidado 264


/nostdlib Instrui o compilador No para importar a biblioteca padro (mscorlib.dll).
/Reference Importa metadados de um arquivo que contm um conjunto.

Erros Debugging / verificao


Opo Propsito
/bugreport 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
selecionada que estoura os limites do tipo de dados.
/Debug Instrua o compilador para emitir informaes de depurao.
/errorreport Define relatrio comportamento erros.
/fullpaths Especifica o caminho absoluto para o arquivo na sada do compilador.
/nowarn Suprime o compilador na gerao de avisos especificados.
/ Avisar Define o nvel de aviso.
/warnaserror Promove avisos a erros.

Preprocessor
Opo Propsito
/ Define Define smbolos de pr-processamento.

Recursos
Opo Propsito
/linkresource Cria um vnculo a um recurso gerenciado.
/Resource Incorpora um recurso do .NET Framework no arquivo de sada.
/win32icon Especifica um arquivo.ico para inserir no arquivo de sada.
/win32res Especifica um recurso do Win32 para inserir no arquivo de sada.

Diversos
Opo Propsito
@ Especifica um arquivo de resposta.
/? Lista opes do compilador para STDOUT.
/BaseAddress Especifica o endereo base preferido no qual se carregar um DLL.
/Codepage Especifica a pgina de cdigos a ser usado para todos os arquivos de cdigo de
fonte a compilao.
/help Lista opes do compilador para STDOUT.
/langversion Especifica qual verso do idioma a ser usado.
/ Principal Especifica o local do mtodo Main.
/noconfig Instrui o compilador no para compilar com CSC.RSP.
/nologo Evita Suprime as informaes de faixa do compilador.
/recurse Procura subdiretrios para arquivos de origem para compilar.

Visual C# Consolidado 265


/ unsafe Permite compilao do cdigo que usa a No seguro palavra-chave.
/utf8output 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 Propsito
@ L um arquivo de resposta para obter mais opes.
/? Exibe uma mensagem de uso para STDOUT.
/addmodule Vincula os mdulos especificados para este conjunto de mdulos (assembly)
/BaseAddress Especifica o endereo base para a biblioteca a ser criado.
/bugreport Cria um arquivo ' Relatrio de erros '. Este arquivo ser enviado junto com
qualquer informao de falha se usado com /errorreport:prompt ou
/errorreport:Send.
/ selecionada Faz o compilador para gerar verificaes de estouro.
/Codepage Especifica a pgina de cdigo a ser utilizado quando abrir arquivos de origem.
/Debug Emite as informaes de depurao.
/ Define Define smbolos de compilao condicional.
/delaysign Signs atraso-o conjunto usando somente a parte pblica da chave do nome de alta
segurana.
/Doc Especifica um arquivo de documentao XML para gerar.
/errorreport Especifica como lidar com erros de compilador interno: prompt, envio, ou nenhum.
O padro Nenhum.
/filealign Especifica o alinhamento usado para sees de arquivo de sada.
/fullpaths Faz o compilador para gerar caminhos totalmente qualificados.
/help Exibe uma mensagem de uso para STDOUT.
/incremental Permite compilao incremental [obsoleta].
/keycontainer Especifica um recipiente de chave de nome de alta segurana.
/KeyFile Especifica um arquivo de chave de nome de alta segurana.
/langversion Especifica modos de verso de idioma: ISO-1 ou padro.
/lib Especificar diretrios adicionais para procurar por referncias em.
/linkresource Vincula o recurso especificado a este conjunto.
/ Principal Especifica o tipo que contm o ponto de entrada (Ignorar todos os outros pontos
de entrada possveis).
/noconfig Instrui o compilador no para automaticamente incluir arquivo CSC.RSP.
/nologo Evita Suprime mensagem de direitos autorais do compilador.

Visual C# Consolidado 266


/nostdlib Instrui o compilador no referncia biblioteca padro (mscorlib.dll).
/nowarn Desativa especfico mensagens de aviso
/ Otimizar Ativa / desativa otimizaes.
/ Fora Especifica o nome do arquivo de sada (padro:). base Nome do arquivo com
classe principal ou primeiro arquivo
/PDB Especifica o nome de arquivo e local do arquivo.pdb.
/platform Limites que plataformas esse cdigo pode executado em: x 86, Itanium, x 64, ou
anycpu. O padro anycpu.
/recurse Inclui todos os arquivos no diretrio atual e subdiretrios de acordo com as
especificaes curinga.
/Reference Metadados referncias a partir dos arquivos conjunto especificado.
/Resource Incorpora o recurso especificado.
/target Especifica o formato do arquivo de sada usando uma das quatro opes:
/Target:exe/Target:Library/Target:Module/Target:winexe
/ unsafe Permite que No seguro o cdigo.
/utf8output Sadas Mensagens do compilador em codificao UTF-8.
/ Avisar Define o nvel de aviso (0-4).
/warnaserror Relatrios especficos avisos como erros.
/win32icon Usa este cone para a sada.
/win32res 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,
Ou-
Digite o nmero do erro na caixa Look for no ndice.
Ou-
Digite 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 Demonstra o uso de representantes para reduzir a complexidade de


representantes aplicativos sem nome.
Exemplo matrizes Mostra como usar matrizes.
Coleo Exemplo Mostra como fazer classes coleo Generic no-que podem ser usados
classes com a foreach instruo.
Exemplo generics (C#) 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 Demonstra condicionais mtodos, que fornecem um poderoso
condicional 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#.
Exemplo de Demonstra como explicitamente implementar membros de interface.
implementao de
interface explcita
Exemplo World de Um aplicativo hello world.
saudao
Exemplo indexadores Mostra como usar notao de matriz para acessar um objeto.
Indexado Exemplo Mostra como a implementar uma classe que usa propriedades
propriedades indexadas. Propriedades indexadas permitem que voc para usar uma
classe que representa uma coleo de vrios tipos diferentes de itens
semelhantes matriz-.
Exemplo propriedades Mostra como propriedades so declaradas e usados; tambm
demonstra propriedades abstratas.

Visual C# Consolidado 268


Exemplo Structs Mostra como usar structs em C#.
Exemplo Overloading Mostra como definido pelo usurio classes poder sobrecarregar
do operador operadores.
Exemplo Conversions Mostra como definir converses de e para tipos definidos pelo usurio.
definidas pelo usurio
Exemplo de verso Do override demonstra verso em C# atravs do uso de e new
palavras-chave.
Produzir exemplo Demonstra a palavra-chave rendimento para filtrar itens em uma
coleo.

Exemplos intermedirio e Avanado

Exemplo atributos Mostra como criar classes de atributo personalizado, us-los em cdigo, e
consult-los atravs de reflexo.
Exemplo parte 1 Mostra como usar C# para interoperar com objetos COM.
Interop COM
Exemplo parte 2 Mostra como um servidor use um C# com um cliente com C++.
Interop COM
Exemplo bibliotecas Mostra como usar opes do compilador para criar uma DLL de vrios
arquivos de origem; alm disso, como usar a biblioteca em outros
programas.
Exemplo anulvel Demonstra tipos de valores que podem ser definidos como nulo.
Exemplo BD OLE 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 tipos parcial Demonstra como classes e estruturas podem ser definidas em vrios
arquivos cdigo fonte-C#.
Plataforma Invoke Mostra como chamar exportadas funes DLL do C#.
exemplo
Exemplo de Discute a segurana do .NET Framework e mostra duas maneiras de
segurana modificar as permisses de segurana em C#: Usando classes de
permisso e atributos de permisso.
Segmentao de Demonstra vrias atividades do segmento, como criando e executando um
exemplo segmento, sincronizando segmentos, interagir entre segmentos, e usando
um pool de segmentos.
Exemplo de cdigo Mostra como usar ponteiros.
no seguros
Exemplo de Mostra como a documentar cdigo usando XML.
documentao 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. Clique em Download Sample.
A caixa de mensagem Download de arquivo ser exibida.
2. Clique em Open e, na coluna esquerda da pasta CEP, clique em Extract all files.
O Extraction Wizard abre.
3. Clique em Next. Voc pode mudar a pasta os arquivos sero extrados para, ou clique em
Next novamente.
4. 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. Abra a soluo (HelloWorld.sln).
2. No Solution Explorer, clique com o projeto HelloWorld1, e clique em Set as
StartUp Project.
3. No menu Debug, clique em Start Without Debugging.
4. Pressione qualquer tecla para fechar HelloWorld1.
5. No Solution Explorer, clique com o projeto HelloWorld2, e clique em Set as
StartUp Project.
6. No menu Debug, clique em Start Without Debugging.
7. Pressione qualquer tecla para fechar HelloWorld2.
8. No Solution Explorer, clique com o projeto HelloWorld3, e clique em Set as
StartUp Project.
9. 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. Use o Change Directory comando para alterar para o diretrio HelloWorld.
2. Digite o seguinte:

Visual C# Consolidado 270


cd HelloWorld1 csc Hello1.cs Hello1
3. Digite o seguinte:
cd ..\HelloWorld2 csc Hello2.cs Hello2
4. Digite o seguinte:
cd ..\HelloWorld3 csc Hello3.cs Hello3 A B C D
5. 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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. No Solution Explorer, clique com o projeto CmdLine1, e clique em Set as StartUp
Project.
2. No Solution Explorer, clique com o projeto, e clique em Properties.
3. Abra a Configuration Properties pasta, e clique em Debug.
4. Na propriedade Command Line Arguments, digite os parmetros da linha de
comando, e clique em OK. (Consulte o tutorial para obter um exemplo.)
5. No menu Debug, clique em Start Without Debugging.
6. 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. Use o Change Directory comando para alterar para o diretrio CmdLine1.
2. Digite o seguinte:
csc cmdline1.cs cmdline1 A B C
3. Use o Change Directory comando para alterar para o diretrio CmdLine2.
4. 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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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.
Para criar e executar o Exemplo matrizes a partir da linha de comando
Digite o seguinte no prompt de comando:
csc arrays.cs arrays

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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. No Solution Explorer, clique com o projeto pessoa e clique em Set as StartUp
Project.
2. No menu Debug, clique em Start Without Debugging.
3. Repita as etapas anteriores para shapetest.
Para criar e executar os exemplos Propriedades a partir da linha de comando
1. Use o Change Directory comando para alterar para o diretrio pessoa.
2. Digite o seguinte:
csc person.cs person
3. Use o Change Directory comando para alterar para o diretrio shapetest.
4. Digite o seguinte:
csc abstractshape.cs shapes.cs shapetest.cs shapetest

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.
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 bibliotecas no Visual Studio
1. No Solution Explorer, clique com o projeto FunctionTest, e clique em Set as
StartUp Project.
2. No Solution Explorer, clique com o projeto FunctionTest, e clique em Properties.
3. Abra a Configuration Properties pasta e clique em Debug.
4. Na propriedade Command Line Arguments, insira 3 5 10.
5. Clique em OK.
6. 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
1. Use o Change Directory comando para alterar para o diretrio funes.
2. Digite o seguinte:
csc /target:library /out:Functions.dll Factorial.cs DigitCounter.cs
3. Use o Change Directory comando para alterar para o diretrio FunctionTest.
4. 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

Visual C# Consolidado 274


1. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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 verso no Visual Studio
No menu Debug, clique em Start Without Debugging.
Para criar e executar o Exemplo verso a partir da linha de comando
Digite o seguinte no prompt de comando:
csc versioning.cs versioning

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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. No Solution Explorer, clique com o projeto CollectionClasses1 e clique em Set as
StartUp Project.
2. No menu Debug, clique em Start Without Debugging.
3. Repita as etapas anteriores para CollectionClasses2.
Para criar e executar os exemplos classes coleo a partir da linha de comando
1. Use o Change Directory comando para alterar para o diretrio CollectionClasses1.
2. Digite o seguinte:
csc tokens.cs tokens
3. Use o Change Directory comando para alterar para o diretrio CollectionClasses2.
4. 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


1. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. No Solution Explorer, clique com o projeto Struct1 e clique em Set as StartUp
Project.
2. No menu Debug, clique em Start Without Debugging.
3. Repita as etapas anteriores para Struct2.
Para criar e executar os exemplos Structs a partir da linha de comando
1. Use o Change Directory comando para alterar para o diretrio Struct1.
2. Digite o seguinte:
csc struct1.cs struct1
3. Use o Change Directory comando para alterar para o diretrio Struct2.
4. Digite o seguinte:
csc struct2.cs struct2

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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. No Solution Explorer, clique com o projeto indexadores, e clique em Properties.
2. Abra a Configuration Properties pasta, e clique em Debug.
3. Na propriedade Command Line Arguments, insira ..\..\Test.txt.
4. Clique em OK.

Visual C# Consolidado 277


5. No menu Debug, clique em Start Without Debugging.
Para criar e executar o Exemplo Indexers a partir da linha de comando
1. 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
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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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.
Para criar e executar o Exemplo indexado Propriedades a partir da linha de comando
Digite o seguinte no prompt de comando:
csc indexedproperty.cs indexedproperty

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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. No Solution Explorer, clique com o projeto Conversion1 e clique em Set as StartUp
Project.
2. No menu Debug, clique em Start Without Debugging.
3. Repita as etapas anteriores para Conversion2.
Para criar e executar os exemplos Conversions pelo usurio a partir da linha de comando
1. Use o Change Directory comando para alterar para o diretrio Conversion1.
2. Digite o seguinte:
csc conversion.cs conversion
3. Use o Change Directory comando para alterar para o diretrio Conversion2.
4. Digite o seguinte:
csc structconversion.cs structconversion

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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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.
Para criar e executar o Exemplo Generics a partir da linha de comando
Digite o seguinte no prompt de comando:
csc generics.cs generics
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

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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. No Solution Explorer, clique com o projeto complexo e clique em Set as StartUp
Project.
2. No menu Debug, clique em Start Without Debugging.
3. Repita as etapas anteriores para Dbbool.
Para criar e executar os exemplos operador Overloading a partir da linha de comando
1. Use o Change Directory comando para alterar para o diretrio complexo.
2. Digite o seguinte:
csc complex.cs complex
3. Use o Change Directory comando para alterar para o diretrio Dbbool.
4. Digite o seguinte:
csc dbbool.cs dbbool

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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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 representantes no Visual Studio
1. No Solution Explorer, clique com o projeto Delegates1, e clique em Set as StartUp
Project.
2. No menu Debug, clique em Start Without Debugging.
3. Repita as etapas anteriores para Delegates2.
Para criar e executar os exemplos representantes a partir da linha de comando
1. Use o Change Directory comando para alterar para o diretrio Delegates1.
2. Digite o seguinte:
csc bookstore.cs bookstore
3. Use o Change Directory comando para alterar para o diretrio Delegates2.
4. Digite o seguinte:
csc compose.cs compose

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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. No Solution Explorer, clique com o projeto Events1, e clique em Set as StartUp
Project.
2. No menu Debug, clique em Start Without Debugging.
3. Repita as etapas anteriores para Events2.
Para criar e executar os exemplos eventos a partir da linha de comando
1. Use o Change Directory comando para alterar para o diretrio Events1.
2. Digite o seguinte:
csc events1.cs events1
3. Use o Change Directory comando para alterar para o diretrio Events2.
4. 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


1. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. No Solution Explorer, clique com o projeto ExplicitInterface1 e clique em Set as
StartUp Project.
2. No menu Debug, clique em Start Without Debugging.
3. Repita as etapas anteriores para ExplicitInterface2.
Para criar e executar os exemplos Explicit implementao interface a partir da linha de comando
1. Use o Change Directory comando para alterar para o diretrio ExplicitInterface1.
2. Digite o seguinte:
csc explicit1.cs explicit1
3. Use o Change Directory comando para alterar para o diretrio ExplicitInterface2.
4. 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


1. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. No Solution Explorer, clique com o projeto e clique em Properties.
2. Abra a pasta Propriedades de configurao, e clique em Debug.
3. Defina a Command Line Arguments propriedade para A B C.
4. Na pasta Propriedades de configurao, clique em Build.
5. Modificar a Conditional Compilation Constants propriedade. Por exemplo,
adicionar ou excluir Debug. Clique em OK.
6. 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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. No Solution Explorer, clique com o projeto e clique em Properties.
2. Abra a pasta Propriedades de configurao e clique em Build.
3. 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 criar o Exemplo documentao XML a partir da linha de comando
1. Para gerar a documentao XML de exemplo, digite o seguinte no prompt de comando:
csc XMLsample.cs /doc:XMLsample.xml
2. Para ver o XML gerado, emita o seguinte comando:
type XMLsample.xml

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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. No Solution Explorer, clique com o projeto PinvokeTest e clique em Set as StartUp
Project.
2. No menu Debug, clique em Start Without Debugging.
3. Repita as etapas anteriores para Marshal e PInvoke.
Para criar e executar os exemplos Platform Invoke a partir da linha de comando
1. Use o Change Directory comando para alterar para o diretrio PinvokeTest.
2. Digite o seguinte:
csc PinvokeTest.cs PinvokeTest
3. Use o Change Directory comando para alterar para o diretrio Marshal.

Visual C# Consolidado 286


4. Digite o seguinte:
csc Marshal.cs Marshal
5. Use o Change Directory comando para alterar para o diretrio PInvoke.
6. 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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. No Solution Explorer, clique com o projeto Interop1, e clique em Set as StartUp
Project.
2. No Solution Explorer, clique com o projeto Interop1, e clique em Properties.
3. Abra a Configuration Properties pasta, e clique em Debug.
4. Na propriedade argumentos de linha de comando, digite um arquivo AVI como
c:\winnt\clock.avi.
5. Clique em OK.
6. No menu Debug, clique em Start Without Debugging.
7. Repita as etapas anteriores para Interop2.
Se o QuartzTypeLib.dll includo com Interop1 est desatualizado
1. No Solution Explorer, abrir References para Interop1.

Visual C# Consolidado 287


2. Clique com o boto direito do mouse QuartzTypeLib e, clique em Remove.
3. Clique com o boto direito do mouse References e, clique em Add Reference.
4. Na guia COM, selecione o componente denominado, " biblioteca Tipo de Controle
ActiveMovie ".
5. Clique em Select e, clique em OK.
6. 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. Use o Change Directory comando para alterar para o diretrio Interop1.
2. Digite o seguinte:
tlbimp %windir%\system32\quartz.dll /out:QuartzTypeLib.dll csc /r:QuartzTypeLib.dll
interop1.cs interop1 %windir%\clock.avi
3. Use o Change Directory comando para alterar para o diretrio Interop2.
4. 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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. No Solution Explorer, clique com o projeto COMClient, e clique em Properties.
2. Abra a Configuration Properties pasta, e clique em Debug.
3. Na propriedade Command Line Arguments, digite um nome.
4. Clique em OK.
5. No menu Debug, clique em Start Without Debugging.
Para criar e executar o Exemplo 2 Part Interop COM a partir da linha de comando
1. Use o Change Directory comando para alterar para o diretrio
COMInteropPart2\COMClient.
2. Copie o cdigo do servidor C# para o diretrio COMClient:
copy ..\CSharpServer\CSharpServer.cs
3. Compilar o servidor:
csc /target:library CSharpServer.cs regasm CSharpServer.dll /tlb:CSharpServer.tlb
4. 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

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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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.
Para criar e executar o Exemplo atributos a partir da linha de comando
Digite o seguinte no prompt de comando:
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


1. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. No Solution Explorer, clique com o projeto Security1 e clique em Set as StartUp
Project.
2. No menu Debug, clique em Start Without Debugging.

Visual C# Consolidado 290


3. Repita as etapas anteriores para Security2 e Security3.
Para criar e executar os exemplos de segurana a partir da linha de comando
1. Use o Change Directory comando para alterar para o diretrio Security1.
2. Digite o seguinte:
csc ImperativeSecurity.cs ImperativeSecurity
3. Use o Change Directory comando para alterar para o diretrio Security2.
4. Digite o seguinte:
csc DeclarativeSecurity.cs DeclarativeSecurity
5. Use o Change Directory comando para alterar para o diretrio Security3.
6. Digite o seguinte:
csc SuppressSecurity.cs SuppressSecurity

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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. No Solution Explorer, clique com o projeto ThreadStartStop e clique em Set as
StartUp Project.
2. No menu Debug, clique em Start Without Debugging.
3. Repita as etapas anteriores para ThreadPool, e ThreadSync.
Para criar e executar os exemplos Threading a partir da linha de comando
1. Use o Change Directory comando para alterar para o diretrio segmentos.
2. Digite o seguinte:
cd ThreadStartStop csc ThreadStartStop.cs ThreadStartStop
3. Digite o seguinte:
cd ..\ThreadPool csc ThreadPool.cs ThreadPool
4. Digite o seguinte:
cd ..\ThreadSync csc ThreadSync.cs ThreadSync

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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. No Solution Explorer, clique com o projeto FastCopy, e clique em Set as StartUp
Project.
2. No menu Debug, clique em Start Without Debugging.

Visual C# Consolidado 292


3. No Solution Explorer, clique com o projeto ReadFile, e clique em Set as StartUp
Project.
4. No Solution Explorer, clique com o projeto ReadFile, e clique em Properties.
5. Abra a pasta Propriedades de configurao, e clique em Debug.
6. Na propriedade argumentos da linha de comando, insira ..\..\ReadFile.cs.
7. Clique em OK.
8. No menu Debug, clique em Start Without Debugging.
9. 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. Use o Change Directory comando para alterar para o diretrio UNSAFE.
2. Digite o seguinte:
cd FastCopy csc FastCopy.cs /unsafe FastCopy
3. Digite o seguinte:
cd ..\ReadFile csc ReadFile.cs /unsafe ReadFile ReadFile.cs
4. 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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. Use o Change Directory (cd) comando para alterar para o Yield Diretrio.
2. 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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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.
Para criar e executar o Exemplo de cdigo AnonymousDelegates a partir da linha de comando
1. Use o Change Directory (cd) comando para alterar para o diretrio
AnonymousDelegates.
2. Digite o seguinte:
csc AnonymousDelegates.cs AnonymousDelegates

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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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.
Para criar e executar o Exemplo de cdigo PartialTypes a partir da linha de comando
1. Use o Change Directory (cd) comando para alterar para o PartialTypes Diretrio.
2. Digite o seguinte:
csc PartialTypes.cs PartialTypes

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. Clique em Download Sample.
A File Download caixa de mensagem ser exibida.
2. 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. Abra Nullable.sln, o arquivo de soluo, o clicando duas vezes no arquivo no Windows
Explorer, ou clicando Open no menu File.
2. No menu Debug, clique em Start Without Debugging.
Para criar e executar o Exemplo de cdigo Nullable a partir da linha de comando
1. Use o Change Directory (cd) comando para alterar para o diretrio Nullable.
2. Digite o seguinte:
csc Nullable.cs Nullable

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 Demonstra o uso de representantes para reduzir a complexidade de


representantes aplicativos sem nome.

Exemplo matrizes Mostra como usar matrizes.

Coleo Exemplo Mostra como fazer classes coleo Generic no-que podem ser usados
classes com a foreach instruo.

Exemplo generics (C#) 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 Demonstra condicionais mtodos, que fornecem um poderoso


condicional 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#.

Exemplo de Demonstra como explicitamente implementar membros de interface.


implementao de
interface explcita

Visual C# Consolidado 301


Exemplo World de Um aplicativo hello world.
saudao

Exemplo indexadores Mostra como usar notao de matriz para acessar um objeto.

Indexado Exemplo Mostra como a implementar uma classe que usa propriedades
propriedades indexadas. Propriedades indexadas permitem que voc para usar uma
classe que representa uma coleo de vrios tipos diferentes de itens
semelhantes matriz-.

Exemplo propriedades Mostra como propriedades so declaradas e usados; tambm


demonstra propriedades abstratas.

Exemplo Structs Mostra como usar structs em C#.

Exemplo Overloading Mostra como definido pelo usurio classes poder sobrecarregar
do operador operadores.

Exemplo Conversions Mostra como definir converses de e para tipos definidos pelo usurio.
definidas pelo usurio

Exemplo de verso Do override demonstra verso em C# atravs do uso de e new


palavras-chave.

Produzir exemplo Demonstra a palavra-chave rendimento para filtrar itens em uma


coleo.

Exemplos intermedirio e Avanado

Exemplo atributos Mostra como criar classes de atributo personalizado, us-los em cdigo, e
consult-los atravs de reflexo.

Exemplo parte 1 Mostra como usar C# para interoperar com objetos COM.
Interop COM

Exemplo parte 2 Mostra como um servidor use um C# com um cliente com C++.
Interop COM

Exemplo bibliotecas Mostra como usar opes do compilador para criar uma DLL de vrios
arquivos de origem; alm disso, como usar a biblioteca em outros
programas.

Exemplo anulvel Demonstra tipos de valores que podem ser definidos como nulo.

Exemplo BD OLE 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.

Visual C# Consolidado 302


Exemplo tipos parcial Demonstra como classes e estruturas podem ser definidas em vrios
arquivos cdigo fonte-C#.

Plataforma Invoke Mostra como chamar exportadas funes DLL do C#.


exemplo

Exemplo de Discute a segurana do .NET Framework e mostra duas maneiras de


segurana modificar as permisses de segurana em C#: Usando classes de
permisso e atributos de permisso.

Segmentao de Demonstra vrias atividades do segmento, como criando e executando um


exemplo segmento, sincronizando segmentos, interagir entre segmentos, e usando
um pool de segmentos.

Exemplo de cdigo Mostra como usar ponteiros.


no seguros

Exemplo de Mostra como a documentar cdigo usando XML.


documentao 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. Clique em Download Sample.
A caixa de mensagem Download de arquivo ser exibida.
6. Clique em Open e, na coluna esquerda da pasta CEP, clique em Extract all files.
O Extraction Wizard abre.
7. Clique em Next. Voc pode mudar a pasta os arquivos sero extrados para, ou clique em
Next novamente.
8. 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. Use o Change Directory comando para alterar para o diretrio HelloWorld.
7. Digite o seguinte:
cd HelloWorld1 csc Hello1.cs Hello1
8. Digite o seguinte:
cd ..\HelloWorld2 csc Hello2.cs Hello2
9. 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. Clique em Download Sample.
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 parmetros de linha de comando no Visual Studio
7. No Solution Explorer, clique com o projeto CmdLine1, e clique em Set as StartUp
Project.
8. No Solution Explorer, clique com o projeto, e clique em Properties.
9. 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. Use o Change Directory comando para alterar para o diretrio CmdLine1.
6. Digite o seguinte:
csc cmdline1.cs cmdline1 A B C
7. Use o Change Directory comando para alterar para o diretrio CmdLine2.
8. 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. Clique em Download Sample.
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 matrizes no Visual Studio
No menu Debug, clique em Start Without Debugging.
Para criar e executar o Exemplo matrizes a partir da linha de comando
Digite o seguinte no prompt de comando:
csc arrays.cs arrays

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. Clique em Download Sample.
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.

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. No Solution Explorer, clique com o projeto pessoa e clique em Set as StartUp
Project.
5. No menu Debug, clique em Start Without Debugging.
6. Repita as etapas anteriores para shapetest.
Para criar e executar os exemplos Propriedades a partir da linha de comando
5. Use o Change Directory comando para alterar para o diretrio pessoa.
6. Digite o seguinte:
csc person.cs person
7. Use o Change Directory comando para alterar para o diretrio shapetest.
8. Digite o seguinte:
csc abstractshape.cs shapes.cs shapetest.cs shapetest

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. Clique em Download Sample.
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 bibliotecas no Visual Studio
Visual C# Consolidado 307
7. No Solution Explorer, clique com o projeto FunctionTest, e clique em Set as
StartUp Project.
8. No Solution Explorer, clique com o projeto FunctionTest, e clique em Properties.
9. 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. Use o Change Directory comando para alterar para o diretrio funes.
6. Digite o seguinte:
csc /target:library /out:Functions.dll Factorial.cs DigitCounter.cs
7. Use o Change Directory comando para alterar para o diretrio FunctionTest.
8. 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. Clique em Download Sample.
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.

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.
Para criar e executar o Exemplo verso a partir da linha de comando
Digite o seguinte no prompt de comando:
csc versioning.cs versioning

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. Clique em Download Sample.
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 classes coleo no Visual Studio
4. No Solution Explorer, clique com o projeto CollectionClasses1 e clique em Set as
StartUp Project.
5. No menu Debug, clique em Start Without Debugging.
6. Repita as etapas anteriores para CollectionClasses2.
Para criar e executar os exemplos classes coleo a partir da linha de comando
5. Use o Change Directory comando para alterar para o diretrio CollectionClasses1.
6. Digite o seguinte:
csc tokens.cs tokens

Visual C# Consolidado 309


7. Use o Change Directory comando para alterar para o diretrio CollectionClasses2.
8. 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. Clique em Download Sample.
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 Structs no Visual Studio
4. No Solution Explorer, clique com o projeto Struct1 e clique em Set as StartUp
Project.
5. No menu Debug, clique em Start Without Debugging.
6. Repita as etapas anteriores para Struct2.
Para criar e executar os exemplos Structs a partir da linha de comando
5. Use o Change Directory comando para alterar para o diretrio Struct1.
6. Digite o seguinte:
csc struct1.cs struct1
7. Use o Change Directory comando para alterar para o diretrio Struct2.
8. Digite o seguinte:
csc struct2.cs struct2

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. Clique em Download Sample.
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 Indexers no Visual Studio
6. No Solution Explorer, clique com o projeto indexadores, e clique em Properties.
7. Abra a Configuration Properties pasta, e clique em Debug.
8. Na propriedade Command Line Arguments, insira ..\..\Test.txt.
9. 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. Clique em Download Sample.
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 indexado propriedades no Visual Studio
No menu Debug, clique em Start Without Debugging.
Para criar e executar o Exemplo indexado Propriedades a partir da linha de comando
Digite o seguinte no prompt de comando:
csc indexedproperty.cs indexedproperty

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. No Solution Explorer, clique com o projeto Conversion1 e clique em Set as StartUp
Project.
5. No menu Debug, clique em Start Without Debugging.
6. Repita as etapas anteriores para Conversion2.
Para criar e executar os exemplos Conversions pelo usurio a partir da linha de comando
5. Use o Change Directory comando para alterar para o diretrio Conversion1.
6. Digite o seguinte:
csc conversion.cs conversion
7. Use o Change Directory comando para alterar para o diretrio Conversion2.
8. Digite o seguinte:
csc structconversion.cs structconversion

Exemplo generics (C#)


Download sample (http://download.microsoft.com/download/9/A/6/9A639BEE-F7B0-
423D-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.
Para criar e executar o Exemplo Generics a partir da linha de comando
Digite o seguinte no prompt de comando:
csc generics.cs generics
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. Clique em Download Sample.
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.

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. No Solution Explorer, clique com o projeto complexo e clique em Set as StartUp
Project.
5. No menu Debug, clique em Start Without Debugging.
6. Repita as etapas anteriores para Dbbool.
Para criar e executar os exemplos operador Overloading a partir da linha de comando
5. Use o Change Directory comando para alterar para o diretrio complexo.
6. Digite o seguinte:
csc complex.cs complex
7. Use o Change Directory comando para alterar para o diretrio Dbbool.
8. Digite o seguinte:
csc dbbool.cs dbbool

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. Clique em Download Sample.
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 representantes no Visual Studio

Visual C# Consolidado 315


4. No Solution Explorer, clique com o projeto Delegates1, e clique em Set as StartUp
Project.
5. No menu Debug, clique em Start Without Debugging.
6. Repita as etapas anteriores para Delegates2.
Para criar e executar os exemplos representantes a partir da linha de comando
5. Use o Change Directory comando para alterar para o diretrio Delegates1.
6. Digite o seguinte:
csc bookstore.cs bookstore
7. Use o Change Directory comando para alterar para o diretrio Delegates2.
8. Digite o seguinte:
csc compose.cs compose

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. Clique em Download Sample.
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 eventos no Visual Studio
4. No Solution Explorer, clique com o projeto Events1, e clique em Set as StartUp
Project.
5. No menu Debug, clique em Start Without Debugging.
6. Repita as etapas anteriores para Events2.
Para criar e executar os exemplos eventos a partir da linha de comando
Visual C# Consolidado 316
5. Use o Change Directory comando para alterar para o diretrio Events1.
6. Digite o seguinte:
csc events1.cs events1
7. Use o Change Directory comando para alterar para o diretrio Events2.
8. 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. Clique em Download Sample.
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 Explicit implementao interface no Visual Studio
4. No Solution Explorer, clique com o projeto ExplicitInterface1 e clique em Set as
StartUp Project.
5. No menu Debug, clique em Start Without Debugging.
6. Repita as etapas anteriores para ExplicitInterface2.
Para criar e executar os exemplos Explicit implementao interface a partir da linha de comando
5. Use o Change Directory comando para alterar para o diretrio ExplicitInterface1.
6. Digite o seguinte:
csc explicit1.cs explicit1
7. Use o Change Directory comando para alterar para o diretrio ExplicitInterface2.

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. Clique em Download Sample.
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 mtodos condicional no Visual Studio
7. No Solution Explorer, clique com o projeto e clique em Properties.
8. Abra a pasta Propriedades de configurao, e clique em Debug.
9. 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. Clique em Download Sample.
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 o Exemplo documentao XML no Visual Studio
5. No Solution Explorer, clique com o projeto e clique em Properties.
6. Abra a pasta Propriedades de configurao e clique em Build.
7. Defina a propriedade arquivo documentao XML como XMLsample.xml.
8. No menu Build, clique em Build. O arquivo de sada XML poder ser no diretrio de
depurao.
Para criar o Exemplo documentao XML a partir da linha de comando
3. 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

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. Clique em Download Sample.
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 Platform Invoke no Visual Studio
4. No Solution Explorer, clique com o projeto PinvokeTest e clique em Set as StartUp
Project.
5. No menu Debug, clique em Start Without Debugging.
6. Repita as etapas anteriores para Marshal e PInvoke.
Para criar e executar os exemplos Platform Invoke a partir da linha de comando
7. Use o Change Directory comando para alterar para o diretrio PinvokeTest.
8. Digite o seguinte:
csc PinvokeTest.cs PinvokeTest
9. Use o Change Directory comando para alterar para o diretrio Marshal.
10. Digite o seguinte:
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

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. Clique em Download Sample.
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 com Interop parte 1 no Visual Studio
8. No Solution Explorer, clique com o projeto Interop1, e clique em Set as StartUp
Project.
9. 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. No Solution Explorer, abrir References para Interop1.
8. Clique com o boto direito do mouse QuartzTypeLib e, clique em Remove.
9. 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. Use o Change Directory comando para alterar para o diretrio Interop2.
8. 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. Clique em Download Sample.
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 2 Part Interop COM no Visual Studio
6. No Solution Explorer, clique com o projeto COMClient, e clique em Properties.
7. Abra a Configuration Properties pasta, e clique em Debug.
8. Na propriedade Command Line Arguments, digite um nome.
9. 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. Use o Change Directory comando para alterar para o diretrio
COMInteropPart2\COMClient.
7. Copie o cdigo do servidor C# para o diretrio COMClient:
copy ..\CSharpServer\CSharpServer.cs
8. Compilar o servidor:
csc /target:library CSharpServer.cs regasm CSharpServer.dll /tlb:CSharpServer.tlb
9. 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. Clique em Download Sample.
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 atributos no Visual Studio
No menu Debug, clique em Start Without Debugging.
Para criar e executar o Exemplo atributos a partir da linha de comando
Digite o seguinte no prompt 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. Clique em Download Sample.
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 de segurana no Visual Studio
4. No Solution Explorer, clique com o projeto Security1 e clique em Set as StartUp
Project.
5. No menu Debug, clique em Start Without Debugging.
6. Repita as etapas anteriores para Security2 e Security3.
Para criar e executar os exemplos de segurana a partir da linha de comando
7. Use o Change Directory comando para alterar para o diretrio Security1.
8. Digite o seguinte:
csc ImperativeSecurity.cs ImperativeSecurity
9. Use o Change Directory comando para alterar para o diretrio Security2.
10. Digite o seguinte:
csc DeclarativeSecurity.cs DeclarativeSecurity
11. Use o Change Directory comando para alterar para o diretrio Security3.
12. Digite o seguinte:
csc SuppressSecurity.cs SuppressSecurity

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. Clique em Download Sample.
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 Threading no Visual Studio
4. No Solution Explorer, clique com o projeto ThreadStartStop e clique em Set as
StartUp Project.
5. No menu Debug, clique em Start Without Debugging.
6. Repita as etapas anteriores para ThreadPool, e ThreadSync.
Para criar e executar os exemplos Threading a partir da linha de comando
5. Use o Change Directory comando para alterar para o diretrio segmentos.
6. Digite o seguinte:
cd ThreadStartStop csc ThreadStartStop.cs ThreadStartStop
7. Digite o seguinte:
cd ..\ThreadPool csc ThreadPool.cs ThreadPool
8. Digite o seguinte:
cd ..\ThreadSync csc ThreadSync.cs ThreadSync

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. Clique em Download Sample.
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 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. Use o Change Directory comando para alterar para o diretrio UNSAFE.
6. Digite o seguinte:
cd FastCopy csc FastCopy.cs /unsafe FastCopy
Visual C# Consolidado 326
7. Digite o seguinte:
cd ..\ReadFile csc ReadFile.cs /unsafe ReadFile ReadFile.cs
8. 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. Clique em Download Sample.
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 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. Clique em Download Sample.
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 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
3. Use o Change Directory (cd) comando para alterar para o Yield Diretrio.
4. 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.

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. Clique em Download Sample.
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 AnonymousDelegates no Visual Studio
No menu Debug, clique em Start Without Debugging.
Para criar e executar o Exemplo de cdigo AnonymousDelegates a partir da linha de comando
3. Use o Change Directory (cd) comando para alterar para o diretrio
AnonymousDelegates.
4. Digite o seguinte:
csc AnonymousDelegates.cs AnonymousDelegates

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.
Para criar e executar o Exemplo de cdigo PartialTypes a partir da linha de comando
3. Use o Change Directory (cd) comando para alterar para o PartialTypes Diretrio.
4. Digite o seguinte:
csc PartialTypes.cs PartialTypes

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. Clique em Download Sample.
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 Nullable cdigo no Visual Studio

Visual C# Consolidado 330


3. Abra Nullable.sln, o arquivo de soluo, o clicando duas vezes no arquivo no Windows
Explorer, ou clicando Open no menu File.
4. No menu Debug, clique em Start Without Debugging.
Para criar e executar o Exemplo de cdigo Nullable a partir da linha de comando
3. Use o Change Directory (cd) comando para alterar para o diretrio Nullable.
4. Digite o seguinte:
csc Nullable.cs Nullable

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 palavra-
chave 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. Selecione um tipo de aplicativo Starter Kit, e clique em OK.
O Starter Kit carregado no Visual C#.
3. 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 Matriz de seqncias de caracteres passado para principal


executable.exe a b c "a"
"b"
"c"
executable.exe one two " um "
" dois "
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
2. Na parte superior da Properties Window, clique no boto Events.
3. 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.

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 Descrio
Onde struct T: 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.
Onde: classe T O argumento Tipo deve ser um tipo de referncia, incluindo qualquer classe,
interface, representante, ou tipo de matriz.
Onde: New() T 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.
where T : <base O argumento Tipo deve ser ou derivar de classe base especificada.
class name>
where T : O argumento Tipo deve ser ou implementam a interface especificada. Vrias
<interface restries interface podem ser especificadas. A interface restries tambm
name> pode ser genrica.
Onde: U T O argumento Tipo fornecido para T deve ser ou derivar do argumento fornecido
para u. Isso chamado uma restrio tipo naked.

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 Spell-
verificao 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. Criar um novo projeto aplicativo Windows C# no Visual Studio, e cham-lo WordSpell.


2. Copie o cdigo acima, e col-lo sobre o contedo do arquivo Form1.cs.
3. 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. Criar um novo aplicativo Console C# no Visual Studio e cham-la CreateExcelWorksheet.
2. Incluir o conjunto Excel como uma referncia para o projeto Right-Click no projeto,
selecione Add Reference.:
3. Clique na COM guia da caixa Add Reference de dilogo, e Localizar Microsoft Excel 11
Object Library.
4. 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. Se renda em zero dlares e em $7,000, o imposto 10 por cento da quantidade.
2. 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.
3. 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.
4. 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.
5. 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.
6. Se renda for sobre $311,950, o imposto ser 35 por cento da quantidade sobre $311,950
mais $90,514.50.
Criar um suplemento de automao para Excel usando o Visual Studio e cdigo gerenciado
1. Criar um novo projeto Visual C# Class Library chamado ExcelAddIn.
2. 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.
3. 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\\{"

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. Criar um novo projeto aplicativo Windows C# no Visual Studio e denomine-WinSound.


2. Copie o cdigo acima, e col-lo sobre o contedo do arquivo Form1.cs.
3. 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", "444-
234-22450", "690-203-6578", "146-893-232", "146-839-2322", "4007-295-1111", "407-295-1111", "407-2-
5555", }; 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. Iniciar o Disassembler MSIL (Ildasm.exe).
2. Carregar o arquivo que deseja testar.
3. 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.
Como determinar se um arquivo um conjunto programaticamente
1. Chame o GetAssemblyName mtodo, passando o caminho de arquivo completo e nome
do arquivo que voc est testando.
2. Se uma BadImageFormatException exceo acionada, o arquivo um conjunto no.
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.
Para descarregar 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.

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. Criar seu conjunto. Para obter mais informaes, consulte Criando conjuntos.
2. Atribuir um nome de alta segurana a seu conjunto. Para obter mais informaes, consulte
COMO: Assinar uma Assembly com Nome Forte.
3. Atribuir informaes de verso a seu conjunto. Para obter mais informaes, consulte
Versionamento de assembly.
4. Incluir seu conjunto para o cache assembly global. Para obter mais informaes, consulte
Como Instalar um Assembly na Cache Global de Assemblies.
5. 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.
2. Configure o domnio de aplicativo. Para obter mais informaes, consulte Como Configurar
um Domnio de Aplicativo.
3. Carregar um conjunto no domnio de aplicativo. Para obter mais informaes, consulte
Como Carregar Assemblies em um Domnio de Aplicativo.
4. Acessar o Contedo do outro conjunto. Para obter mais informaes, consulte Executar
cdigo em outro domnio de aplicao (Guia de programao C#).
5. Descarregar o domnio do aplicativo. Para obter mais informaes, consulte Como:
Descarregar um domnio de aplicativo.
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 Demonstra o uso de representantes para reduzir a complexidade de


representantes aplicativos sem nome.
Exemplo matrizes Mostra como usar matrizes.
Coleo exemplo Mostra como fazer classes coleo Generic no-que podem ser usados
classes com a foreach instruo.
Exemplo generics (C#) 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 Demonstra condicionais mtodos, que fornecem um poderoso
condicional 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 Demonstra como explicitamente implementar membros de interface.
implementao de
interface explcita
Exemplo World de Um aplicativo hello world.
saudao
Exemplo indexadores Mostra como usar notao de matriz para acessar um objeto.
Indexado exemplo Mostra como a implementar uma classe que usa propriedades
propriedades indexadas. Propriedades indexadas permitem que voc para usar uma
classe que representa uma coleo de vrios tipos diferentes de itens
semelhantes matriz-.
Exemplo propriedades Mostra como propriedades so declaradas e usados; tambm
demonstra propriedades abstratas.
Exemplo Structs Mostra como usar structs em C#.
Exemplo Overloading Mostra como definido pelo usurio classes poder sobrecarregar
do operador operadores.
Exemplo Conversions Mostra como definir converses de e para tipos definidos pelo usurio.
definidas pelo usurio
Exemplo de verso Do override demonstra verso em C# atravs do uso de e new
palavras-chave.
Produzir exemplo Demonstra a palavra-chave rendimento para filtrar itens em uma
coleo.

Exemplos intermedirio e Avanado

Exemplo atributos Mostra como criar classes de atributo personalizado, us-los em cdigo, e
consult-los atravs de reflexo.
Exemplo parte 1 Mostra como usar C# para interoperar com objetos COM.
Interop COM
Exemplo parte 2 Mostra como um servidor use um C# com um cliente com C++.
Interop COM
Exemplo bibliotecas Mostra como usar opes do compilador para criar uma DLL de vrios
arquivos de origem; alm disso, como usar a biblioteca em outros
programas.
Exemplo anulvel Demonstra tipos de valores que podem ser definidos como nulo.
Exemplo BD OLE 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 tipos parcial Demonstra como classes e estruturas podem ser definidas em vrios
arquivos cdigo fonte-C#.
Plataforma Invoke Mostra como chamar exportadas funes DLL do C#.
exemplo
Exemplo de Discute a segurana do .NET Framework e mostra duas maneiras de
segurana modificar as permisses de segurana em C#: Usando classes de
permisso e atributos de permisso.

Visual C# Consolidado 395


Segmentao de Demonstra vrias atividades do segmento, como criando e executando um
exemplo segmento, sincronizando segmentos, interagir entre segmentos, e usando
um pool de segmentos.
Exemplo de cdigo Mostra como usar ponteiros.
no seguros
Exemplo de Mostra como a documentar cdigo usando XML.
documentao 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 no-


genricas.

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 Type-
and-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 Internet-
Distributed, 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 no-
Microsoft.

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, liberando-


os 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 Descrio

Pblico 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. Todos os nomes so codificados como seqncias de caracteres Unicode (16 bits).


2. 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 Descrio
Evento 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.
Campo Descreve e contm parte do estado do tipo. Campos podem ser de qualquer tipo
suportado pelo ambiente de execuo.
Tipo Define um tipo dentro do escopo do tipo delimitador.
aninhado
Mtodo 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.
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
Caracterstica aplicada a Descrio
abstract Mtodos, O tipo no fornece a implementao do mtodo. Tipos
propriedades e que herdam mtodos abstratos e tipos que
eventos 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.
private, family, Todos Define a acessibilidade de um membro:
assembly, family e private
assembly, family ou Acessvel somente dentro do tipo do membro ou
assembly, ou public 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

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, Um mtodo virtual no pode ser substitudo em um tipo
propriedades e derivado.
eventos
initialize-only Campos O valor pode apenas ser inicializado, no pode ser
gravado outro valor aps a inicializao.
instance Campos, Se um membro no estiver marcada como static (C# e
mtodos, C++), Shared (Visual Basic), virtual. (C# e C++) ou
propriedades e Overridable (Visual Basic), ele um membro da
eventos instncia (no existe a palavra-chave instance). Haver
o mesmo nmero de cpias desses membros na
memria e de objetos que os usam.
literal Campos 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.
newslot ou override Todos 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.
static Campos, O membro pertence ao tipo no qual est definido e no
mtodos, a uma instncia particular do tipo. O membro existe
propriedades e mesmo que uma instncia de tipo no tenha sido
eventos criada. Ele compartilhado entre todas as instncias do
tipo.
virtual Mtodos, O mtodo pode ser implementado por um tipo derivado
propriedades e e pode ser chamado estaticamente ou dinamicamente.
eventos 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.

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 no-
convertido (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 no-
convertida (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 Descrio
autenticada Especifica que outro tipo no pode ser derivado desse tipo.
implementa Indica que a classe usa uma ou mais interfaces, fornecendo implementaes
de membros da interface.
Abstrata Especifica que voc no pode criar uma instncia da classe. Para us-la, voc
deve derivar outra classe a partir dela.
Herda 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:

Descrio do Assembly.
o Identidade (nome, verso, cultura, chave pblica).
o Os tipos que so exportados.
o Outros conjuntos de que este assembly depende.
o Permisses de segurana necessrias para executar.
Descrio dos tipos.
o Nome, visibilidade, classe base e interfaces implementadas.
o Membros (mtodos, campos, propriedades, eventos, tipos aninhados).
Atributos.
o 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 Contedo da seo
Cabealho 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.
Instrues da As instrues da Microsoft Intermediate Language (MSIL) que compem o seu
MSIL cdigo. Muitas instrues da MSIL so acompanhadas de smbolos de
metadados.
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.

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 Just-
In-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 Nome (Aponta para Assinatura


virtual relativo o heap de seqncia (Aponta para o
Linha (RVA) ImplFlags Sinalizadores de caracteres.) heap de blob.)
1 0x00002050 IL Public .ctor (construtor)
Managed ReuseSlot
SpecialName
RTSpecialName
.ctor
2 0x00002058 IL Public Main String
Managed Static
ReuseSlot
3 0x0000208c IL Public Add int, int, int
Managed Static
ReuseSlot

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.
Cultura 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.)
Informaes de A chave pblica do publisher, caso tenha sido dado ao assembly um nome
nomes fortes forte.
Lista de todos os Um hash de cada arquivo contido no assembly e um nome de arquivo.
arquivos no Observe que todos os arquivos que compem o assembly devem estar no
assembly mesmo diretrio que o arquivo que contm o manifesto do assembly.
Informaes de Informaes usadas pelo ambiente de execuo para mapear a referncia

Visual C# Consolidado 441


referncia de tipo de um tipo ao arquivo que contm sua declarao e implementao. Usado
para tipos que so exportados do assembly.
Informaes sobre Uma lista de outros assemblys que so referenciados estaticamente pelo
assemblys assembly. Cada referncia inclui o nome do assembly dependente,
referenciados 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. Verificar a referncia do assembly original para determinar qual verso do assembly deve
ser ligada.
2. 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.
4. 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.

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
Nome dado em Tipo de Tipo de Tipo de
da Visual dado em dado em dado em
Categoria classe Descrio Basic C# C++ JScript
Inteiro Byte Um inteiro de 8 bits sem Byte Byte char Byte
sinal.
SByte Um inteiro de 8 bits com SByte sbyte signed SByte
sinal. char
No compatvel com CLS.
Int16 Um inteiro de 16 bits com Short short short short
sinal.

Visual C# Consolidado 449


Int32 Um inteiro de 32 bits com Integer int int int
sinal. -ou-
long
Int64 Um inteiro de 64 bits com Long long __int64 long
sinal.
UInt16 Um inteiro e 16 bits sem UShort ushort unsigned UInt16
sinal. short
No compatvel com CLS.
UInt32 Um inteiro de 32 bits sem UInteger uint unsigned UInt32
sinal. int
No compatvel com CLS. -ou-
unsigned
long
UInt64 Um inteiro de 64 bits sem ULong ulong unsigned UInt64
sinal. __int64
No compatvel com CLS.
Ponto Single Nmero de ponto flutuante Single float float float
flutuante de preciso simples (32
bits).
Double Nmero de ponto flutuante Double double double double
de preciso dupla (64 bits).
Lgico Boolean Um valor booleano (true Boolean bool bool bool
ou false).
Outros Char Um caractere unicode (16 Char char wchar_t char
bits).
Decimal Um valor decimal (128 Decimal decimal Decimal Decimal
bits).
IntPtr Um inteiro com sinal cujo IntPtr IntPtr IntPtr IntPtr
tamanho depende da Nenhum Nenhum Nenhum
plataforma subjacente (um tipo tipo tipo
valor de 32 bits em uma interno. interno. interno.
plataforma de 32 bits e um
valor de 64 bits em uma
plataforma de 64 bits).
UIntPtr Um inteiro sem sinal cujo UIntPtr UIntPtr UIntPtr UIntPtr
tamanho depende da Nenhum Nenhum Nenhum
plataforma subjacente (um tipo tipo tipo
valor de 32 bits em uma interno. interno. interno.
plataforma de 32 bits e um
valor de 64 bits em uma
plataforma de 64 bits).
No compatvel com CLS.
Objetos de Object A raiz da hierarquia de Object object Object* Object
Classe objeto.
String Uma seqncia de String string String* 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... Consultar...

Biblioteca de classes do .NET Viso geral sobre a biblioteca de classes do .NET


Framework Framework

ADO.NET ADO.NET

Domnios de aplicativos Usando domnios de aplicativos

ASP.NET Criando aplicativos ASP.NET


Viso geral do ASP.NET
Controles de servidores Web do ASP.NET

Assemblies Programao com assemblies

Programao assncrona COMO: Encadear chamadas assncronas com um mtodo


de Web Service

CodeDom Gerao e compilao dinmicas de cdigo fonte

Common Language Runtime Common Language Runtime

Configurao Configurando aplicativos


Configurando aplicativos ASP.NET

Acesso a dados Acesso a dados

Depurao Depurao e perfil de aplicativos

Implantao Implantao de ClickOnce para aplicativos de formulrios do


Windows
Implantando aplicativos .NET Framework

Visual C# Consolidado 451


Noes bsicas sobre implantao de .NET Framework

Designers e o ambiente de design Estendendo suporte em tempo de design

Eventos Tratamento e disparada de eventos

Excees Tratamento e lanamento de excees

Coleta de lixo Coleta de lixo

GDI + Elementos grficos e desenho em formulrios do Windows

Tipos genricos Reflexo e tipos genrico

E/S E/S de arquivo e de fluxo

Interoperabilidade Interoperabilidade

Desenvolvimento mvel .NET Compact Framework


Criando aplicativos mveis ASP .NET

Redes Programao de redes

Reflexo 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 Serializao

Execuo lado a lado Execuo lado a lado

Threads Threads gerenciadas

Formulrios do Windows Formulrios do Windows no .NET Framework

Visual C# Consolidado 452


Controles de formulrios do Controles de formulrios do Windows
Windows

XML Documentos e dados XML

XML Web Services 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. Chame o GetAccessControl mtodo para obter um FileSecurity objeto que contm as
entradas ACL atuais de um arquivo.
2. Adicionar ou remover entradas ACL do objeto FileSecurity retornado da etapa 1.
3. Passar o FileSecurity objeto para o SetAccessControl mtodo para aplicar as alteraes.
Para adicionar ou remover uma entrada ACL de um diretrio
1. Chame o GetAccessControl mtodo para obter um DirectorySecurity objeto que contm
as entradas ACL atuais de uma pasta.
2. Adicionar ou remover entradas ACL do objeto DirectorySecurity retornado da etapa 1.
3. Passar o DirectorySecurity objeto para o SetAccessControl mtodo para aplicar as
alteraes.
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 Uso
String.Format Cria uma seqncia formatada de um conjunto de objetos de entrada.
String.Concat Cria seqncias de dois ou mais seqncias.
String.JOIN Cria uma nova seqncia, combinando uma matriz de seqncias.
String.Insert Cria uma nova seqncia inserindo uma seqncia no ndice especificado de
uma seqncia existente.
String.CopyTo Cpias especificado caracteres em uma seqncia em uma posio
especificada de caracteres em uma matriz.

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);

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 Uso
String.Trim Remove espaos em branco de incio e no fim de uma seqncia.
String.TrimEnd Remove caracteres especificados em uma matriz de caracteres a partir do final
de uma seqncia.
String.TrimStart Remove caracteres especificados em uma matriz de caracteres de incio de
uma seqncia.
String.Remove Remove um nmero especificado de caracteres de uma posio ndice
especificado na seqncia.

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 );

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 Alinha direita e PADS uma seqncia para que seja uma distncia
especificada a partir do incio da seqncia seu caractere mais direita.
String.PadRight Alinha esquerda e PADS uma seqncia para que seja uma distncia
especificada a partir do final de seqncia seu caractere mais direita.

PadLeft

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 Uso


String.Compare 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 Compara o objeto de seqncia atual outra seqncia. Retorna um valor
inteiro.
String.StartsWith Determina se uma seqncia comea com a seqncia passada. Retorna
um valor booleano.
String.EndsWith Determina se uma seqncia termina com a seqncia passada. Retorna

Visual C# Consolidado 462


um valor booleano.
String.Equals Determina se duas seqncias so os mesmos. Retorna um valor
booleano.
String.IndexOf Retorna a posio de ndice de um caractere ou seqncia, comeando a
partir do incio da seqncia voc est examinando. Retorna um valor
inteiro.
String.LastIndexOf Retorna a posio de ndice de um caractere ou seqncia, comeando a
partir do final de seqncia voc est examinando. Retorna um valor
inteiro.

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 Condio


Um inteiro negativo strA menor que strB.
0 igual a strAstrB.
Um inteiro positivo Esta instncia maior que value.
Ou- Ou-
1 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 Uso

String.ToUpper Converte todos os caracteres em uma seqncia em maisculas.

String.ToLower Converte todos os caracteres em uma seqncia em minsculas.

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());

Este exemplo exibe HELLO WORLD! para o console.

O exemplo anterior confidenciais culture-por padro. Para executar uma alterao caso culture-
insensitive, 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 culture-
insensitive, 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 Uso

StringBuilder.Append 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.

StringBuilder.Remove Remove um nmero especificado de caracteres da atual


StringBuilder.

StringBuilder.Replace Substitui um caractere especificado em um ndice especificado.

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 substitui-
los 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:

Voc precisa uma lista seqencial onde o elemento normalmente ser descartado aps
seu valor recuperado?
o 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.
o Caso contrrio, considere usar as outras colees.
Voc precisa acessar os elementos em uma determinada ordem, tais como FIFO, LIFO, ou
aleatrios?
o A Queue classe e a Queue classe genrica oferece acesso fifo.
o A Stack classe e a Stack classe genrica oferece acesso LIFO.
o A LinkedList classe genrico permite acesso seqencial originados do topo para o
final ou o final para a cabea de.
o O restante das colees oferecem acesso aleatrio.
Voc precisa acessar cada elemento pelo ndice?
o O ArrayList e StringCollection Classes e a List classe genrica oferecem acesso a
seus elementos pelo ndice baseado em zero do elemento.
o O Hashtable, SortedList e SortedDictionary Classes genricos oferecem acesso a
seus elementos pela chave do elemento., ListDictionary e StringDictionary classes, e o
Dictionary
o 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?
o Um valor: usar qualquer um das colees com base na IList interface ou a IList
interface genrica.
o Uma chave e um valor: usar qualquer um das colees com base na IDictionary
interface ou a IDictionary interface genrica.
o Um valor com chave incorporado: usar a KeyedCollection classe genrica.
o Uma chave e vrios valores: usar a NameValueCollection classe.
Voc precisa classificar os elementos de forma diferente de como eles foram inseridos?
o A Hashtable classe classifica seus elementos por seus cdigos hash.
o 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,
o 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?

Visual C# Consolidado 476


o 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?
o (StringCollection). com base em IList e StringDictionary (com base em
IDictionary) esto no espao para nome System.Collections.Specialized
o 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.

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. Definir uma coleo de representante dentro da classe que gera os eventos.
2. Defina uma chave para cada evento.
3. Definir as propriedades de evento na classe que gera os eventos.
4. Use a coleo de representante para implementar a adicionar e remover Mtodos
acessadores para as propriedades de evento.
5. 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.
2. 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>.)
3. Se ainda no houver correspondncia, a nova configurao de soluo ir compilar a
primeira configurao listada para o projeto.
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. No menu Build, clique em Configuration Manager.
2. 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.
3. 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. No menu Build, clique em Configuration Manager.
2. 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. Em a Active solution platform box, selecione <Edit>. A Edit Solution Platforms Caixa
de dilogo aberta.
3. 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. Use o Configuration Manager para adicionar pelo menos duas plataformas destino para a
soluo.
2. Selecione a plataforma que voc deseja direcionar a partir da lista Active solution
platform.
3. Compilar uma soluo.
Para criar vrias configuraes de soluo de uma nica vez
1. Use o Configuration Manager para adicionar pelo menos duas plataformas destino para a
soluo.
2. 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.

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. Em Solution Explorer, selecione ou abra a soluo desejada.
2. No menu Build, escolha Build Solution, Rebuild Solution,. ou Clean Solution
o 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 Escolha Rebuild Solution para " Limpar " a primeira soluo, e ento compilar
todos os arquivos e componentes de projeto .
o 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.
Para criar ou reconstruir um nico projeto
1. Em Solution Explorer, selecione ou abra o projeto desejado.
2. No menu Build, escolha Build [Project Name] ou Rebuild [Project Name].
o Escolha Build [Project Name] para criar somente esses componentes de projeto
que foram alterados desde a ltima compilao.
o Escolha Rebuild [Project Name] para " Limpar " o projeto primeiro, e ento
compilar os arquivos de projeto e todos os seus componentes.
Para criar somente o projeto de inicializao e suas dependncias
1. No menu Tools, escolha Options.
2. 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.
3. 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:
o Escolhe Start (F5) a partir do Menu Debug.
Ou-
o Escolhe 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
Somente para projetos em Visual C++, um submenu Project Only do menu Build exibe
trs comandos especficos do projeto:
o Criar somente projname < >
o Reconstruir somente projname < >
o 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. No menu Build, escolha Batch Build.
2. Marque as caixas de seleo para as configuraes do projeto que deseja criar.
3. Escolha Build ou Rebuild.
Para definir opes de salvar para os comandos de compilao

Visual C# Consolidado 501


1. No menu Tools, escolha Options.
2. 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.
3. Selecione uma opo na lista Before building.
Para mostrar comentrios sobre compilaes
1. No menu Tools, escolha Options.
2. Na caixa de dilogo Options, expanda a pasta Projects and Solutions, e escolha
General.
A caixa de dilogo Opes, Geral, projetos e solues abre.
3. Se desejar que a janela de sada venha para a frente e mostre o andamento da
compilao, selecione Show Output window when build starts.
4. 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.

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. No menu Project, clique em Properties.
2. Clique na guiaBuild.
3. 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. No menu Project, clique em Properties.
2. Expanda a guia Configuration Properties e clique em General.
3. 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. No menu Project, clique em Properties.
3. 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
4. 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. Em Solution Explorer, selecione a soluo.
2. No menu Project, clique em Properties. O A caixa de dilogo de pginas de Propriedades
da Soluo abre.
3. Expanda o n Common Properties, e clique em Startup Project.
4. 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. Em Solution Explorer, selecione um projeto.
2. 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. Na aba Dependencies , selecione um projeto a partir do menu suspenso Project.


4. No campo Depends on, selecione a caixa de seleo de qualquer outro projeto que deve
ser compilado antes deste projeto.
Para remover dependncias de projetos
1. Em Solution Explorer, selecione um projeto.
2. 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. Na aba Dependencies, selecione um projeto a partir do menu suspenso Project.


4. No campo Depends on, desmarque as caixas de seleo ao lado de outros projetos que
no sejam mais dependncias deste projeto.

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


Suporte a novos recursos no SQL Server 2005, incluindo:
o Depurao de tipos de objetos de banco de dados gerenciado.
o Depurao de aplicativos multicamadas, passando entre as camadas do aplicativo
e do banco de dados SQL Server.
o Depurao para frente e para trs entre cdigo gerenciado e T-SQL.
o 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 execut-
lo. 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 Visual Basic C# C++ J# Visual Web Developer

Express No No No No No

Padro No No No No No

Pro / Team Sim Sim Sim 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. No Solution Explorer, selecione o projeto.


2. 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.
3. Na pgina de propriedades <Project> , selecione se a guia Debug ou, se o tipo de projeto
um site da Web, Start Options.
4. Na caixa de listagem Configuration, clique em Debug ou Release.
5. 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 Description
Debugger to launch 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 Especifica o comando para iniciar o programa que voc est
Windows Debugger) depurando na mquina local.
Remote Command O caminho para o .exe conforme ilustrado pelo computador remoto.
(Remote Windows
Debugger)
Application Command
(MPI Cluster Debugger)
Command Arguments Especifica argumentos para o comando especificado acima.
(Local Windows Voc pode usar os seguintes operadores de redirecionamento na
Debugger e Remote caixa:
Windows Debugger) < file
Application Arguments L stdin do arquivo.
(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.
Attach (Local Windows Especifica a iniciar ou anexar para o aplicativo. A Configurao padro
Debugger and Remote No.
Windows Debugger)
Remote Server Name Especifica o nome de um computador (diferente do seu) no qual voc
(Remote Windows deseja depurar um aplicativo ou um Nome do servidor Msvsmon. Voc
Debugger and MPI tambm pode selecionar isso a partir da caixa de dilogo Processes
Cluster Debugger) (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.
Connection (Remote Permite que voc alterne entre depurao local e remota. Especifique
Windows Debugger and um nome de computador remoto na caixa Remote Server Name.
MPI Cluster Debugger) 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

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.
Environment (Local Especifica variveis de ambiente para o programa que voc est
Windows Debugger) 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 ( ) elipse para editar
variveis de ambiente.
Merge Environment Determina se as variveis especificadas na caixa Environment sero
(Local Windows mescladas com o ambiente definido pelo sistema operado. A
Debugger) configurao padro Sim.
SQL Debugging (todos Ativa a depurao de procedimentos SQL de seu aplicativo Visual
menos MPI Cluster C++. A configurao padro No.
Debugger)

Pasta C/C++ (Categoria geral)

Configurao Descrio
Debug Information Especifica o tipo de informaes de depurao a serem criadas para o
Format (/Z7, /Zd, Zi, projeto.
/ZI) 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 Descrio
Generate Debug Info Informa o vinculador para incluir informaes da depurao, que
(/DEBUG) tero o formato especificado por /Z7, /Zd, Zi, ou /ZI.
Generate Program 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 Especifique o nome de um arquivo PDB nesta caixa se voc no
(/PDBSTRIPPED:filename) 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).
Generate Map File (/MAP) Informa o vinculador para gerar um arquivo de mapa durante a
vinculao. A configurao padro No. Para obter mais
informaes consulte /MAP (Gerar Mapfile).
Map File Name Se voc escolher gerar arquivo de mapa, voc pode especificar o
(/MAP:nome) arquivo de mapa nesta caixa. Para obter mais informaes consulte
/MAP (Gerar Mapfile).
Map Exports Inclui funes exportadas no arquivo de mapa. A configurao
(/MAPINFO:EXPORTS) padro No. Para obter mais informaes consulte /MAPINFO
(inclui informaes em Mapfile).
Debuggable Assembly Especifica configuraes para a opo Linker /ASSEMBLYDEBUG.
(/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).

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 Visual Basic C# C++ J# Visual Web Developer

Express No No No No No

Standard No No No No No

Pro/Team Sim Sim Sim 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.
Para adicionar uma conta de logon do Windows como sysAdmin
Um usurio que j tenha privilgios SysAdmin deve executar o seguinte:
sp_addsrvrolemember 'Domain\Name', '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 Descrio
Configuration Define o modo para compilar o aplicativo. Escolha entre Active (Debug),
Debug, Release, All Configurations.
Start Action 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


Argumentos da Especifica argumentos de linha de comando para o programa a ser
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 Especifica a pasta de trabalho do programa que est sendo depurado. No
trabalho Visual Basic, a pasta de trabalho o diretrio de que aplicativo iniciado,
\bin, por padro.
Usar mquina Quando a caixa de seleo estiver marcada, a depurao remota ativado.
remota 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.
Depurao de Permite a voc depurar chamadas para cdigo nativo (no gerenciado) de
cdigo no Win32 de seu aplicativo gerenciado. Isso tem o mesmo efeito de que
gerenciado selecionar misto para tipo de depurador em um projeto Visual C++.
Depurao do Permite a depurao de objetos de banco de dados do SQL Server.
SQL Server

Guia Compilar: Pressione boto Opes avanadas de compilao

Configurao Descrio
Ativar Esta opo deve ser desmarcada. Otimizao faz com que o cdigo que
otimizaes 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.
Gerar Definidos por padro nas verses de lanamento e de depurao, esta
informaes de configurao (equivalente a opo do compilador /debug) cria informaes da
depurao 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.
Definir constante Definir esse smbolo permite compilao condicional das funes de sada da
DEBUG classe de depurao. Com esse smbolo definido, mtodos de classe de
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
Trace da classe Rastrear. Com esse smbolo definido, os mtodos de classe de
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 Visual Basic C# C++ J# Dev Web

Express No No Sim No No

Padro No No Sim No No

Pro / Team No No Sim 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 localiz-
lo. 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. Abra a janela Immediate do depurador.


2. 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 Setting

Generate Voc deve sempre definir esta opo para Yes (/DEBUG) para criar arquivos
debugging necessrios para depurao e smbolos de depurao. Quando o aplicativo
information 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. Abra o projeto no Visual Studio.
2. No menu Debug, clique em Start.
3. 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. Abra o projeto no Visual Studio.
2. No menu Debug, escolha Start.
3. 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. No menu View, clique em Property Pages.
2. Clique no n Configuration Properties para abri-lo se ele no estiver aberto.
3. Selecione General, e defina o valor da linha Output para Debug.
4. 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. No menu File, escolha New Web Site.
2. Na caixa de dilogo New Web Site, selecione ASP.NET Web Site.
3. Clique em OK.
Para depurar o seu formulrio da Web
1. Defina um ou mais pontos de interrupo nas suas funes e manipuladores de eventos.
Para obter mais informaes, consulte Pontos de interrupo e Tracepoints.
2. 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. 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.
2. Clique em Start Options.
3. Defina Start Action como a pgina da Web que primeiro deve ser exibida.
4. Em Debuggers, certifique-se de que ASP.NET debugging verificada.
Para obter mais informaes, consulte Configuraes de Property Pages para Projetos 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. 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.
2. 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. No menu Debug, clique em Stop Debugging.
4. 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.
5. No Solution Explorer, clique com o boto direito do mouse no projeto do cliente e clique
em Properties no menu de atalho.
6. Na janela Solution <Name> Properties, abra o n Common Properties e selecione
Startup Project.
7. Clique em Multiple Startup Projects.
8. Em Multiple Startup Projects, v para a coluna Action e defina a ao como Start para
ambos os projetos.
9. 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. 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.
2. 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. No menu Debug, clique em Stop Debugging.
4. Crie um projeto de aplicativo cliente, na mesma soluo que seu projeto de XML Web
Services ou em uma soluo diferente.
5. Em seu projeto do cliente, adicione uma referncia da Web e uma chamada sncrona para
o servio da Web.

Visual C# Consolidado 531


6. 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.
7. 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. No menu Open, clique em File e selecione Project.
2. Na caixa de dilogo Open Project, clique na seta Files of type, e selecione Executable
Files.
3. 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. No menu File, clique em Add Project e, em seguida, clique em Existing Project.
2. Na caixa de dilogo Add Existing Project, localize e selecione o executvel.
3. Clique em OK.
4. 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 Visual Basic C# C++ J# Web Dev

Express Edition No No No No No

Standard Edition No No No No No

Pro/Team Edition Sim Sim Sim Sim 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. Insira seu carto Code Center Premium no leitor SmartCard conectado ao seu
computador.
2. Insira o Code Center Premium Welcome Kit CD na unidade de CD-ROM.

Visual C# Consolidado 533


3. Se o disco no Autorun, localize e execute o arquivo de instalao:
Bem-vindo Kit CD\Source Code\CDROM_FILES\install.exe
4. Para procurar fonte Code Center Premium, inicie o Internet Explorer e digite:
https://codepremium.msdn.microsoft.com
5. Navegue at localizar o cdigo fonte que deseja.
Para depurar a fonte do cdigo central premium
1. Especifique um diretrio local para a fonte compartilhada segura Code Center Premium,
conforme descrito abaixo.
2. Inicie o Visual Studio.
3. A partir do menu Tools, escolha Options.
4. Na caixa de dilogo Options, abra o n Debugging e selecione Symbols.
5. Na caixa Symbol File Locations, adicione o seguinte local:
https://codepremium.msdn.microsoft.com/symbols
6. Na caixa Cache symbols from symbol servers in this directory, digite um local onde
Code Center Premium pode armazenar smbolos. Por exemplo:
c:\symbols
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. Abra o projeto no Visual Studio.
8. No Solution Explorer, clique com o boto direito do mouse no nome da soluo e escolha
Properties a partir do menu de atalho.
9. 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. Saia do Visual Studio, se ele estiver sendo executado.
2. No prompt de comando do Windows, digite:
regedt32

3. Na janela Registry Editor , abra:


HKEY_CURRENT_USER\Software\MSFT\VisualStudio\8.0\Debugger
4. Na coluna Name, clique duas vezes em SecureSourceLocalDirectory.
5. 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 Visual Basic C# C++ J#

Express Sim Sim No Sim

Padro Sim Sim No No

Pro / Team Sim 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. No menu Project escolha Projectname Properties.
2. Nas pginas da propriedade Projectnameclique na pgina Security.
3. Selecione Enable ClickOnce Security Settings.
4. 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. Se a zona que voc escolher for (Custom), selecione correto as configuraes
personalizadas na coluna Setting da grade Permissions.
6. Clique OK para fechar as pginas de propriedades.
Para adicionar uma permisso extra quando uma exceo de segurana ocorre
1. A caixa de dilogo Exception Assistant ser exibida com a mensagem: SecurityException
was unhandled.
2. Na caixa de dilogo Exception Assistant em Actions, clique em Add Permission to the
Project.
3. A caixa de dilogo Restart Debug ser exibida.
o Se voc desejar reiniciar a sesso de depurao com a nova permisso, clique em
Yes.
o Se voc no desejar reiniciar ainda, clique em No.
Para exibir as permisses adicionadas durante a depurao extra
1. No menu Project escolha Projectname Properties.
2. Nas pginas de propriedades Projectname clique na pgina Security.
3. 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 ".
4. Use a barra de rolagem vertical para exibir a grade inteira Permissions required by the
application.

Como: depurar um aplicativo de cluster remoto

Este tpico se aplica a:

Edio do Visual Studio Visual Basic C# C++ J# Visual Web Developer

Express No No No No No

Visual C# Consolidado 536


Padro No No No No No

Pro / Team No No Sim 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.)
Para preparar um projeto do Visual Studio para depurao MPI
1. Abra a soluo que contm o aplicativo paralelo no Visual Studio.
2. No Solution Explorer, clique com o boto direito do mouse no projeto e escolha
Properties a partir do menu de atalho.
3. Na caixa de dilogo Project Properties , selecione Debugging.
4. Na caixa de listagem Debugger to Launch, escolha MPI Cluster Debugging.
5. 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
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.
10. Na caixa MPIShim location, digite o caminho para o MPIShim.exe. Por exemplo:
c:\windows\system32\mpishim
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 Visual Basic C# C++ J#

Express Sim Sim Sim No

Standard Sim Sim Sim No

Pro / Team Sim Sim Sim 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.
Para iniciar o Monitor de Depurao Remota 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)
Ou-
No 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. Configure a Remote Debugging Monitor para depurao remota
o Para configurar a depurao remota no Windows Authentication mode, consulte
Como configurar modo Autenticao do Windows:.
o 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 Sim Sim Sim No

Standard Sim Sim Sim No

Pro/Team Sim Sim Sim 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. Iniciar o Registry Editor (Regedit).
3. Na Registry Editor, abra a pasta HKEY_LOCAL_MACHINE.
4. 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-9256-
EE18EB41B62B}.
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-30D2-
4032-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. Clique duas vezes em CLRVersionForDebugging.
7. Na caixa Edit String, digite o nmero de verso do .NET Framework na caixa Value. Por
exemplo: V1.1.4322
8. Clique em OK.
9. 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. No menu File, escolha New e clique Project.
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. Para Visual Basic, Visual C# ou Visual J#, selecione a Windows., em seguida,
marque Windows Application no painel Templates.
2. Para Visual C++, selecione o CLR.
3. No painel Templates, selecione Windows Application.
4. Na caixa Name, d ao projeto um nome exclusivo (por exemplo,
Walkthrough_SimpleDebug).
5. 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. No menu View, selecione Toolbox.
Abre a caixa de ferramentas. Para obter mais informaes, consulte Caixa de ferramentas.
7. 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.
8. 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.
9. 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.
10. 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. A partir do menu Debug, escolha Start.
O formulrio do Windows comea a ser executado.
3. 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. No menu Debug, escolha Windows, em seguida Watch, e clique em Watch1.


5. 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. A partir do Menu Debug, escolha Continue para continuar a depurao do programa.


8. No formulrio do Windows, clique no boto novamente.
Visual Studio quebra a execuo novamente.
9. Clique no ponto vermelho que representa o ponto de interrupo.
Isso remove o ponto de interrupo do seu cdigo.
10. 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.
4. No painel Available Processes, localize o nome do processo
(Walkthrough_SimpleDebug.exe) na coluna Process e clique nele.
5. Clique no boto Attach.
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.

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. A partir do menu Tools, escolha Options.


2. Na caixa Options de dilogo, abra a pasta Debugging e selecione a categoria General.
3. 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.
Para desativar depurao de ncleo
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

2. Abra boot.ini usando o bloco de notas e remova as seguintes opes:


/debug /debugport /baudrate

3. Reinicialize o computador.
4. Reinicie o Visual Studio e depurao.
Para depurar com o Kernel Debugger
1. Se o Kernel Debugger conectado, voc ver uma mensagem perguntando se voc
deseja para continuar a depurao. Clique no boto para continuar.
2. Voc pode obter um User break exception(Int 3) Se isso acontecer, digite o seguinte
comando KD para continuar a depurao:
gn

Depurao de cdigo nativo


Este tpico se aplica a:

Visual Studio Edition Visual Basic C# C++ J#

Express No No Nativo No

Padro No No Nativo No

Pro / Team No No Nativo 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 Visual Basic C# C++ J#

Express No No Nativo No

Padro No No Nativo No

Visual C# Consolidado 551


Pro / Team No No Nativo No

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 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.
2. Selecione o projeto no Solution Explorer.
3. No menu View, clique em Property Pages.
4. Na caixa Property Pages de dilogo, certifique-se Debug estar marcada na caixa
Configuration de listagem drop-down.
5. No modo de exibio Pasta no lado esquerdo, selecione a C/C pasta.
6. Sob a pasta C++, selecione Optimization.

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)
8. Se voc escolheu a Custom opo para Optimization, agora voc pode definir opes
para qualquer uma das outras propriedades mostradas na lista Propriedades

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 Visual Basic C# C++ J#

Express No No Nativo No

Padro No No Nativo No

Pro / Team No No Nativo 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 No No Nativo No

Standard Edition No No Nativo No

Pro / Team Edition No No Nativo 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 Visual Basic C# C++ J#

Express No No Nativo No

Padro No No Nativo No

Pro / Team No No Nativo 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 Visual Basic C# C++ J#

Express No No Nativo No

Padro No No Nativo No

Pro / Team No No Nativo No

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. Usar a Disassembly janela para exibir as instrues do conjunto.


2. Use a Registers janela para exibir registrar contedo.

Tcnicas de depurao atl


Este tpico se aplica a:

Visual Studio Edition Visual Basic C# C++ J#

Express No No Nativo No

Visual C# Consolidado 556


Padro No No Nativo No

Pro / Team No No Nativo 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 Visual Basic C# C++ J#

Express No No Nativo No

Padro No No Nativo 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 Visual Basic C# C++ J#

Express No No Nativo No

Visual C# Consolidado 558


Padro No No Nativo No

Pro / Team No No Nativo 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 No No Nativo No

Padro No No Nativo No

Pro / Team No No Nativo 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 Visual Basic C# C++ J#

Express Edition No No Nativo No

Standard Edition No No Nativo No

Pro / Team Edition No No Nativo No

Esta seo fornece dicas sobre depurao aplicativos COM e controles ActiveX.

Como: Depurar DLLs

Este tpico se aplica a:

Visual Studio Edition Visual Basic C# C++ J#

Express No No Nativo No

Padro No No Nativo No

Pro / Team No No Nativo 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. No Solution Explorer, selecione o projeto que cria a DLL.
2. Partir do View menu, escolha Property Pages.
3. Na caixa Property Pages de dilogo, abra a Configuration Properties pasta e selecione
a Debugging Categoria.
4. Na caixa Command, especifique o nome de caminho para o continer. Por exemplo,
Files\MyApplication\MYAPP.EXE C:\Program.
5. 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 Visual Basic C# C++ J#

Express No No Nativo No

Padro No No Nativo No

Pro / Team No No Nativo 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. O depurador deve estar no modo de interrupo.
2. Em um janela de cdigo de origem, coloque o cursor na frente do atributo cujo cdigo
injected voc deseja exibir.
3. 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. O depurador deve estar no modo de interrupo.
2. 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 Visual Basic C# C++ J# Visual Web Developer

Express No No No No No

Visual C# Consolidado 563


Padro No No No No No

Pro / Team Sim Sim Sim Sim 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. Emitir a sada de rastreamento.


o 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 adicione-
lo 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. Defina uma opo como o tipo BooleanSwitch ou tipo TraceSwitch e definir o nome e
descrio da opo.
2. 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. Clique com o boto direito do mouse no n no Solution Explorer projeto.
2. Escolha Properties no menu de atalho.
3. Na caixa Property Page de dilogo que aparece, clique na Configuration Properties guia
no painel esquerdo e escolha a Build opo.
4. Escolha as configuraes do compilador desejado.
o 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.
o 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 Significado
vbc Compilador do Visual Basic
csc Compilador C#
/r: Referencia um conjunto externo (exe ou dll)
/d: 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 Instruo Resultado
Visual Basic Trace #CONST = True Ativa o rastreamento
Trace #CONST = False Desativa o rastreamento
Debug #CONST = True Ativa a depurao
Debug #CONST = False Desativa depurao
C# # Definir Trace Ativa o rastreamento
# undefine Trace Desativa o rastreamento
# Defina debug Ativa a depurao
# undefine Debug Desativa depurao

Para desativar o rastreamento ou depurao


1. Excluir a diretiva Compilador do seu cdigo fonte.
- ou -
2. 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 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>

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. Considere qual rastreamento sada ser voc deseja que receba onsite aps voc ter
implantou o aplicativo.
2. Criar um conjunto de opes. Para obter mais informaes, consulte Criando e ao
inicializar opes de rastreamento.
3. Adicionar as instrues de rastreamento ao cdigo do aplicativo.
4. 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.
5. Testar e depurar seu aplicativo e o cdigo de rastreamento que ele contm.
6. Compilar o aplicativo em cdigo executvel usando um dos seguintes procedimentos:

Visual C# Consolidado 575


o 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 -
o 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.
7. 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.
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. Criar comutaes no cdigo. Para obter mais informaes, consulte Criando e ao inicializar
opes de rastreamento.
2. Se o projeto no contm um arquivo de configurao (App.config ou Web.config), seguida,
no menu Project, selecione Add New Item.
o 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>.
o 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. Caso voc precise ativar como qualquer inteiro diferente de 0. a BooleanSwitch, como
DataMessagesSwitch mostrado no exemplo anterior, alterar o Value
5. Caso voc precise ativar com a configurao Nvel apropriada (1 a 4). a TraceSwitch,
como TraceLevelSwitch mostrado no exemplo anterior, alterar o Value
6. 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. A partir do menuFile, clique em New, e clique em Web Site.
A caixa de dilogo New Web Site ser exibida.
2. 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.
3. 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.
4. Na lista drop-down Language , selecione a linguagem que ser usada.
5. 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"

-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. Verifique se a Active Configuration a configurao do Debug.
8. No menu Debug, selecione Start ou pressione F5.
9. 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.
10. O Internet Explorer abrir, e exibir o link Hello World.
11. Clique no link Hello World.
Uma nova pgina aberta no Internet Explorer.
12. 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. No Visual Studio, voc pode anexar o depurador a um processo em execuo. O
procedimento a seguir mostra como fazer isso.
2. 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. No menu Debug, selecione Attach to Process. Voc tambm pode clicar emAttach to
Process no menu Tools.
5. 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. Clique no boto Attach.
Voc tiver anexado o depurador ao seu servio da Web em execuo.
8. No Internet Explorer, clique na linha que diz " Hello World ".
Abre uma nova pgina.
9. 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. Para Visual Basic, Visual C# ou Visual J#, selecione a Windows., em seguida,
marque Windows Application no painel Templates.
2. Para Visual C++, selecione o CLR.
3. No painel Templates, selecione Windows Application.
4. Na caixa Name, d ao projeto um nome exclusivo (por exemplo,
Walkthrough_SimpleDebug).
5. 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. No menu View, selecione Toolbox.
Abre a caixa de ferramentas. Para obter mais informaes, consulte Caixa de ferramentas.
7. 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.
8. 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.
9. 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.
10. 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. A partir do menu Debug, escolha Start.
O formulrio do Windows comea a ser executado.
3. 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. No menu Debug, escolha Windows, em seguida Watch, e clique em Watch1.


5. 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. A partir do Menu Debug, escolha Continue para continuar a depurao do programa.


8. No formulrio do Windows, clique no boto novamente.
Visual Studio quebra a execuo novamente.
9. Clique no ponto vermelho que representa o ponto de interrupo.
Isso remove o ponto de interrupo do seu cdigo.
10. 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.
4. No painel Available Processes, localize o nome do processo
(Walkthrough_SimpleDebug.exe) na coluna Process e clique nele.
5. Clique no boto Attach.

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 Visual Basic C# C++ J# Visual Web Developer

Express No No No No No

Standard No No No No No

Pro / Team Sim Sim Sim Sim 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. 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:.
2. 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:.
3. 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.
4. 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.
6. Experimente recursos de depurao diferentes.

Visual C# Consolidado 582


1. No menu Debug, clique em Step Into repetidamente para observar a execuo
linha por linha da funo.
2. Conforme voc depura a funo, voc pode usar as janelas Locals e Watch para
observar os valores dos diferentes membros.
3. Clique em Continue novamente para concluir a depurao da funo.
4. 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 Visual Basic C# C++ J# Visual Web Developer

Express No No No No No

Padro No No No No No

Pro / Team Sim Sim Sim Sim 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:.
2. 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:.
3. 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.
4. 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.
5. Experimente recursos de depurao diferentes.
1. Passe a instruo instanciando o SqlTriggerContext.
2. 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

O servidor pode no refletir as alteraes em valores de variveis nas janelas do depurador. Par
obter mais informaes, consulte Limitaes depurao SQL.

3. 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.
4. 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. No editor de texto, clique com o boto direito do mouse na linha ltima e clique em
Insert Breakpoint.
6. 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 Visual Basic C# C++ J# Visual Web Developer

Express No No No No No

Standard No No No No No

Pro/Team Sim Sim Sim Sim 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:.
2. 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:.

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.
4. Adicione pontos de interrupo.
1. Na pasta Types no Server Explorer, abra Point.
2. Insira um ponto de interrupo dentro de cada mtodo de modo que voc possa
observar o fluxo de controle no interior do tipo.
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.
6. 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.
2. Na janela Locals, abra a varivel pt, que contm o Point que est sendo criado
atualmente.
3. 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.
4. Depurar a classe vrias vezes e observar as diferenas entre os caminhos de um
INSERT e um SELECT.
5. Pressione Continue novamente para concluir a depurao da funo.
Exemplo

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 Visual Basic C# C++ J# Visual Web Developer

Express No No No No No

Padro No No No No No

Pro / Team Sim Sim Sim Sim 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:.
2. 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:.
3. 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.
4. 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
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. Passe a instruo instanciando o SqlCommand usando Step Into a partir do menu
Debug.
2. Na janela Locals, abra a varivel sqlComm, que o SqlCommand e examine seus
membros.
3. 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. No editor de texto, arraste sqlComm para qualquer local na janela Watch. A varivel
agora adicionada lista de variveis observadas.
5. Escolha Step Into novamente e observe que uma nova janela rotulada Dynamic T-
SQL abre, exibindo a instruo SQL que est prestes a ser executada.
6. Escolha Step Into por executar a instruo e retornar para a funo.
7. Pressione Continue novamente, e observe a segunda janela Dynamic T-SQL que
abre, mostrando o cdigo que retorna o valor da funo.
8. Pressione Continue novamente para concluir a depurao da funo.
Exemplo

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 Visual Basic C# C++ J# Visual Web Developer

Express No No No No No

Standard No No No No No

Pro / Team Sim Sim Sim Sim 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:.
2. 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:.
3. 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.
4. 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.
5. 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. Na janela Locals, abra a varivel value, que contm o nome de armazenamento
atual sendo processado.
3. 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.
4. 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.
5. 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.
6. 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.
7. Clique em Continue novamente para concluir a depurao da funo.
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 Visual Basic C# C++ J# Visual Web Developer

Express No No No No No

Standard No No No No No

Pro / Team Sim Sim Sim Sim 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 T-
SQL 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 Visual Basic C# C++ J# Visual Web Developer

Express No No No No No

Padro No No No No No

Pro / Team Sim Sim Sim Sim 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:.
2. 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:.
3. 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.
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.
2. 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.
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. @currencyCode= AAA
2. @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. Depure o disparador at que voc saia de volta ao procedimento armazenado, e
continue at o fim.
8. 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 Visual Basic C# C++ J# Visual Web Developer

Express No No No No No

Standard No No No No No

Pro/Team Sim Sim Sim Sim 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 T-
SQL, 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:.
2. 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:.
3. 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.
4. Defina pontos de interrupo na funo definida pelo usurio ufnGetStock.
1. 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.
2. Clique com o boto esquerdo do mouse na margem cinza ao lado da instruo
DECLARE para definir um ponto de interrupo.
5. 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:.
6. 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.
2. 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.
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 Visual Basic C# C++ J# Visual Web Developer

Express No No No No No

Standard No No No No No

Pro/Team Sim Sim Sim Sim 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:.
2. 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:.
3. 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.
4. 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.

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.
4. 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.
5. No editor de texto, clique com o boto direito do mouse na linha Return (0), e no
menu de atalho, clique em Insert Breakpoint.
6. No menu Debug, clique em Continue.
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/en-
us/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 Descrio


Diretiva Definida pelos administradores da empresa que definir a diretiva para
corporativa domnios da empresa.
Diretiva da Definida pelos administradores mquina que definir a diretiva para um
mquina computador.
Diretiva de usurio Definido por usurios que definir a diretiva para uma conta de logon nico.
Diretiva de Definido pelo host do tempo de execuo (qualquer aplicativo que hospeda o
domnio de Common Language Runtime) para definir diretiva tempo carregar-. Este nvel
aplicativo 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 Descrio
Confiar um Use este assistente para identificar um aplicativo pelas informaes Editor
aplicativo ou nome forte e Aumentar nvel do aplicativo de confiana.
Ajustar Use este assistente para aumentar ou diminuir permisses a conjuntos de
configuraes de mdulos (assemblies) proveniente de uma das seguintes zonas: Meu
segurana computador, intranet local, Internet, sites confiveis e sites no confiveis.
Criar um pacote de Use este assistente para criar um pacote Windows Installer para implantar a
implantao 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.
2. 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.
3. 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
4. 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.
5. 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.

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. 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.
2. Criar um arquivo XML que representa o tipo de permisso voc deseja criar e atribuir aos
conjuntos.
3. 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.
Para descriptografar dados na memria usando proteo de dados
Chame o mtodo esttico Unprotect Ao passar uma matriz de bytes para descriptografar e
o escopo Proteo de memria.
Para criptografar dados em um arquivo ou transmitir usando proteo de dados
1. Criar entropia aleatrio.
2. Chame o mtodo esttico Protect Ao passar uma matriz de bytes para criptografar, a
entropia, e o escopo proteo dados.
3. Gravar os dados criptografados para um arquivo ou fluxo.
Para descriptografar dados de um arquivo ou transmitir usando proteo de dados
1. Ler os dados criptografados de um arquivo ou fluxo.
2. Chame o mtodo esttico Unprotect Ao passar uma matriz de bytes para descriptografar e
o escopo 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. 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.
2. Criar um arquivo XML que representa o tipo de permisso voc deseja criar e atribuir aos
conjuntos.
3. 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. 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.
3. 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

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 inicializa-
lo 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. 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.
2. 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.
Para excluir uma chave de uma continer de chave
1. 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.
2. 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
3. Definir a PersistKeyInCSP propriedade de classe que deriva de AsymmetricAlgorithm
para false (False no Visual Basic.)
4. Chame o Clear mtodo da classe que deriva de AsymmetricAlgorithm. Esse mtodo
libera todos os recursos da classe e limpa o continer de chave.
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-.
2. 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

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. No Painel de Controle, abra Ferramentas administrativas.
2. Clique duas vezes Microsoft .NET Framework <version> Configuration.
Como alternativa, voc pode executar a ferramenta em um prompt de comando:
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
o Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc.
2. Expanda o Runtime Security Policy n.
3. Expanda o n para o nvel de diretiva voc deseja alterar a permisso para.
4. Expanda o Permission Sets n.
5. Clique com o boto direito do mouse no conjunto de permisso cuja permisso voc
deseja modificar e escolha Change Permissions.
6. 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.
7. Clique em Finish.

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. No Painel de Controle, abra Ferramentas administrativas.
2. Clique duas vezes Microsoft .NET Framework <version> Configuration.
Como alternativa, voc pode executar a ferramenta em um prompt de comando:
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.
o Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc.
2. Expanda o Runtime Security Policy n.
3. Expanda o n para o nvel de diretiva que contm o conjunto de permisso voc deseja
adicionar a permisso para.
4. Expanda o Permission Sets n.
5. Clique com o boto direito do mouse no conjunto de permisso voc deseja adicionar a
permisso para e escolha Change Permissions.
6. 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.
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. No Painel de Controle, abra Ferramentas administrativas.
2. Clique duas vezes Microsoft .NET Framework <version> Configuration.
Como alternativa, voc pode executar a ferramenta em um prompt de comando:
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.
o Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc.
2. Expanda o Runtime Security Policy n.
3. Expanda o n para o nvel de diretiva que contm o grupo de cdigo que voc deseja
modificar.
4. Expanda o Code Groups n e expanda rvore sob o All_code n.
5. Clique com o boto direito do mouse no grupo de cdigo adequada e selecione
Properties.
6. Clique na Membership Condition guia.
7. 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.

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. No Painel de Controle, abra Ferramentas administrativas.
2. Clique duas vezes Microsoft .NET Framework <version> Configuration.
Como alternativa, voc pode executar a ferramenta em um prompt de comando:
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.
o Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc.
2. Expanda o Runtime Security Policy n.
3. Expanda o n para o nvel de diretiva que contm o grupo de cdigo que deseja modificar.
4. Expanda o Code Groups n e expanda rvore sob o All_code n.
5. Clique com o boto direito do mouse no grupo de cdigo adequada e selecione
Properties.
6. Clique na Permission Set guia.
7. Selecione a permisso conjunto voc deseja associar ao grupo de cdigos na lista drop-
down e clique em OK.

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.
o 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.
o 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. Use the name option, and specify a name for the code group. Double quotes (" ") are
required around names that contain spaces.
2. 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. No Painel de Controle, abra Ferramentas administrativas.
2. Clique duas vezes Microsoft .NET Framework <version> Configuration.
Como alternativa, voc pode executar a ferramenta em um prompt de comando:
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.
o Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc.
2. Expanda o Runtime Security Policy n.
3. Expanda o n para o nvel de diretiva voc deseja adicionar o grupo de cdigos para.
4. Expanda o Code Groups n e expanda rvore sob o All_code n.
5. Clique com o boto direito do mouse no grupo de cdigo que ser o pai imediato do novo
grupo de cdigos, e escolha New.
6. D ao grupo de cdigo um nome e, opcionalmente, uma descrio. Clique em Next.
7. 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.
8. 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.

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. Criar um arquivo de diretivas do editor.


2. Cria um conjunto da diretiva do editor.
3. 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 publisherPolicyFile argumento o nome do arquivo de diretiva do editor.
o 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 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. No Painel de Controle, abra Ferramentas administrativas.
2. Clique duas vezes Microsoft .NET Framework <version> Configuration.
Como alternativa, voc pode executar a ferramenta em um prompt de comando:
o No.NET Framework 1.0 e 1.1, digite o seguinte no prompt de comando:
%Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc.
o Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc.
2. Expanda o Runtime Security Policy n.
3. Expanda o n para o nvel de diretiva que deseja remover um conjunto de permisses.
4. Expanda o Permission Sets n.
5. 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.

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. No Painel de Controle, abra Ferramentas administrativas.
2. 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 Nas verses do .NET Framework 1.0 e 1.1, digite o seguinte no prompt de
comando: %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc.
o Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc.
2. Expanda o Runtime Security Policy n.
3. Expanda o n para o nvel de diretiva voc deseja adicionar uma permisso definida.
4. Clique com o boto direito do mouse Permission Sets e escolha New.
5. Dar o conjunto de permisses um nome e, opcionalmente, uma descrio. Clique em Next.
6. 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.
7. Repita a etapa seis at todas as permisses desejadas so adicionadas ao conjunto de
permisses.
8. 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. No Painel de Controle, abra Ferramentas administrativas.
2. Clique duas vezes Microsoft .NET Framework <version> Configuration.
Como alternativa, voc pode executar a ferramenta em um prompt de comando:
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.
o Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc.
2. Expanda o Runtime Security Policy n.
3. Expanda o n para o nvel de diretiva que contm o grupo de cdigo voc deseja tornar
exclusivo ou final.
4. Expanda o Code Groups n e expanda rvore sob o All_code n.
5. Clique com o boto direito do mouse no grupo de cdigo que voc deseja que seja
exclusivo ou final e selecione Properties.
6. 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 ".
Ou-
Para 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.

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. Expanda o Runtime Security Policy n.
3. Expanda o n para o nvel de diretiva voc deseja adicionar o novo conjunto para.
4. Clique com o boto direito do mouse Policy Assemblies e escolha Add.
5. Selecione o nome do conjunto a partir da lista que aparece. Esses so os conjuntos que
esto em cache de conjunto global.
6. 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. Expanda o Runtime Security Policy n.
3. Expanda o n para o nvel de diretiva voc deseja adicionar uma permisso definida.
4. Clique com o boto direito do mouse Permission Sets e selecione New.
5. Clique em Import e selecione o arquivo XML que contm as informaes sobre o conjunto
de permisses.
6. 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. No Painel de Controle, abra Ferramentas administrativas.
2. Clique duas vezes Microsoft .NET Framework <version> Configuration.
Como alternativa, voc pode executar a ferramenta em um prompt de comando:
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.
o Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc.
2. Expanda o Runtime Security Policy n.
3. Expanda o n para o nvel de diretiva que deseja remover a permisso de.
4. Expanda o Permission Sets n.
5. Clique com o boto direito do mouse no conjunto de permisso voc deseja remover a
permisso de e escolha Change Permissions.
6. Selecione uma permisso a partir da Assigned Permissions lista e clique em Remove.
7. Clique em Finish.

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 Descrio
Novo 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.
Abrir Abra um nvel de diretiva. Use esta opo para abrir arquivos criados
usando a New opo de diretiva.
Redefinir tudo Redefinir todos os nveis de diretiva para o padro.
Ajustar Segurana Ajuste o nvel de segurana para cada zona.
Avaliar Conjunto de Exibir as permisses concedidas a um conjunto ou os grupos de
Mdulos (Assembly) cdigos que conceder permisses a um conjunto.
Confiar assembly Atribuir um nvel de confiana a um conjunto.
Criar um pacote de Criar e implantar a diretiva de segurana em uma rede.
implantao

Para executar essas tarefas com base em segurana


1. Execute a ferramenta .NET Framework Configuration (Mscorcfg.msc).
1. No Painel de Controle, abra Ferramentas administrativas.
2. Clique duas vezes Microsoft .NET Framework <version> Configuration.
Como alternativa, voc pode executar a ferramenta em um prompt de comando:
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.
o Do Prompt de comando SDK no incio .NET Framework 2.0, e tipo mscorcfg.msc.
2. No painel esquerdo, clique com o boto direito do mouse no Runtime Security Policy n.
3. Escolha a tarefa que deseja executar a partir do menu.

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. Substituir o Activate, Deactivate., e CanBePooled mtodos de classe


System.EnterpriseServices.ServicedComponent
3. 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. Registrar o conjunto que contm a classe com o catlogo COM +.


5. 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. Abra a ferramenta administrativa Servios de componente.


2. Clique com boto direito na ferramenta administrativa Servios de componente, mouse no
componente que voc deseja configurar, e, em seguida, clique em Properties.
3. 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.
4. Se voc desejar alterar a seqncia de construo do padro especificado com o atributo
ConstructionEnabled, na caixa Constructor string, insira a seqncia de construo.
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. Clique no Start boto, aponte para Administrative Tools, e clique em Microsoft .NET
Framework Configuration
2. 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-63A6-
462A-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 Descrio
.assembly extern Especifica outro conjunto que contm itens referenciados pelo mdulo
<assembly name> atual (, neste exemplo, mscorlib).
.publickeytoken <token> Especifica o smbolo da chave real da montagem referenciada.
.ver <version number> Especifica o nmero de verso da montagem referenciada.
.assembly <assembly Especifica o nome do conjunto.
name>
.hash algorithm <int32 Especifica o algoritmo hash usado.
value>
.ver <version number> Especifica o nmero de verso do conjunto.
.module <file name> Especifica o nome dos mdulos que compem o conjunto. Neste
exemplo, o conjunto consiste em apenas um arquivo.
.subsystem <value> Especifica o ambiente do aplicativo necessrio para o programa. Neste
exemplo, o valor 3 indica que este executvel executado de um
console.
corflags Atualmente um campo reservado nos metadados.

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.ECMA-
International.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. Compilar todos os outros mdulos, usando as opes do compilador necessrio para
indicar os outros mdulos que so referenciados no cdigo.
3. 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.
2. No nvel do conjunto, aplicar os seguintes atributos:

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.
2. GuidAttribute Para especificar o identificador de biblioteca (LIBID) da biblioteca de
tipos de destino.
3. 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.

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.
2. Do ComSourceInterfacesAttribute aplicar se conectar a interface do coletor de eventos a
classe gerenciada.
3. 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.
4. Implementar a interface do coletor de eventos em COM.
5. 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.
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-3371-
48dc-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:
o 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.
o Definir um espao para nome de destino para os tipos em uma biblioteca com
explicitamente.
2. Compilar o cdigo fonte IDL.
3. 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.
Para modificar um conjunto importados
1. Importe o arquivo de biblioteca tipo. Do Importador da biblioteca Tipo (TLBIMP.exe) uso
para gerar um conjunto DLL.
2. Criar um arquivo de texto do conjunto importado usando o Disassembler MSIL
(Ildasm.exe).
3. Aplicar Atributos de interoperabilidade ao arquivo de texto.
4. Gerar um novo conjunto do arquivo de texto modificada usando o Assembler MSIL
(Ilasm.exe).

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. Usando um editor XML, criar (ou modificar) manifesto de aplicativo pertencentes ao
aplicativo do COM que interoperar com um ou mais componentes gerenciados.
2. Insira o cabealho padro a seguir no incio do arquivo:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-
microsoft-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:schemas-
microsoft-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:schemas-
microsoft-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. Usando um editor XML, criar um manifesto componente para descrever o conjunto


gerenciado.
2. Insira o cabealho padro a seguir no incio do arquivo:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-
microsoft-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:schemas-
microsoft-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 Descrio Required


Clsid O identificador que especifica a classe para ser ativado. Sim
description Seqncia que informe ao usurio sobre o componente. Uma No
seqncia vazia o padro.
name Uma seqncia de caracteres que representa a classe gerenciada. Sim
ProgID O identificador a ser usado para ativao vinculados as. No
threadingModel O modelo de segmentao com. "Both" o valor padro. No
runtimeVersion Este atributo ignorado. Se o Runtime no est carregado, a No
verso mais recente ser carregada antes da classe ativado.
Caso contrrio, a verso atualmente carregado usada.
tlbid O identificador da biblioteca de tipos que contm informaes sobre No
a classe tipo.

5. 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).
6. O manifesto componente a seguir identifica uma classe nica com dois mtodos.
7. <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-
microsoft-com: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-ABD3-45B6825F9732}" progid="myManagedComp.testClass2"
threadingModel="Both" name="myManagedComp.testClass2" runtimeVersion="v1.0.3705">
</clrClass> <file name="MyManagedComp.dll"> </file> </assembly>

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.
4. 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

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 Exceo .NET
MSEE_E_APPDOMAINUNLOADED AppDomainUnloadedException
COR_E_APPLICATION ApplicationException
COR_E_ARGUMENT ou E_INVALIDARG ArgumentException
COR_E_ARGUMENTOUTOFRANGE ArgumentOutOfRangeException
COR_E_ARITHMETIC ou ArithmeticException
ERROR_ARITHMETIC_OVERFLOW
COR_E_ARRAYTYPEMISMATCH ArrayTypeMismatchException
COR_E_BADIMAGEFORMAT ou BadImageFormatException
ERROR_BAD_FORMAT
COR_E_COMEMULATE_ERROR COMEmulateException
COR_E_CONTEXTMARSHAL ContextMarshalException
COR_E_CORE CoreException
NTE_FAIL CryptographicException
COR_E_DIRECTORYNOTFOUND ou DirectoryNotFoundException
ERROR_PATH_NOT_FOUND
COR_E_DIVIDEBYZERO DivideByZeroException
COR_E_DUPLICATEWAITOBJECT DuplicateWaitObjectException
COR_E_ENDOFSTREAM EndOfStreamException
COR_E_TYPELOAD EntryPointNotFoundException
COR_E_EXCEPTION Exceo
COR_E_EXECUTIONENGINE ExecutionEngineException
COR_E_FIELDACCESS FieldAccessException
COR_E_FILENOTFOUND ou FileNotFoundException
ERROR_FILE_NOT_FOUND
COR_E_FORMAT FormatException
COR_E_INDEXOUTOFRANGE IndexOutOfRangeException
COR_E_INVALIDCAST ou E_NOINTERFACE InvalidCastException
COR_E_INVALIDCOMOBJECT InvalidComObjectException
COR_E_INVALIDFILTERCRITERIA InvalidFilterCriteriaException
COR_E_INVALIDOLEVARIANTTYPE InvalidOleVariantTypeException
COR_E_INVALIDOPERATION InvalidOperationException
COR_E_IO IOException
COR_E_MEMBERACCESS AccessException
COR_E_METHODACCESS MethodAccessException

Visual C# Consolidado 676


COR_E_MISSINGFIELD MissingFieldException
COR_E_MISSINGMANIFESTRESOURCE MissingManifestResourceException
COR_E_MISSINGMEMBER MissingMemberException
COR_E_MISSINGMETHOD MissingMethodException
COR_E_MULTICASTNOTSUPPORTED MulticastNotSupportedException
COR_E_NOTFINITENUMBER NotFiniteNumberException
E_NOTIMPL NotImplementedException
COR_E_NOTSUPPORTED NotSupportedException
OrE_POINTER COR_E_NULLREFERENCE NullReferenceException
COR_E_OUTOFMEMORY ou OutOfMemoryException
E_OUTOFMEMORY
COR_E_OVERFLOW OverflowException
COR_E_PATHTOOLONG ou PathTooLongException
ERROR_FILENAME_EXCED_RANGE
COR_E_RANK RankException
COR_E_REFLECTIONTYPELOAD ReflectionTypeLoadException
COR_E_REMOTING RemotingException
COR_E_SAFEARRAYTYPEMISMATCH SafeArrayTypeMismatchException
COR_E_SECURITY SecurityException
COR_E_SERIALIZATION SerializationException
OrERROR_STACK_OVERFLOW StackOverflowException
COR_E_STACKOVERFLOW
COR_E_SYNCHRONIZATIONLOCK SynchronizationLockException
COR_E_SYSTEM SystemException
COR_E_TARGET TargetException
COR_E_TARGETINVOCATION TargetInvocationException
COR_E_TARGETPARAMCOUNT TargetParameterCountException
COR_E_THREADABORTED ThreadAbortException
COR_E_THREADINTERRUPTED ThreadInterruptedException
COR_E_THREADSTATE ThreadStateException
COR_E_THREADSTOP ThreadStopException
COR_E_TYPELOAD TypeLoadException
COR_E_TYPEINITIALIZATION TypeInitializationException
COR_E_VERIFICATION VerificationException
COR_E_WEAKREFERENCE WeakReferenceException

Visual C# Consolidado 677


COR_E_VTABLECALLSNOTSUPPORTED VTableCallsNotSupportedException
Todos os outros HRESULTs 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 Fonte de informaes de com


ErrorCode HRESULT retornado da chamada.
HelpLink 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.
InnerException Sempre uma referncia nula (Nothing no Visual Basic.)
Message Seqncia de caracteres retornada de IErrorInfo->GetDescription.
(Mensagem)
Origem Seqncia de caracteres retornada de IErrorInfo->GetSource.
StackTrace O rastreamento da pilha.
TargetSite O nome do mtodo que retornados a falha HRESULT.

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. Editar o MSIL conforme necessrio.
4. 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. Instale o arquivo exe ou dll com em seu computador, a menos que um instalar.exe do
Windows executa a instalao para voc.
2. No menu Project, selecione References.
3. Selecione a COM guia.
4. Selecionar a biblioteca de tipos na lista Available References, ou procure o arquivo TLB.
5. 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. Voc pode usar um navegador de metadados, como para identificar eventos
representantes. o Disassembler MSIL (Ildasm.exe),
4. 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. Declarar os tipos em um idioma que seja compatvel o com comum especificao (cls)
idioma e compilar o arquivo.
2. 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.
Para criar um invlucro Callable Runtime (RCW)
1. 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.
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#.
3. Quando as declaraes estiverem concludas, compile o arquivo como voc compila
qualquer outro cdigo de fonte gerenciado.
4. 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:.
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-9849-
90790DA6431E), 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("40A8C65D-
2448-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-9849-
90790DA6431E")] [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. Construir usando um XmlSerializer para desserializar o tipo de objeto.
2. 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. Abra um prompt de comando.
2. 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. Compilar a Classe ou Classes em uma DLL.


2. Abra um prompt de comando.
3. 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. Criar uma instncia da classe XmlElementAttribute.
2. Definir para " BookID ". da ElementName a XmlElementAttribute
3. Criar uma instncia da classe XmlAttributes.
4. Adicione o XmlElementAttribute objeto para a coleo acessada atravs da XmlElements
propriedade do XmlAttributes.
5. Criar uma instncia da classe XmlAttributeOverrides.
6. Adicionar para o XmlAttributeOverrides, passando o tipo de objeto para substituir e o nome
do membro seja substitudo. o XmlAttributes
7. Criar uma instncia da classe XmlSerializer com XmlAttributeOverrides.
8. Cria uma instncia da classe Book, e serializado ou desserializar-lo.
Exemplo
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"

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. Criar a classe usando o Ferramenta de definio do esquema XML (XSD.exe).
2. Aplicar um ou mais dos atributos especial encontrado no System.Xml.Serialization.
Consulte a lista em " atributos que serializao SOAP Encoded Controle. "
3. 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. Chamar ou Deserialize Mtodo. o Serialize


Exemplo
C#
// 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. Um conjunto de trabalho grande devido a buffer pelo mecanismo de serializao


(memria).
2. 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. No computador servidor, o mtodo Web deve desativar o buffer ASP.NET e retornar um
tipo que implementa IXmlSerializable.
2. O tipo que implementa IXmlSerializable chunks os dados no mtodo WriteXml.
Para implementar o processamento do lado do cliente
1. 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
2. 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.
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. Crie o objeto e defina suas propriedades e campos pblica.
2. Construir usando um XmlSerializer o tipo de objeto. Para obter mais informaes, consulte
os XmlSerializer construtores de classe.
3. 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. Criar uma instncia da classe XmlSerializerNamespaces.
2. Adicionar todos os prefixos e pares espao para nome para o XmlSerializerNamespaces.
3. 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. Defina a Namespace propriedade de cada atributo como um dos valores de espao para
nome a XmlSerializerNamespaces.
5. 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. Criar uma instncia da classe SoapAttributeOverrides.
2. Criar para cada membro da classe que est sendo serializado. um SoapAttributes
3. 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 ".
4. Defina a propriedade de SoapAttributes apropriado para o atributo criado na etapa 3.
5. Adicionar SoapAttributes a SoapAttributeOverrides.
6. Criar um XmlTypeMapping usando o SoapAttributeOverrides. Use o
SoapReflectionImporter.ImportTypeMapping mtodo.
7. Criar um XmlSerializer usando XmlTypeMapping.
8. Serializado ou desserializar o objeto.
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. Modificar as propriedades do objeto CultureAndRegionInfoBuilder para satisfazer os
requisitos de seu aplicativo.
3. Chame o Register mtodo para registrar a cultura personalizado. O processo de registro
executa essas tarefas:
o Cria um arquivo.nlp que contm as informaes definido no objeto
CultureAndRegionInfoBuilder.
o 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.
o 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.
7. 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.
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 non-
nullable 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 armazen-
lo 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 Reflection-


1. 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. Se o conjunto possui dependncias, o ReflectionOnlyLoad mtodo no carregar-los.


Caso voc precise examin-los, voc deve carreg-los voc mesmo,.
3. Determinar se um conjunto carregado do contexto somente Reflection-usando
propriedade do conjunto ReflectionOnly.
4. 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 Design-
time 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.
2. Como uma tcnica de otimizao, adicionar um campo particular do tipo
DesignerActionListCollection.
C#
private DesignerActionListCollection actionLists;

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. Derivar de SoapExtensionAttribute uma classe.


2. 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.
3. Aplicar o atributo personalizado a cada mtodo de servio da Web desejado seja
executado com a extenso SOAP.

Para configurar uma extenso SOAP em um arquivo de configurao

1. Se ele estiver no estiver presente, adicione um soapExtensionTypes elemento XML


para a webServices seo do arquivo apropriado App.config ou Web.config.
2. 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 Tipo: Especifica o tipo da extenso SOAP e montagem ele reside em.
o Prioridade: especifica a prioridade relativa da extenso SOAP dentro de seu grupo.
o 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. Criar um arquivo com um extenso de nome de arquivo.asmx e declarar um servio da


Web dentro dela usando uma diretiva @WebService
2. Criar uma classe que implementa o servio da Web. A classe opcionalmente pode derivar
a partir da WebService classe.
3. Opcionalmente, aplicar o WebServiceAttribute atributo a classe implementar o servio da
Web.
4. 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. Adicionar mtodos pblicos para a classe que implementar o servio da Web.


2. 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. Arraste o List controle de ou Panel controle em uma pgina mvel formulrios da Web
ASP.NET. para a Toolbox uma Form
2. Selecione o controle, e no menu de atalho, escolha Templating Options. A Templating
Options caixa de dilogo ser exibida.
3. 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.
4. 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. Clique no New Device Filter boto.
2. Digite o nome para o novo filtro; por exemplo, SmallDevice.
3. Defina a Tipo opo.
4. 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.
5. 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.
6. Clique OK para salvar os filtros do dispositivo no arquivo de configurao do
aplicativo e fechar a Device Filter Editor caixa de dilogo.
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. Clique no Add to List boto. O filtro dispositivo selecionado agora parte da lista Applied
Device Filters e pode ser usado para criar modelos.
7. 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.
8. 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.

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. Use a Applied Device Filters lista para selecionar o filtro do dispositivo que voc deseja
usar para editar os modelos.
2. 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.
2. 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
3. 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
2. 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.
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:
o Type in a string of characters that you want to use for an item separator; for
example, hyphens (----------).
o 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.
5. Quando voc tiver terminado, selecione End Template Editing no menu de atalho.

Para aplicar propriedade substitui para um filtro dispositivo especfico

1. Na caixa Property Overrides de dilogo, o Applied Device Filter posicionamento em-


Para Baixo lista, clique no filtro do dispositivo que voc deseja aplicar; por exemplo,
isHTML32.
2. 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.

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. Definir o XML para adicionar ao descrio do servio.


2. Criar uma classe SDFE por derivar a partir da ServiceDescriptionFormatExtension classe.
3. Escrever cdigo para estender o processo de gerao descrio do servio.
4. Gravar cdigo para estender o proxy classe processo gerao.
5. 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 Corresponde ao elemento types delimitados pelo elemento raiz definitions.

Binding Corresponde ao elemento binding delimitados pelo elemento raiz


definitions.

OperationBinding Corresponde ao elemento operation delimitados pelo binding elemento.

InputBinding Corresponde ao elemento input delimitados pelo operation elemento.

OutputBinding Corresponde ao elemento output delimitados pelo operation elemento.

FaultBinding Corresponde ao elemento fault delimitados pelo operation elemento.

Port Corresponde ao elemento port delimitados pelo service elemento.

Operation Corresponde ao elemento operation delimitados pelo portType elemento.

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. Abra um .NET Framework Prompt de comando SDK, e altere para o diretrio em que voc
ir armazenar os ClickOnce arquivos.
2. Crie uma subpasta chamada bin e coloque todos os seus arquivos do aplicativo Incluindo
arquivos executveis, conjuntos, recursos, e arquivos de dados aqui,
3. 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. Mover o diretrio \bin para a pasta que voc criou etapa 2.


5. 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. Abra um .NET Framework Prompt de comando SDK, e navegue para a pasta em que voc
ir armazenar os ClickOnce arquivos.
2. Crie uma subpasta chamada bin e coloque todos os seus arquivos do aplicativo Incluindo
arquivos executveis, conjuntos, recursos, e arquivos de dados aqui.
3. 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. Criar um novo manifesto de aplicativo, New selecionando File, Application Manifest. a


partir do menu
6. Na guia Padro Name, digite o nmero dessa Implantao nome e verso.
7. Selecione a Files guia e clique no Browse... boto prximo caixa de texto Diretrio
aplicativo.
8. 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.
9. 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.
Ou-
Se 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.
Ou-
Se 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 armazene-
no 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. Abra o .NET Framework Prompt de comando SDK.


2. Ao usar o Bloco de Notas ou outro editor de texto, definir uma classe chamada
DynamicClass com uma nica propriedade chamada Message.
1. Salvar o texto como um arquivo denominado ClickOnceOnDemand.cs ou
ClickOnceOnDemand.vb, dependendo do idioma voc usar.

Visual C# Consolidado 739


2. Compile o arquivo em um conjunto. csc /target:library ClickOnceOnDemand.csvbc
/target:library ClickOnceOnDemand.vb
3. 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.
1. 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
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. Crie seu ClickOnce manifestos conforme descrito em Passo-a-passo: Implantando um


aplicativo ClickOnce manualmente. Nome seu aplicativo ClickOnceOnDemand.
2. Antes de fechar MageUI.exe, selecione a guia contendo a implantao na manifesto de
aplicativo, e selecione a Files guia dentro desse guia.
3. 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. Carregar sua ClickOnce implantao em um servidor Web.


2. 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.
2. 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

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 anex-
los 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. 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

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. Substituir o Activate, Deactivate., e CanBePooled mtodos de classe


System.EnterpriseServices.ServicedComponent
3. 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; } }

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. 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

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. Registrar o conjunto que contm a classe com o catlogo COM +.


5. 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. Abra a ferramenta administrativa Servios de componente.


2. Clique com boto direito na ferramenta administrativa Servios de componente, mouse no
componente que voc deseja configurar, e, em seguida, clique em Properties.
3. 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.
4. Se voc desejar alterar a seqncia de construo do padro especificado com o atributo
ConstructionEnabled, na caixa Constructor string, insira a seqncia de construo.
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. Clique no Start boto, aponte para Administrative Tools, e clique em Microsoft .NET
Framework Configuration
2. 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-63A6-
462A-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 Descrio
.assembly extern Especifica outro conjunto que contm itens referenciados pelo mdulo
<assembly name> atual (, neste exemplo, mscorlib).
.publickeytoken <token> Especifica o smbolo da chave real da montagem referenciada.
.ver <version number> Especifica o nmero de verso da montagem referenciada.
.assembly <assembly Especifica o nome do conjunto.
name>
.hash algorithm <int32 Especifica o algoritmo hash usado.
value>
.ver <version number> Especifica o nmero de verso do conjunto.

Visual C# Consolidado 761


.module <file name> Especifica o nome dos mdulos que compem o conjunto. Neste
exemplo, o conjunto consiste em apenas um arquivo.
.subsystem <value> Especifica o ambiente do aplicativo necessrio para o programa. Neste
exemplo, o valor 3 indica que este executvel executado de um
console.
corflags Atualmente um campo reservado nos metadados.

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.ECMA-
International.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.
2. Compilar todos os outros mdulos, usando as opes do compilador necessrio para
indicar os outros mdulos que so referenciados no cdigo.
3. 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:

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.
2. No nvel do conjunto, aplicar os seguintes atributos:

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.
2. GuidAttribute Para especificar o identificador de biblioteca (LIBID) da biblioteca de
tipos de destino.
3. 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.

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.
2. Do ComSourceInterfacesAttribute aplicar se conectar a interface do coletor de eventos a
classe gerenciada.
3. 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.
4. Implementar a interface do coletor de eventos em COM.
5. 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.
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-3371-
48dc-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:
o 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.
o Definir um espao para nome de destino para os tipos em uma biblioteca com
explicitamente.
2. Compilar o cdigo fonte IDL.
3. 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.
Para modificar um conjunto importados
1. Importe o arquivo de biblioteca tipo. Do Importador da biblioteca Tipo (TLBIMP.exe) uso
para gerar um conjunto DLL.
2. Criar um arquivo de texto do conjunto importado usando o Disassembler MSIL
(Ildasm.exe).
3. Aplicar Atributos de interoperabilidade ao arquivo de texto.
4. Gerar um novo conjunto do arquivo de texto modificada usando o Assembler MSIL
(Ilasm.exe).

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. Usando um editor XML, criar (ou modificar) manifesto de aplicativo pertencentes ao
aplicativo do COM que interoperar com um ou mais componentes gerenciados.
2. Insira o cabealho padro a seguir no incio do arquivo:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-
microsoft-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:schemas-
microsoft-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:schemas-
microsoft-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. Usando um editor XML, criar um manifesto componente para descrever o conjunto


gerenciado.
2. Insira o cabealho padro a seguir no incio do arquivo:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-
microsoft-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:schemas-
microsoft-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 Descrio Required


Clsid O identificador que especifica a classe para ser ativado. Sim
description Seqncia que informe ao usurio sobre o componente. Uma No
seqncia vazia o padro.
name Uma seqncia de caracteres que representa a classe gerenciada. Sim
ProgID O identificador a ser usado para ativao vinculados as. No
threadingModel O modelo de segmentao com. "Both" o valor padro. No
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 O identificador da biblioteca de tipos que contm informaes sobre No
a classe tipo.

5. 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).
6. O manifesto componente a seguir identifica uma classe nica com dois mtodos.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-
com: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-ABD3-
45B6825F9732}" 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.
4. 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

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 AppDomainUnloadedException
COR_E_APPLICATION ApplicationException
COR_E_ARGUMENT ou E_INVALIDARG ArgumentException
COR_E_ARGUMENTOUTOFRANGE ArgumentOutOfRangeException
COR_E_ARITHMETIC ou ArithmeticException
ERROR_ARITHMETIC_OVERFLOW
COR_E_ARRAYTYPEMISMATCH ArrayTypeMismatchException
COR_E_BADIMAGEFORMAT ou BadImageFormatException
ERROR_BAD_FORMAT
COR_E_COMEMULATE_ERROR COMEmulateException
COR_E_CONTEXTMARSHAL ContextMarshalException
COR_E_CORE CoreException
NTE_FAIL CryptographicException
COR_E_DIRECTORYNOTFOUND ou DirectoryNotFoundException
ERROR_PATH_NOT_FOUND
COR_E_DIVIDEBYZERO DivideByZeroException
COR_E_DUPLICATEWAITOBJECT DuplicateWaitObjectException
COR_E_ENDOFSTREAM EndOfStreamException
COR_E_TYPELOAD EntryPointNotFoundException
COR_E_EXCEPTION Exceo
COR_E_EXECUTIONENGINE ExecutionEngineException
COR_E_FIELDACCESS FieldAccessException
COR_E_FILENOTFOUND ou FileNotFoundException
ERROR_FILE_NOT_FOUND
COR_E_FORMAT FormatException
COR_E_INDEXOUTOFRANGE IndexOutOfRangeException
COR_E_INVALIDCAST ou E_NOINTERFACE InvalidCastException
COR_E_INVALIDCOMOBJECT InvalidComObjectException
COR_E_INVALIDFILTERCRITERIA InvalidFilterCriteriaException
COR_E_INVALIDOLEVARIANTTYPE InvalidOleVariantTypeException
COR_E_INVALIDOPERATION InvalidOperationException
COR_E_IO IOException
COR_E_MEMBERACCESS AccessException
COR_E_METHODACCESS MethodAccessException
COR_E_MISSINGFIELD MissingFieldException
COR_E_MISSINGMANIFESTRESOURCE MissingManifestResourceException
COR_E_MISSINGMEMBER MissingMemberException

Visual C# Consolidado 779


COR_E_MISSINGMETHOD MissingMethodException
COR_E_MULTICASTNOTSUPPORTED MulticastNotSupportedException
COR_E_NOTFINITENUMBER NotFiniteNumberException
E_NOTIMPL NotImplementedException
COR_E_NOTSUPPORTED NotSupportedException
OrE_POINTER COR_E_NULLREFERENCE NullReferenceException
COR_E_OUTOFMEMORY ou OutOfMemoryException
E_OUTOFMEMORY
COR_E_OVERFLOW OverflowException
COR_E_PATHTOOLONG ou PathTooLongException
ERROR_FILENAME_EXCED_RANGE
COR_E_RANK RankException
COR_E_REFLECTIONTYPELOAD ReflectionTypeLoadException
COR_E_REMOTING RemotingException
COR_E_SAFEARRAYTYPEMISMATCH SafeArrayTypeMismatchException
COR_E_SECURITY SecurityException
COR_E_SERIALIZATION SerializationException
OrERROR_STACK_OVERFLOW StackOverflowException
COR_E_STACKOVERFLOW
COR_E_SYNCHRONIZATIONLOCK SynchronizationLockException
COR_E_SYSTEM SystemException
COR_E_TARGET TargetException
COR_E_TARGETINVOCATION TargetInvocationException
COR_E_TARGETPARAMCOUNT TargetParameterCountException
COR_E_THREADABORTED ThreadAbortException
COR_E_THREADINTERRUPTED ThreadInterruptedException
COR_E_THREADSTATE ThreadStateException
COR_E_THREADSTOP ThreadStopException
COR_E_TYPELOAD TypeLoadException
COR_E_TYPEINITIALIZATION TypeInitializationException
COR_E_VERIFICATION VerificationException
COR_E_WEAKREFERENCE WeakReferenceException
COR_E_VTABLECALLSNOTSUPPORTED VTableCallsNotSupportedException
Todos os outros HRESULTs 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 Fonte de informaes de com


ErrorCode HRESULT retornado da chamada.
HelpLink 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.
InnerException Sempre uma referncia nula (Nothing no Visual Basic.)
Message Seqncia de caracteres retornada de IErrorInfo->GetDescription.
(Mensagem)
Origem Seqncia de caracteres retornada de IErrorInfo->GetSource.
StackTrace O rastreamento da pilha.
TargetSite O nome do mtodo que retornados a falha HRESULT.

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. Editar o MSIL conforme necessrio.


4. 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. Instale o arquivo exe ou dll com em seu computador, a menos que um instalar.exe do
Windows executa a instalao para voc.
2. No menu Project, selecione References.
3. Selecione a COM guia.
4. Selecionar a biblioteca de tipos na lista Available References, ou procure o arquivo TLB.
5. 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.
3. Voc pode usar um navegador de metadados, como para identificar eventos
representantes. o Disassembler MSIL (Ildasm.exe),
4. 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. Declarar os tipos em um idioma que seja compatvel o com comum especificao (cls)
idioma e compilar o arquivo.
2. Exportar o conjunto que contm os tipos com o Tipo Exporter da biblioteca (TlbExp.exe).
3. Usar a biblioteca de tipos com exportado como uma base para declarar tipos gerenciados
orientado com.
Para criar um invlucro Callable Runtime (RCW)
1. 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.

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#.
3. Quando as declaraes estiverem concludas, compile o arquivo como voc compila
qualquer outro cdigo de fonte gerenciado.
4. 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:.
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-9849-
90790DA6431E), 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("40A8C65D-
2448-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-9849-
90790DA6431E")] [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.
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

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 drop-
down.

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. Selecione o controle ao qual voc quer se conectar um manipulador de eventos.
2. Na janela Propriedades, clique no Events boto ( ).

3. 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 ( .), boto para a
BackgroundImage propriedade, em Reset seguida clique em

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. Adicione o controle que ser exibida a dica de ferramenta.
2. Use o SetToolTip mtodo do componente ToolTip.
C#
// In this example, button1 is the control to display the ToolTip. toolTip1.SetToolTip(button1, "Save
changes");

Para definir uma dica de ferramenta no designer


1. Adicionar um ToolTip componente para o formulrio.
2. 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. Criar uma instncia do controle a ser adicionado.
2. Definir propriedades do novo controle.
3. 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. Use o Remove mtodo para excluir o controle desejado do painel na Controls coleo.
3. Chamar o Dispose mtodo para verso todos os recursos usado pelo controle.
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(); } }

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. No Visual C#, criar uma nova classe.
3. 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. Voc tambm pode definir uma constante para o caractere, e us-la quando necessrio.
C#
const string quote = "\""; textBox1.Text = "She said, " + quote + "You deserve a treat!"+ quote ;

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.
2. Defina a ScrollBars propriedade como um valor apropriado.

Value
(Valor) Descrio
None 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.
Horizontal Use esse valor se voc deseja exibir uma lista de linhas, alguns dos que podem estar
maior que a largura do controle TextBox.
Both Use esse valor se a lista pode ser maior que a altura do controle.

3. Defina a WordWrap propriedade como um valor apropriado.

Value
(Valor) Descrio
false 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.
(true A barra de rolagem horizontal no ser exibido. Use esse valor se voc escolheu
padro) Vertical barras de rolagem ou None, acima, para exibir um ou mais pargrafos.

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.
2. 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.

3. Escreva cdigo apropriado no manipulador Tick de eventos. O cdigo voc escreve nesse
evento ser executado no intervalo especificado na propriedade Interval.
4. Defina a Enabled propriedade para true Para iniciar o cronmetro. O Tick evento
comear a ocorrer, executar o procedimento no intervalo conjunto.
5. 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. Na janela Properties, clique na Buttons propriedade para selecion-lo e clique no Ellipsis.
( ) boto para abrir o ToolBarButton Collection Editor
3. Uso e Remove botes para adicionar e remover botes do controle ToolBar. o Add
4. 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.
Pushed 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
Style Define o estilo do boto da barra de ferramentas. Deve ser um dos valores na
enumerao ToolBarButtonStyle.
Text A seqncia de texto exibido pelo boto.
ToolTipText O texto que aparece como uma dica de ferramenta para o boto.

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. Em um procedimento, Criar botes da barra de ferramentas, adicionando-os para a
System.Windows.Forms.ToolBar.Buttons coleo.
2. 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. Adicionar imagens para o ImageList Componente. Para obter mais informaes, consulte
Como adicionar ou remover imagens ImageList com o designer:.
2. Selecione o ToolBar controle no formulrio.
3. Na janela Properties, defina a ToolBar propriedade controle ImageList para o
ImageList Componente.
4. A elipse a ToolBar propriedade do controle Buttons para selecion-lo, clique no
ToolBarButton Collection Editor. ( ) boto para abrir

Visual C# Consolidado 803


5. Use o Add boto para adicionar botes para o ToolBar controle.
6. 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. Em um procedimento, instanciar um ImageList componente e um ToolBar controle.
2. No mesmo procedimento, atribuir uma imagem para o ImageList Componente.
3. 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 pr-
compilao 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 pr-
compilao 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 code-
behind 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-a-
passo: 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.
2. A pgina dinamicamente processa a marcao para o navegador, que o usurio v como
uma pgina da Web semelhante a qualquer outra pgina.
3. 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.)
4. 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.
5. No servidor Web, a pgina executa novamente. As informaes que o usurio digitou ou
selecionou esto disponveis para a pgina.
6. A pgina executa o processamento que voc a tiver programado para fazer.
7. A pgina processa ela mesma de volta para o navegador.

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 leitura-
somente 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 C#


classe. XslTransform xslt = new XslTransform(); xslt.Load("output.xsl");
xslt.Transform("books.xml", "books.html");

Cdigo usando a C#
XslCompiledTransform classe. 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 C#
XslTransform classe. XslTransform xslt = new XslTransform(); XmlUrlResolver resolver = new
XmlUrlResolver(); resolver.Credentials =
CredentialCache.DefaultCredentials; xslt.Load("sort.xsl", resolver);

Cdigo usando a C#
XslCompiledTransform XslCompiledTransform xslt = new XslCompiledTransform();
classe. XmlUrlResolver resolver = new XmlUrlResolver(); resolver.Credentials =
CredentialCache.DefaultCredentials; xslt.Load("sort.xsl",
XsltSettings.Default, resolver);

Para usar um parmetro XSLT

Cdigo usando a C#
XslTransform classe. 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 C#
XslCompiledTransform XslCompiledTransform xslt = new XslCompiledTransform();
classe. 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 C#
XslTransform classe. XslTransform xslt = new XslTransform(); xslt.Load("output.xsl");
xslt.Transform("books.xml", "books.html");

Cdigo usando a C#
XslCompiledTransform // Create the XsltSettings object with script enabled. XsltSettings settings
classe. = 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 C#
XslTransform classe. // 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 C#
XslCompiledTransform // Execute the transformation. XslCompiledTransform xslt = new
classe. 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 C#
XslTransform classe. // 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 C#
XslCompiledTransform // Execute the transformation. XslCompiledTransform xslt = new
classe. 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 Funo
XPathNavigator 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.
IXPathNavigable Ele uma interface que fornece um CreateNavigator mtodo para para o
armazenamento. um XPathNavigator
XmlDocument 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.
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.
XPathNodeIterator 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.

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 Tipo de objeto armazenado na coleo ou matriz


Elements XmlSchemaElement
Attributes XmlSchemaAttribute
AttributeGroups XmlSchemaAttributeGroup
Groups XmlSchemaGroup
Includes XmlSchemaExternalXmlSchemaInclude ou XmlSchemaRedefine,
XmlSchemaImport
Items (XmlSchemaObject fornece acesso a todos os elementos nvel globais,
atributos e tipos.)
Notations XmlSchemaNotation
SchemaTypes XmlSchemaType, XmlSchemaSimpleType, XmlSchemaComplexType
UnhandledAttributes (XmlAttribute) fornece acesso a atributos que no pertencem ao
espao para nome do esquema
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.

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.
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.
3. 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.
4. Obtm o Customer elemento usando a XmlSchemaComplexType Classe de tipo
complexo.
5. Se o tipo complexo tem os atributos, obter e grava seu nome para o console. Para
enumerar sobre cada XmlSchemaAttribute um IDictionaryEnumerator
6. Obtm a partcula de seqncia do tipo complexo usando a XmlSchemaSequence classe.
7. Itera por cada XmlSchemaElement na coleo
System.Xml.Schema.XmlSchemaSequence.Items gravar o nome de cada elemento filho
para o console.

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.
3. 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
4. Itera por cada XmlSchemaElement na coleo Values do POST-Schema - coleo de
compilao System.Xml.Schema.XmlSchema.Elements.
5. 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.
6. Adiciona o novo PhoneNumber elemento seqncia contendo o existente FirstName e
LastName elementos usando o Pre-Schema - coleo de compilao Items da seqncia.
7. Finalmente, reprocesses e compila o objeto modificado XmlSchema Usando e grava-para
o console. e Compile mtodos de classe XmlSchemaSet a Reprocess

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.
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.
3. Cria um novo tipo complexo para o FirstName elemento usando a
XmlSchemaComplexType classe.
4. Do XmlSchemaSimpleContent cria uma nova extenso de contedo simples, com um tipo
base de xs:string, usando e XmlSchemaSimpleContentExtension Classes.
5. Cria o novo Title atributo usando a XmlSchemaAttribute classe, COM e adiciona o atributo
extenso de contedo simples. de xs:string um SchemaTypeName
6. 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.
7. Adiciona o novo tipo complexo para o Pre-Schema - coleo de compilao
System.Xml.Schema.XmlSchema.Items.
8. Itera por cada XmlSchemaObject no Pre-Schema - coleo de compilao
System.Xml.Schema.XmlSchema.Items.

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
2. Itera por cada XmlSchemaParticle no Pre-Schema - coleo de compilao
System.Xml.Schema.XmlSchemaSequence.Items.
3. Se que. um elemento, o QualifiedName "FirstName", define do elemento FirstName
para o novo FirstName tipo complexo ao XmlSchemaParticleSchemaTypeName
4. Finalmente, reprocesses e compila o objeto modificado XmlSchema Usando e grava-para
o console. e Compile mtodos de classe XmlSchemaSet a Reprocess

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-schema-
compilation // 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-schema-
compilation // 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.
2. 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.
3. 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.
4. 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
5. 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.

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 Quando se sincronizar um


DataSet 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 cdigo- Preservao do elemento ordenao no


fonte XML no crtica. cdigo-fonte XML essencial.

Espao em branco entre elementos e formatao Espao em branco e formatao


no precise ser preservado no cdigo-fonte XML. 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.
o 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);
o 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);
o 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


Ou-
Se 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. Criar Definir com a permisso correta. um XmlSecureResolver
2. 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. Criar Definir com a permisso correta. um XmlSecureResolver


2. 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 Tipo Clr
xs:anyURI Uri
xs:base64Binary Byte[]
xs:boolean Boolean
xs:byte SByte
xs:date DateTime
xs:dateTime DateTime
xs:decimal Decimal
xs:double Double
xs:duration TimeSpan
xs:ENTITIES String[]

Visual C# Consolidado 861


xs:ENTITY String
xs:float Single
xs:gDay DateTime
xs:gMonthDay DateTime
xs:gYear DateTime
xs:gYearMonth DateTime
xs:hexBinary Byte[]
xs:ID String
xs:IDREF String
xs:IDREFS String[]
xs:int Int32
xs:integer Decimal
xs:language String
xs:long Int64
xs:gMmonth DateTime
xs:Name String
xs:NCName String
xs:negativeInteger Decimal
xs:NMTOKEN String
xs:NMTOKENS String[]
xs:nonNegativeInteger Decimal
xs:nonPositiveInteger Decimal
xs:normalizedString String
xs:NOTATION XmlQualifiedName
xs:positiveInteger Decimal
xs:QName XmlQualifiedName
xs:short Int16
xs:string String
xs:time DateTime
xs:token String
xs:unsignedByte Byte
xs:unsignedInt UInt32
xs:unsignedLong UInt64
xs:unsignedShort UInt16

Visual C# Consolidado 862


xdt:dayTimeDuration TimeSpan
xdt:yearMonthDuration TimeSpan
xdt:untypedAtomic String
xdt:anyAtomicType Object
xs:anySimpleType String
N de documento XPathNavigator
N de elemento XPathNavigator
N de Atributo XPathNavigator
N NameSpace XPathNavigator
N texto XPathNavigator
N comentrio XPathNavigator
N de instruo de processamento 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 on-
line. 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 infra-
estrutura 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. 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.
3. Crie uma instncia do objeto do proxy em seu cdigo cliente onde voc deseja acessar o
XML Web Services.
4. 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. Implantar o servio da Web em um servidor Web. Para obter mais informaes, consulte
Publicao servio XML da Web e implantao.
2. 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 Value (Valor)

servername O nome do servidor no qual o servio da Web foi implantado.

Apppath 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.
Para diretamente teste um mtodo de servio da Web em um navegador usando HTTP-GET
1. Implantar o servio da Web em um servidor Web. Para obter mais informaes, consulte
Publicao servio XML da Web e implantao.
2. 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

Parmetro Value (Valor)

servername O nome do servidor no qual o servio da Web for implantado.

Apppath 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)

Parmetro 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)

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 Value (Valor)

Mtodo POST Se voc desejar para testar seu servio da Web usando HTTP-POST, use
POST.

AO URL para o mtodo de servio da Web. No exemplo anterior, math.asmx o servio


da Web e Subtract o mtodo Servio da Web.

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 O nome do parmetro mtodo Servio da Web. Adicionar quantos controles de


='num1' 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.

Tipo = Adicionar um boto Enviar para voc pode enviar os dados de volta para o mtodo
enviar servio Web.

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.
4. 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>

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 Valor

servername O servidor no qual o XML Web Service est instalado.

projectname 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 Valor

servername O servidor no qual o XML Web Service est instalado.

projectname 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 Valor

servername O servidor no qual o XML Web Service est instalado

projectname 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.

parametername Os nomes dos parmetros do mtodo da Web.

Valor Os valores codificados da URL de cada um dos parmetros do mtodo da


Web.

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. No menu File, aponte para New, e clique Web Site.
2. Na caixa de dilogo New Web Site, selecione o cone ASP.NET Web Service.
3. 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 "
4. Clique OK para criar o projeto.

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. 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.
2. 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. Adicione uma referncia para System.EnterpriseServices.dll. Para obter mais
informaes, consulte Adicionando e removendo referncias.
2. 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 Descrio

Com o Este mtodo inicia o navegador padro e carrega a pgina inicial especificada.
depurador 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.

Sem o Esse mtodo possibilita que voc possa executar seu cdigo como ele normalmente
depurador 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.

Exibir no Este mtodo compila o projeto e abre uma pgina da Web escolhida no Solution
navegador Explorer. O Visual Studio compila e executa o projeto em um navegador padro
dentro do Visual Studio.

Compilar e executar um XML Web Service com o depurador


1. 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.
2. No menu Debug, clique em Start.
Este comando instrui o Visual Studio a executar o XML Web Service no depurador.
3. Para interromper a execuo do formulrio e retornar ao Code Editor, feche o navegador,
ou clique em Stop Debugging no menuDebug.
Compilar e executar um XML Web Service sem o depurador
1. 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.
2. 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.
Compilar e executar um XML Web Service usando a opo View in Browser
1. 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.

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. No Solution Explorer, selecione o projeto que voc deseja copiar.


2. No menu Website, clique em Copy Web Site.

Visual C# Consolidado 886


3. Clique no cone ao lado da caixa suspensa Connect to: para abrir a caixa de dilogo
Open Web Site.
4. Na caixa Open Web Site, selecione a localidade para a qual voc deseja copiar o projeto.
5. Usando os cones de seta, selecione arquivos do site da Web de origem para copi-los
para o site da Web remoto.
6. 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. Criar um aplicativo de console.
3. 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. 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.
5. 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. Clique com o boto direito do mouse no n soluo no Solution Explorer e clique em


Add, em seguida clique em New Project.
2. Na caixa de dilogo Add New Project, no n Visual Basic, selecione Class Library.
3. Nomeie o projeto InstallerClassLibrary.

Para adicionar e implementar uma classe Installer

1. Clique com o boto direito do mouse no n de projeto InstallerClassLibrary no Solution


Explorer, e em seguida, clique em Add, e depois Class.
2. 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. Clique duas vezes no designer para abrir o editor de cdigos.
4. 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. No Solution Explorer, clique duas vezes no arquivo Web.config para abr-lo.
6. 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.
7. 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.

Para adicionar um projeto de instalao da Web

1. Clique com o boto direito do mouse no n soluo em Solution Explorer e clique em


Add, em seguida clique em New Project.
2. 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. Na janela Properties, selecione Propriedade ProductName e defina-a para o nome do seu
aplicativo da Web.
4. No File System Editor, marque Web Application Folder.
5. No menu Action, aponte para Add, e clique em Project Output.
6. 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. No Solution Explorer, selecione o projeto WebAppSetup.


2. No menu View, clique em Editor, e depois em Custom Actions.
O Custom Actions Editor abre.
3. No Custom Actions Editor, selecione o n Install.
4. No menu Action, escolha Add Custom Action.
5. Clique duas vezes no Web Application Folder, e selecione Primary output from
InstallerClassLibrary (Active).
6. Na janela Properties, verifique se a propriedade InstallerClass est definida como True.
7. 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. No Solution Explorer, selecione o projeto a instalao.


2. No menu View, aponte para Editor, e em seguida, clique em User Interface.
3. No User Interface Editor, selecione o n Start em Install.
4. No menu Action, escolha Add Dialog.
5. Na caixa de dilogo Add Dialog, escolha a caixa de dilogo Textboxes (A) e clique em
OK.
6. No menu Action, escolha Move Up, e repita at o dilogo Textboxes (A) estar localizado
acima do dilogo Installation Address.
7. Na janela Properties, defina as seguintes propriedades:

Propriedade Valor

BannerText Digite o nome do servidor e o nome do servio

Edit1Label Nome do servidor:

Edit1Value LocalHost

Observao

Isso especifica um servidor padro. Voc pode inserir seu prprio nome de
servidor padro aqui.

Visual C# Consolidado 894


Edit2Label Nome do servio:

Edit2Value <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. No Solution Explorer, selecione o projeto a instalao.


2. 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.
2. Copie o arquivo .msi e todos os outros arquivos e subpastas no diretrio para o
computador do servidor Web.
3. No computador do servidor Web, clique duas vezes no arquivo Setup.exe para executar o
instalador.

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 Descrio

Windows-Basic 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, mal-
intencionado 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


Windows- Usa NTLM ou Kerberos. Usa uma troca criptogrfica com navegador da Web
Integrada do Microsoft Internet Explorer do usurio.
Windows

Windows- Usar para identificao dos clientes na Internet e intranet seguras cenrios.
certificados de Requer cada cliente para obter um certificado de um autoridade de
cliente certificao mutuamente confivel. Certificados opcionalmente so mapeados
para contas de usurio, que so usadas pelo IIS para autorizar acesso ao
servio da Web.

Formulrios 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.

SOAP cabealhos til para cenrios de Internet seguros e no seguras. Credenciais de usurio
personalizados 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.

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. No Windows, abra o Internet Explorer.
2. Navegue at a seguinte URL:
http://www.microsoft.com/downloads/details.aspx?familyid=c6661372-8dbe-422b-8676-
c632d66c529c&displaylang=en(Access 2000 Tutorial: Northwind Traders Sample Database)
3. Clique no boto Download.
4. Na caixa File Download, escolha Save This File Now e clique em OK.
5. Depois de descarregar o arquivo, clique duas vezes no arquivo Nwind.exe para instalar o
banco de dados.
Para instalar os bancos de dados de exemplo Northwind e Pubs para o SQL Server
1. No Windows, abra o Internet Explorer.
2. Navegue at a seguinte URL:
http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46a0-8da2-
eebc53a68034&amp;DisplayLang=en (Northwind and Pubs Sample Databases)
3. Clique no boto Download.
4. Na caixa File Download, escolha Save This File Now e clique em OK.
5. Depois de descarregar o arquivo, clique duas vezes no arquivo Nwind.exe para instalar o
banco de dados.
Para instalar os bancos de dados de exemplo Adventure Works para o SQL Server 2000
1. No Windows, abra o Internet Explorer.
2. Navegue at a seguinte URL:
http://www.microsoft.com/downloads/details.aspx?familyid=487C9C23-2356-436E-94A8-
2BFB66F0ABDC&amp;displaylang=en (Adventure Works Cycles Database 2000)
3. Clique no boto Download.
4. Na caixa File Download, escolha Save This File Now e clique em OK.
Visual C# Consolidado 900
5. Depois de descarregar o arquivo, clique duas vezes no arquivo Nwind.exe para instalar o
banco de dados.
Para baixar e instalar o SQL Server Express
1. No Windows, abra o Internet Explorer.
2. Navegue at a seguinte URL: http://www.microsoft.com/downloads (Microsoft Download
Center)
3. No campo Keywords, digite SQL Server Express.
4. Clique em Go.
5. Na pgina de resultados, siga o link para a pgina de download do SQL Server Express e
siga as instrues.
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. No menu File, criar um novo projeto.


2. Selecione Windows Application e nomeie com DataWalkthrough. Para obter mais
informaes, consulte Creating Windows-based Applications.
3. 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. No menu Data, clique em Show Data Sources.


2. Na janela Data Sources, clique em Add New Data Source para iniciar o assistente Data
Source Configuration.
3. Selecione Database na pgina Choose a Data Source Type, e clique Next.
4. Na pgina Choose your Data Connection siga um destes procedimentos:
o Se uma conexo de dados para o banco de dados de exemplo Northwind estiver
disponvel na lista suspensa, selecione-a.
Ou-
o Selecione New Connection para iniciar a caixa Add/Modify Connection. Para
obter mais informaes, consulte Add/Modify Connection Dialog Box (General).
5. Se seu banco de dados exigir uma senha, selecione a opo para incluir dados
confidenciais, e clique Next.
6. Clique Next na pgina Save connection string to the Application Configuration file.
7. Expanda o n Tables na pgina Choose your Database Objects.
8. 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

Para criar os controles para exibir os dados do cliente (registros pai)

1. Na janela Data Sources, selecione a tabela Customers, e clique na seta suspensa.


2. Selecione Details na lista de controle da tabela Customer.
3. 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. Pressione F5.
2. 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 Conexes so criadas dentro do TableAdapter Configuration
Configurao para o Wizard. Para obter mais informaes, consulte Como: Criar
TableAdapter. TableAdapters.

Execuo do Assistente de Conexes so criadas dentro do TableAdapter Query


configurao da consulta Configuration Wizard. Para obter mais informaes, consulte
TableAdapter. Como: Criar Consultas TableAdapter:.

Arraste de itens da Janela de Objetos de conexo so criados quando voc arrasta itens da
fontes de dados para um janela Data Sources para o Windows Forms Designer ou para o
formulrio ou o Component Component Designer. Para obter mais informaes, consulte
Designer 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. No menu File, crie um novo projeto.


2. 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. No menu Data, clique em Show Data Sources.


2. Na janela Data Sources, selecione Add New Data Source.

Visual C# Consolidado 908


3. Clique em Next na pgina bem-vindo Data Source Configuration Wizard.
4. Selecione Database na pgina Choose a Data Source Type.
5. Na pgina Choose your Data Connection, siga um destes procedimentos:
o Se uma conexo de dados para o banco de dados de exemplo Northwind estiver
disponvel na lista suspensa, selecione-a.
-ou-
o Selecione 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.
6. Se seu banco de dados exigir uma senha, selecione a opo para incluir dados
confidenciais (include sensitive data), e clique em Next.
7. Clique em Next na pgina Save connection string to the Application Configuration file.
8. Expanda o n Tables na pgina Choose your Database Objects.
9. 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.

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).
3. Clique em OK.
4. Clique em Next na pgina Save connection string to the Application Configuration file.
5. Expanda o n Tables na pgina Choose your Database Objects.
6. Selecione as tabelas Customers e Orders, e clique em Finish.
7. 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.

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. No menu File, crie um novo projeto.


2. 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. No menu Data, clique em Show Data Sources.


2. Na janela Data Sources, selecione Add New Data Source.
3. Clique em Next na pgina bem-vindo Data Source Configuration Wizard.
4. Selecione Web Service na pgina Choose a Data Source Type.
5. Digite http://api.google.com/GoogleSearch.wsdl na caixa URL da caixa de dilogo Add
Web Reference.
6. Clique em Go.
7. 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.
8. Clique em Finish.
9. 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.

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. No menu File, crie um novo projeto.


2. 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. No menu Data, clique em Show Data Sources.


2. Na janela Data Sources, clique em Add New Data Source.
3. Selecione Database na pgina Choose a Data Source Type.
4. 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. Na caixa de dilogo Choose Data Source, selecione Microsoft Access Database File.
6. 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.
7. Clique em Next.
8. Clique Next na pgina Save connection string to the Application Configuration file.
9. Expanda o n Tables na pgina Choose your Database Objects.

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. No menu Data, clique Add New Data Source para iniciar o Data Source Configuration
Wizard.
2. Selecione Database na pgina Choose a Data Source Type.
3. 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. No menu Project, clique em Add New Item.


2. Selecione DataSet na caixa de dilogo Add New Item.
3. Digite um nome para o DataSet.
4. 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:.
-ou-
Arraste 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. No menu File, crie um novo projeto.


2. Escolha uma linguagem de programao no painel Project Types.
3. Clique em Windows Application no painel Templates.
4. 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. No menu Project, clique em Add New Item.
A caixa de dilogo Add New Item aparece.
2. Na caixa Templates da caixa de dilogo Add New Item, clique em DataSet.
3. 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. No menu View, clique em Server Explorer.


2. No Server Explorer, clique no boto Connect to Database.
3. 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. Para informaes sobre como criar uma conexo com o SQL Server, consulte Como: Criar
conexes com bancos de dados SQL Server.
5. 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. Expanda a conexo de dados que voc criou no Server Explorer, e em seguida, expanda
o n Tables.
2. 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. No menu File, crie um novo projeto.


2. Escolha uma linguagem de programao no painel Project Types.
3. Clique em Windows Application no painel Templates.
4. 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. No menu Project, clique em Add New Item.


A caixa de dilogo Add New Item Dialog Box aparece.
2. Na caixa Templates, selecione DataSet.
3. 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. Clique com o boto direito do mouse na tabela Music. Aponte para Add, e clique Column.
2. Nome da coluna SongID.
3. Na janela Properties, defina a propriedade DataType como System.Int16.
4. 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 Consulte

Criar um formulrio para entrada Passo-a-passo: Exibindo dados em um formulrio em um


de dados aplicativo do Windows.

Adicionar dados tabela Adding Data to a Table.

Visualizar dados em uma tabela Viewing Data in a Table.

Editar dados 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. No menu File, crie um novo projeto.


2. Selecione uma linguagem de programao no painel Project Types e crie um Windows
Application (Aplicativo do Windows).
3. 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. Do menu Project, escolha Add New Item.


A Add New Item Dialog Box aparece.
2. Da rea Templates selecione DataSet.
3. 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. Arraste um DataTable da guia DataSet da Toolbox para o Dataset Designer.


Uma tabela denominada DataTable1 adicionada ao dataset.
2. Clique na barra de ttulo de DataTable1 e renomei-a como Customers.
3. Arraste um segundo DataTable da guia DataSet da Toolbox para o Dataset Designer.
Uma tabela denominada DataTable1 adicionada ao dataset.
4. Clique na barra de ttulo de DataTable1 e renomei-a como Orders.
Adicionando colunas tabela de dados Customers

Para adicionar colunas tabela Customers

1. Clique com o boto direito do mouse na tabela Customers.


2. Aponte para Add e depois clique em Column.
3. Nomeie a coluna como CustomerID.
4. Na janela Properties, defina a propriedade DataType como Int16.
5. Repita este processo para adicionar as seguintes colunas:

Coluna Propriedade DataType

CompanyName String

Contact String

ContactTitle String

Adicionando colunas tabela de dados Orders

Para adicionar colunas tabela Orders

1. Clique com o boto direito do mouse na tabela Orders.


2. Aponte para Add e depois clique em Column.
3. Nomeie a coluna como OrderID.
4. Na janela Properties, defina a propriedade DataType como Int16.
5. Repita este processo para adicionar as seguintes colunas:

Coluna Propriedade DataType

CustomerID Int16

OrderDate DateTime

ShippedDate 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. Clique na tabela Customers para selecion-la.


2. 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. Clique na tabela Orders para selecion-la.


2. 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. Arraste um objeto Relation da guia DataSet da Toolbox para a tabela Orders.


A Caixa de dilogo Relation abre.
2. Na caixa Parent Table, selecione Customers.
3. Na caixa Child Table, selecione Orders.
4. Na caixa Columns, designe Key Columns para CustomerID.
5. Na caixa Columns, designe Foreign Key Columns para CustomerID.
6. Clique em OK para criar o relacionamento; uma linha de relao aparece no designer entre
as duas tabelas.
7. 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 Consulte

Adicionar dados tabela Adding Data to a Table

Visual C# Consolidado 920


Visualizar dados em uma tabela Viewing Data in a Table

Editar dados Editing Data in a Table

Excluir uma linha de uma tabela 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 Descrio

TableAdapter.Fill 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.

TableAdapter.GetData Retorna uma nova DataTable preenchida com dados.

TableAdapter.Insert Cria uma nova linha na tabela de dados. Para obter mais
informaes, consulte Como adicionar linhas ao um DataTable.

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. No Visual Studio, no menu File, crie um novo projeto.


2. Escolha uma linguagem de programao no painel Project Types.
3. Clique em Windows Application no painel Templates.
4. 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. No menu Data, clique em Show Data Sources.


2. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source
Configuration Wizard.

Visual C# Consolidado 925


3. Selecione Database na pgina Choose a Data Source Type, e clique Next.
4. Na pgina Choose your Data Connection siga um destes procedimentos:
o Se uma conexo de dados para o banco de dados de exemplo Northwind est
disponvel na lista drop-down, selecione-o.
-ou-
o Selecione New Connection para abrir a caixa Add/Modify Connection. Para obter
mais informaes, consulte Add/Modify Connection Dialog Box (General).
5. Se seu banco de dados exigir uma senha, selecione a opo para incluir dados
confidenciais, e clique Next.
6. Clique Next na pgina Save connection string to the Application Configuration file.
7. Expanda o n Tables na pgina Choose your Database Objects.
8. 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

Para abrir o DataSet no Dataset Designer

1. Clique com o boto direito do mouse NorthwindDataset na janela Data Sources.


2. 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. Arraste um Query da guia DataSet da tabela Toolbox para a tabela Customers.


O Assistente de configurao da consulta TableAdapter abre.
2. Selecione Use SQL statements, e clique Next.
3. Selecione SELECT which returns rows, e clique Next.
4. 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. Selecione Form1 no Solution Explorer, e clique em View Designer.


2. Arraste o n Customers da janela Data Sources para Form1.
3. Altere para modo de exibio de cdigo, selecionando Code a partir do menu View.
4. 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 Consulte

Preenchendo um DataSet usando um TableAdapter Como: preencher uma DataSet com dados

TableAdapters Viso Geral do Adaptador de Tabela

Preencher um DataSet com um adaptador de dados Populating a DataSet from a DataAdapter

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:

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 comando referencia uma conexo que ele usa para se comunicar com
o banco de dados.
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. No Visual Studio, a partir do menu File, criar um novo Project.


2. Nomeie o projeto como DatasetWalkthrough.
3. 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. No menu Data, clique em Show Data Sources.


2. Na janela Data Sources, clique em Add New Data Source para iniciar o Data Source
Configuration Wizard.
3. Selecione Database na pgina Choose a Data Source Type, e em seguida clique em
Next.
4. Na pgina Choose your Data Connection siga um destes procedimentos:
o Se uma conexo de dados para o banco de dados de exemplo Northwind est
disponvel na lista suspensa, selecione-a.
-ou-
o Selecione New Connection para iniciar a caixa de dilogo Add/Modify
Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box
(General).
5. Se seu banco de dados exigir uma senha, selecione a opo para incluir dados
confidenciais (sensitive data), e clique em Next.
6. Clique em Next na pgina Save connection string to the Application Configuration file.
7. Expanda o n Tables na pgina Choose your Database Objects.
8. 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

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. No Solution Explorer, selecione o Form1, e clique no boto View Code.


2. 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. Criando um novo projeto.


2. Criar um arquivo XML a ser lido no DataSet.
3. Criando a interface do usurio.
4. Criando o DataSet, leia o arquivo XML, e o exiba em um controle DataGridView.
5. 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. No menu File, crie um novo projeto.


2. Nomeie o projeto ReadingXML.
3. 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. No menu Project, escolha Add New Item.


2. Selecione XML File, nomeie o arquivo authors.xml, e clique em Add.
O arquivo XML carrega no designer e est pronto para edio.
3. 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 986-
7020</phone> <address>309 63rd St. #411</address> <city>Oakland</city> <state>CA</state>
<zip>94618</zip> <contract>true</contract> </authors> <authors> <au_id>238-95-
7766</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-41-
2394</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:

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.
o Um boto l o arquivo XML para o DataSet e exibe-o no controle DataGridView.
o Um segundo boto extrai o esquema do DataSet, e por um StringWriter exibe-o no
controle TextBox.

Para adicionar controles ao formulrio

1. Abra Form1 no modo Design.


2. No Toolbox, arraste os seguintes controles no formulrio:
o Um controle DataGridView
o Um controle TextBox
o Dois controles Button
3. Defina as seguintes propriedades:

Controle Propriedade Configurao

TextBox1 Multiline true

ScrollBars Vertical

Button1 Name ReadXmlButton

Text Read XML

Button2 Name ShowSchemaButton

Text Show Schema

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. Com o arquivo fonte para Form1 selecionado em Solution Explorer, clique no boto View
Designer na barra de ferramentas Solution Explorer.
2. No Data Tab, Toolbox, arraste um DataSet. para Form1
3. 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. No Solution Explorer, selecione Form1 e clique no View Designer boto da barra de


ferramentas Solution Explorer.
2. Clique duas vezes no boto Read XML.
O Code Editor abre no manipulador de eventos ReadXmlButton_Click.
3. 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. No Solution Explorer, selecione Form1 e clique no boto View Designer.


2. Clique duas vezes no boto Show Schema.
O Code Editor abre no manipulador de eventos ShowSchemaButton_Click.
3. 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. Pressione F5 para executar o aplicativo.


2. Clique no boto Read XML.
O DataGridView exibe o contedo do arquivo XML.
3. 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 Obter mais informaes

Abrir a janela Data Sources Como abrir a janela Fontes de dados:

Adicionar uma fonte de dados no seu Clique em Add New Data Source no Janela de fontes de
projeto 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 Como: Definir o controle a ser criado quando arrastado da
Sources para os controles que voc janela Data Sources:
deseja que estejam criados

Arrastar itens da janela Data Sources Como exibir dados em um controle Windows
para seu formulrio Forms DataGridView:
Como: Exibir Dados em controles individuais
Windows Forms
Encadernao dados para controles existente
como:

Formatar a maneira de controles Formatting and Advanced Binding Dialog Box


exibirem dados

Depois de ter criado um formulrio que exibe dados, voc pode desejar seguir uma das seguintes
tarefas:

Tarefa Para obter mais informaes

Editar os dados na Editar dados no seu aplicativo (tenha em mente que alteraes nos
fonte de dados dados em controles com dados vinculados so gravadas
subjacentes automaticamente no dataset, mas no so salvas automaticamente no
banco de dados subjacente.)

Validar alteraes Validando dados


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. No menu File, crie um novo projeto.


2. Nomeie o projeto DisplayingDataonaWindowsForm.
3. 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. No menu Data, clique em Show Data Sources.


2. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source
Configuration Wizard.
3. Selecione Database na pgina Choose a Data Source Type, e clique Next.
4. Na pgina Choose your Data Connection siga um destes procedimentos:
o Se uma conexo de dados para o banco de dados de exemplo Northwind est
disponvel na lista drop-down, selecione-a.
-ou-
o Selecione New Connection para iniciar a caixa de dilogo Add/Modify
Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box
(General).
5. Se seu banco de dados exigir uma senha, selecione a opo para incluir dados
confidenciais, e clique Next.
6. Clique Next na pgina Save connection string to the Application Configuration file.
7. Expanda o n Tables na pgina Choose your Database Objects.
8. 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

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. Expanda o n Customers na janela Data Sources.


2. 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:.
3. 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.

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. No menu File, crie um novo projeto.


2. Nomeie o projeto RelatedDataWalkthrough.
3. 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. No menu Data, clique em Show Data Sources.


2. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source
Configuration Wizard.
3. Selecione Database na pgina Choose a Data Source Type, e clique Next.
4. Na pgina Choose your Data Connection siga um destes procedimentos:
o Se uma conexo de dados para o banco de dados de exemplo Northwind estiver
disponvel na lista drop-down, selecione-o.
-ou-
o Selecione New Connection para iniciar a caixa Add/Modify Connection. Para
obter mais informaes, consulte Add/Modify Connection Dialog Box (General).
5. Se seu banco de dados exigir uma senha, selecione a opo para incluir dados
confidenciais, e clique Next.
6. Clique Next na pgina Save connection string to the Application Configuration file.
7. Expanda o n Tables na pgina Choose your Database Objects.
8. 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

Para criar controles para exibir os dados do cliente (customer) (registros pai)

1. Na janela Data Sources, selecione a tabela Customers, e clique na seta suspensa.


2. Escolha Details no menu.
3. 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. Pressione F5 para executar o aplicativo.


2. 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. No menu File, crie um novo projeto.


2. Nomeie o projeto como WindowsSearchForm.
3. 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. No menu Data, clique em Show Data Sources.


2. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source
Configuration Wizard.
3. Selecione Database na pgina Choose a Data Source Type, e em seguida clique Next.
4. Na pgina Choose your Data Connection siga um destes procedimentos:
o Se uma conexo de dados para o banco de dados de exemplo Northwind est
disponvel na lista suspensa, selecione-a.
-ou-
o Selecione New Connection para iniciar a caixa de dilogo Add/Modify
Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box
(General).
5. Se seu banco de dados exigir uma senha, selecione a opo para incluir dados
confidenciais, e em seguida clique Next.
6. Clique Next na pgina Save connection string to the Application Configuration file.
7. Expanda o n Tables na pgina Choose your Database Objects.
8. 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

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. Expanda o n Customers na janela Data Sources.
2. 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. Selecione o controle DataGridView, e escolha Add Query no menu Data.


2. Digite FillByCity na rea New query name no Caixa de Dilogo Construtora de Critrios
de Pesquisa.
3. 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. Pressione F5 para executar o aplicativo.


2. 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. No menu File, crie um novo projeto.


2. Nomeie o projeto LookupTableWalkthrough.
3. 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. No menu Data, clique em Show Data Sources.


2. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source
Configuration Wizard.

Visual C# Consolidado 947


3. Selecione Database na pgina Choose a Data Source Type, e clique Next.
4. Na pgina Choose your Data Connection siga um destes procedimentos:
o Se uma conexo de dados para o banco de dados de exemplo Northwind est
disponvel na lista drop-down, selecione-o.
- ou -
o Selecione New Connection para iniciar a caixa Add/Modify Connection. Para
obter mais informaes, consulte Add/Modify Connection Dialog Box (General).
5. Se o seu banco de dados exigir uma senha, selecione a opo para incluir dados
confidenciais, e clique Next.
6. Clique Next na pgina Save connection string to the Application Configuration file.
7. Expanda o n Tables na pgina Choose your Database Objects.
8. 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

Para criar controles vinculados a dados no formulrio

1. Expanda o n Customers na janela Data Sources.


2. 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:.
3. 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.
4. 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:

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 Explicao sobre configurao
DataSource 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.
ValueMember 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.
SelectedValue 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.)

Executando o aplicativo

Para executar o aplicativo

1. Pressione F5.
2. 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. No Visual Studio, a partir do menu File, criar um novo Project.


2. 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. No menu Project, escolha Add User Control.


2. 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. Arraste um MaskedTextBox do Toolbox na superfcie do design do controle de usurio.


2. Selecione a marca inteligente no MaskedTextBox apenas arrastando e escolha Set Mask.
3. 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. Alterne o controle PhoneNumberBox para modo de exibio do cdigo. (No menu View,
escolha Code.)
2. 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. No menu Data, clique em Show Data Sources.


2. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source
Configuration Wizard.
3. Selecione Database na pgina Choose a Data Source Type e clique Next.
4. Na pgina Choose your Data Connection siga um destes procedimentos:
o Se uma conexo de dados para o banco de dados de exemplo Northwind est
disponvel na lista drop-down, selecione-o.
Ou
o Selecione New Connection para iniciar a caixa de dilogo Add/Modify
Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box
(General).
5. Se seu banco de dados exigir uma senha, selecione a opo para incluir dados
confidenciais e clique Next.
6. Clique Next na pgina Save connection string to the Application Configuration file.
7. Expanda o n Tables na pgina Choose your Database Objects.
8. 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

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. Abra Form1 no designer.


2. Expanda o n Customers na janela Data Sources.
3. Clique na seta suspensa no n Customers e escolha Details a partir da lista controle.
4. Clique na seta suspensa na coluna Phone e escolha Customize.
5. Selecione o PhoneNumberBox da lista de Associated Controls na caixa de dilogo Data
UI Customization Options.
6. 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. No Visual Studio, a partir do menu File, crie um novo Project.
2. Nomeie o projeto como ComplexControlWalkthrough.
3. 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. No menu Project, escolha Add User Control.


2. 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. Alterne o controle ComplexDataGridView para modo de exibio do Cdigo. (No menu


View, selecione Code.)
2. 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. No menu Data, clique em Show Data Sources.


2. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source
Configuration Wizard.
3. Selecione Database na pgina Choose a Data Source Type, e clique Next.
4. Na pgina Choose your Data Connection siga um destes procedimentos:
o Se uma conexo de dados para o banco de dados de exemplo Northwind est
disponvel na lista suspensa, a selecione.
Ou-
o Selecione New Connection para iniciar a caixa Add/Modify Connection. Para
obter mais informaes, consulte Add/Modify Connection Dialog Box (General).
5. Se seu banco de dados exigir uma senha, selecione a opo para incluir dados
confidenciais, e clique Next.
6. Clique Next na pgina Save connection string to the Application Configuration file.
7. Expanda o n Tables na pgina Choose your Database Objects.
8. Selecione a tabela Customers, e clique Finish.

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. Abra o Form1 no designer.


2. Expanda o n Customers na janela Data Sources.
3. Clique na seta suspensa no n Customers e escolha Customize.
4. No ComplexDataGridView selecione da lista de Associated Controls na caixa de dilogo
Data UI Customization Options.
5. 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. No Visual Studio, a partir do menu File, crie um novo Project.
2. Nome do projeto LookupControlWalkthrough.
3. 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. No menu Project, selecione Add User Control.


2. 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. Alternar o controle LookupBox para modo de exibio do cdigo. (No menu View, escolha
Code).
2. 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. No menu Data, clique em Show Data Sources.


2. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source
Configuration Wizard.
3. Selecione Database na pgina Choose a Data Source Type, e clique Next.

Visual C# Consolidado 960


4. Na pgina Choose your Data Connection e siga um destes procedimentos:
o Se uma conexo de dados para o banco de dados de exemplo Northwind est
disponvel na lista suspensa, selecione-a.
Ou-
o Selecione New Connection para iniciar a caixa de dilogo Add/Modify
Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box
(General).
5. Se seu banco de dados exigir uma senha, selecione a opo para incluir dados
confidenciais, e clique Next.
6. Clique Next na pgina Save connection string to the Application Configuration file.
7. Expanda o n Tables na pgina Choose your Database Objects.
8. 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

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. Abra o Form1 no designer.


2. Expanda o n Customers na janela Data Sources.
3. Expanda o n Orders (aquele n Customers abaixo da coluna Fax).
4. Clique na seta suspensa no n Orders e escolha Details a partir da lista de controle.
5. Clique na seta suspensa na coluna CustomerID (no n Orders) e escolha Customize.
6. Do LookupBox selecione a lista de Associated Controls na caixa de dilogo Data UI
Customization Options.
7. Clique em OK.
8. 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 infra-
estrutura 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 Descrio

TableAdapter.Insert
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 Descrio
Inserir novos registros em Criar uma nova DataRow e adicion-la coleo de linhas da tabela.
uma tabela de dados. For more information, see Como adicionar linhas ao um DataTable.
Atualizar registros Atribua um valor diretamente para a coluna especfica de uma linha
existentes em uma tabela de dados. For more information, see Como editar linhas de uma
de dados. DataTable:.
Excluir registros existentes Chame o Delete mtodo da linha de dados que deseja remover da

Visual C# Consolidado 966


de uma tabela de dados. tabela. For more information, see Como: Excluir linhas em uma
DataTable.
Localize os registros Chame o GetChanges mtodo de uma tabela de dados. For more
alterados em uma tabela information, see Como: Recuperar Linhas Alteradas.
de dados.
Acesso verses diferentes Acesso as colunas individuais de uma linha de dados por passagem
de uma linha em uma em voc DataRowVersion deseja exibir. For more information, see
tabela de dados. Como: Obter Verses Especficas de um DataRow.
Localize linhas com erros Verificar a HasErrors propriedade de uma tabela de dados. For more
em uma tabela de dados. 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 O valor em uma coluna foi alterado. O evento passa a linha e coluna para
voc, juntamente com o valor proposto.
RowChanging 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 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.
RowDeleting 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.
RowDeleted 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. No menu File, crie um novo projeto.


2. Nomeie o projeto como ValidationWalkthrough.
3. 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. No menu Data, clique em Show Data Sources.


2. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source
Configuration Wizard.
3. Selecione Database na pgina Choose a Data Source Type, e clique em Next.
4. Na pgina Choose your Data Connection siga um destes procedimentos:
o Se uma conexo de dados para o banco de dados de exemplo Northwind estiver
disponvel na lista suspensa, selecione-o.
-ou-
o Selecione New Connection para iniciar a caixa de dilogo Add/Modify
Connection. Para obter mais informaes, consulte Add/Modify Connection Dialog Box
(General).
5. Se seu banco de dados exigir uma senha, selecione a opo para incluir dados
confidenciais (include sensitive data), e clique em Next.
6. Clique em Next na pgina Save connection string to the Application Configuration file.
7. Expanda o n Tables na pgina Choose your Database Objects.
8. Selecione a tabela Order Details, e clique em Finish.

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. Na janela Data Sources, selecione a tabela Order Details.


2. Escolha Details na lista de controles da tabela.
3. 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. Arraste um ErrorProvider da Toolbox para o Form1.


2. 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. Abra o NorthwindDataSet no Dataset Designer. clicando duas vezes no arquivo


NorthwindDataSet.xsd no Solution Explorer
2. 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 (column-
changing) 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. Pressione F5 para executar o aplicativo.
2. Altere o valor na caixa de texto Quantity para 0.
3. Pressione TAB para mover o foco para fora da caixa de texto.
O cone do provedor de erros (error provider) aparecer.
4. 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 DataSet destino DataSet origem


Original James Wilson James C. Wilson
Atual Jim Wilson James C. Wilson

Chamar o mtodo Merge na tabela acima com preserveChanges=false


targetDataset.Merge(sourceDataset) resulta no seguinte:

DataRowVersion DataSet destino DataSet origem


Original James C. Wilson James C. Wilson
Atual James C. Wilson James C. Wilson

Chamar o mtodo Merge com preserveChanges = true targetDataset.Merge(sourceDataset, true) resulta


no seguinte:

DataRowVersion DataSet destino DataSet origem


Original James C. Wilson James C. Wilson
Atual Jim Wilson James C. Wilson
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 no-
anulveis), 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.

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).

Deleted A linha foi excluda usando o Delete de um objeto DataRow.

Detached 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.

Modified Um valor de coluna na linha foi alterado de alguma maneira.

Unchanged A linha no foi alterada desde que AcceptChanges foi chamado pela ltima
vez.

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 Descrio

Current 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.

Default O valor padro de um registro, conforme definido pelo esquema do dataset


ou fonte de dados.

Original 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.

Proposed 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.

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

DataTable.AcceptChanges Alteraes so confirmadas em todas as linhas na tabela


especfica

DataSet.AcceptChanges Alteraes so confirmadas em todas as linhas em todas


as tabelas do dataset

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 pai-
filho, 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. Tabela filho: excluir registros.


2. Tabela pai: inserir, atualizar e excluir registros.
3. Tabela filho: inserir e atualizar registros.
4. 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. Execute o comando para atualizar o banco de dados de dentro de um bloco try/catch.
2. Se uma exceo gerada, inspecione a declarao catch da propriedade Row para
determinar o que causou a violao.
3. 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. Criar um novo projeto Windows Application.


2. Crie um novo dataset baseado na tabela Northwind Customers.
3. Criar um formulrio com um DataGridView para exibir os dados.
4. Preencher um dataset com dados da tabela Customers do banco de dados Northwind.
5. Aps preencher o dataset, use o Visual Database Tools no Visual Studio para acessar a
tabela de dados Customers e alterar diretamente um registro.
6. 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.
7. 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:

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. No menu File, criar um novo projeto.


2. Selecione uma linguagem de programao no painel Project Types.
3. Selecione Windows Application no painel Templates.
4. 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. No menu Data, escolha Add New Data source.


O Assistente para Configurao da Fonte de Dados aberto.
2. Selecione Database na pgina Choose a Data Source Type.
3. 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. Clique Next na pgina Save connection string to the application configuration file.
5. Expanda o n Tables e selecione a tabela Customers. O nome padro para o dataset deve
ser NorthwindDataSet.
6. 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. No menu Data, escolha Show Data Sources para abrir o Data Sources Window.
2. Expanda o n NorthwindDataSet a partir da janela Data Sources e selecione a tabela
Customers.
3. Clique na seta para baixo no n da tabela e selecione DataGridView na lista suspensa.
4. 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. Criar um manipulador de erro personalizado.


2. Exibir as opes para o usurio.
3. Processar a resposta do usurio.
4. 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. Pressione F5 para executar o aplicativo.


2. Aps o formulrio aparecer, deixe-lo funcionando e alterne para a IDE do Visual Studio.
3. No menu View, escolha Server Explorer.
4. No Server Explorer, expanda a conexo que seu aplicativo est usando e expanda o n
Tables.
5. Clique com o boto direito do mouse na tabela Customers e selecione Show Table Data.
6. 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. No primeiro registro no formulrio (ALFKI), altere o ContactName para Maria Anders1.
9. 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. No Visual Studio, a partir do menu File, criar um novo Project.


2. Nome do projeto TableAdapterDbDirectMethodsWalkthrough.
3. 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. No menu Data, clique em Show Data Sources.


2. Na janela Data Sources, selecione Add New Data Source para iniciar o Data Source
Configuration Wizard.
3. Selecione Database na pgina Choose a Data Source Type, e clique Next.
4. Na pgina Choose your Data Connection siga um destes procedimentos:
o Se uma conexo de dados para o banco de dados de exemplo Northwind est
disponvel na lista suspensa, selecione-a.
Ou-
o Selecione New Connection para iniciar a caixa Add/Modify Connection. Para
obter mais informaes, consulte Add/Modify Connection Dialog Box (General).
5. Se seu banco de dados exigir uma senha, selecione a opo para incluir dados
confidenciais, e clique Next.
6. Clique Next na pgina Save connection string to the Application Configuration file.
7. Expanda o n Tables na pgina Choose your Database Objects.
8. 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

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. Arraste trs controles Button do Toolbox par o Form1 (abaixo do RegionDataGridView).


2. Defina as seguintes propriedades Name e Text em cada boto.

Nome Texto
InsertButton Inserir
UpdateButton Atualizao
DeleteButton Excluir

Visual C# Consolidado 992


Para adicionar o cdigo para inserir novos registros no banco de dados

1. Clique duas vezes em InsertButton para criar um manipulador de eventos para o evento
Click e abrir o seu formulrio no Editor de Cdigo.
2. 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. Clique duas vezes em UpdateButton para criar um manipulador de eventos para o evento
Click e abrir o formulrio no Editor de Cdigo.
2. 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. Clique duas vezes em DeleteButton para criar um manipulador de eventos para o evento
Click e abrir o formulrio no Editor de Cdigo.
2. 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 multi-
chave.

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 Data-

Descreve 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 Mais informaes

Procedimento armazenado Como: criar e executar um procedimento armazenado SQL Server


CLR

Disparador Como: Criar e Executar um Disparador SQL Server CLR

Funo definida pelo Como criar e executar um SQL CLR Server funo definida pelo
usurio usurio:

Tipo definido pelo usurio Como criar e executar um SQL CLR Server funo definida pelo
usurio:

Agregado Como criar e executar uma agregao ao CLR do SQL Server:

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 Transact-
SQL 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. No Solution Explorer, selecione o projeto.


2. 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. No Solution Explorer, selecione a soluo.


2. 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. No Solution Explorer, selecione o projeto.


2. 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. No Solution Explorer, selecione a soluo.
2. 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. No Solution Explorer, selecione a soluo.


2. No menu Debug, escolha Start.
3. 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. No menu File, crie um novo projeto.
2. 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. No menu Project, escolha Add New Item.


2. Selecione Stored Procedure em Add New Item Dialog Box.
3. Digite InsertCurrency como o Name para o novo procedimento armazenado.
4. Clique em Add.
5. 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. No Solution Explorer, expanda a pasta TestScripts e clique duas vezes no arquivo
Test.sql.
2. 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. Na caixa New <Type> de dilogo, execute uma das opes a seguir:
o Para aceitar os valores padro, clique em OK.
o 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) Ele pode conter membros

Class Mtodo, Propriedade (para C# e Visual Basic), campo, evento (para C# e Visual
Basic), (mtodo) construtor, destruidor (mtodo), constante

Visual C# Consolidado 1005


Enum Membro

Struct Mtodo, campo de propriedade (para C# e Visual Basic), evento (para C# e Visual
Basic), (mtodo) construtor, constante

Interface mtodo, evento (para C# e Visual Basic), propriedade


Mtodo, Campo (para J#)

Delegado Parmetro

Observao

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 READ-
ONLY (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. Selecione o tipo no Class Designer.
2. Se a janela Detalhes classe no for exibida, exiba-o. (Consulte COMO: Abrir a janela Class
Details.)
3. 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. Clique com o boto direito do mouse a superfcie de um diagrama de classe para exibir um
menu de contexto.
2. No menu de contexto, clique em Class Details Window.

ou -

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 Resultado
(vrgula) 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.
(ponto-e- Mova o cursor para o campo Nome da prxima linha na grade da janela
vrgula) Detalhes classe Membro.
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.
< espao > 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.
CTRL + TAB Alterna para outra janela do documento. Por exemplo, alterne da janela
Detalhes classe para um arquivo de cdigo aberto.
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 Se o cursor for na coluna Nome, pressionar a seta esquerda recolhe o n atual
esquerda na hierarquia (se ele estiver aberto).
Seta direita 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.
O cdigo janela Detalhes classe e fonte
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.
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 origem-

Como um diagrama de classe salvo como um arquivo em um projeto, voc precisa fazer check-
out 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:
o An opening parenthesis '(' indicates the first parameter of a member.
o Um parntese de fechamento ') '. indica a linha aps o ltimo parmetro do membro
Esta linha contm as palavras <add parameter>.
o 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.
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. Na Toolbox, selecione a Inheritance linha.
2. 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. A partir do projeto no Solution Explorer, abra o arquivo diagrama de classe (.CD).
2. Na caixa de ferramentas Class Designer, clique na Inheritance ferramenta.
3. Mova o ponteiro para o diagrama de classe.
O ponteiro se transformar em um cursor de herana.
4. 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.
6. 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.

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. Na caixa de ferramentas, selecione o Association item.
2. 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. Clique com o boto direito do mouse na forma na superfcie do design.
2. 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. Clique em um diagrama de classe o tipo na forma.
2. Na janela Propriedades, prximo propriedade Custom Attributes para o tipo, clique no
boto de reticncias (). A Attribute Editor caixa de dilogo exibida.
3. 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. Clique no nome do membro na forma seu do tipo em um diagrama de classe, ou sua linha
na janela Detalhes classe.
2. Na janela Propriedades, localize a Custom Attributes propriedade para o membro.
3. 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. Sobre o diagrama de classe, selecione o tipo para que voc deseja exibir a classe base ou
interface.
2. 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. Sobre o diagrama de classe, selecione o tipo para que voc deseja exibir seus tipos
derivados.
2. 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. Na diagrama de classe, selecione a forma tipo que deseja remover do diagrama.
2. 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. A partir do projeto no Solution Explorer, abra o arquivo diagrama de classe (.CD).
2. Sobre o diagrama de classe, selecione a forma tipo.
3. 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. Na forma tipo, clique no nome compartimento.
3. 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. Abrir ou exibir a janela Detalhes classe se ele estiver fechado.
2. 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. No projeto no Solution Explorer, abra o diagrama de classe para o tipo.
2. 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. Do n de projeto em Solution Explorer, abra o arquivo diagrama de classe (.CD).
2. 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. No Solution Explorer, clique com o boto direito do mouse no nome do projeto e execute
uma das opes a seguir:
o Clique em Add New Item.
o Aponte para Add, e clique em New Item.
A Add New Item caixa de dilogo ser exibida.
2. No painel Modelos da caixa Add New Item de dilogo, execute uma das opes a seguir:
o Para criar um diagrama de classe com o nome padro, clique duas vezes Class
Diagram.
o 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.
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. No projeto no Solution Explorer, abra o diagrama de classe para o tipo.
2. 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. Arraste um comentrio de at o diagrama de classe. o Class Designer Toolbox
2. 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 selecion-


lo. 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. Na superfcie do diagrama, arraste o ponteiro para selecionar as formas que voc deseja
copiar.
2. 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. Clique com o boto direito do mouse a superfcie de diagrama e escolha Select All.
2. 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. Exibir o diagrama de classe. (Se necessrio, selecione a guia diagrama de classe para
exibi-la.)
2. 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.)
Para substituir um membro
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.

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. No diagrama de classe, selecione o tipo ou membro.
O nome do membro se tornar editvel.
2. Digite o novo nome para o tipo ou membro tipo
Para renomear um nome na janela Detalhes classe
1. 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. Na coluna Name, edite o nome do membro do tipo
3. 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.

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. 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.
2. 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. Na diagrama de classe, exibir a interface e a classe ser que implementam a interface.
2. 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. Na diagrama de classe, exibir a classe que voc deseja que implementam a interface.
2. 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.)
Implementar uma classe abstrato
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.

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. No diagrama de classe, expanda a forma tipo e o Methods compartimento.
2. 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. Como opo, especificar outros detalhes sobre o membro, tais como seu tipo.
Para criar um membro usando a barra de ferramentas Janela detalhes classe
1. 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.
2. 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. Como opo, especificar outros detalhes sobre o membro, tais como seu tipo.
Para criar um membro usando a classe detalhes janela
1. 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.
2. 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>.
3. 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.

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. Adicione uma referncia ao conjunto System.Design.
2. 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. Se voc estiver implementando uma experincia em tempo de design personalizada para o


componente, importar espao para nome System.ComponentModel.Design.
C#
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. Substituir o CanConvertFrom mtodo que especifica o tipo o conversor pode converter do.
Este mtodo est sobrecarregado.
3. Substituir o ConvertFrom mtodo que implementa a converso. Este mtodo est
sobrecarregado.
4. 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.
5. Substituir o ConvertTo mtodo que implementa a converso. Este mtodo est
sobrecarregado.
6. Substituir o IsValid mtodo que realiza validao. Este mtodo est sobrecarregado.

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. Definir uma classe que deriva de TypeConverter.
2. Substituir o GetStandardValuesSupported mtodo e retornar true.
3. 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. Substituir o CanConvertFrom mtodo e retornar true para um sourceType valor de
parmetro do tipo seqncia.
5. Substituir o ConvertFrom mtodo e retornar o valor adequado para a propriedade com
base no parmetro value.
6. 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 construtor-


cdigo de inicializao
1. Definir uma classe que deriva de TypeConverter.
2. Substituir o CanConvertTo mtodo. Se igual tipo, o destinationType Parmetro a
InstanceDescriptor retornar true.
3. 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. Definir uma classe que deriva de System.Drawing.Design.UITypeEditor.
2. Substituir o EditValue mtodo para configurar propriedades da interface do usurio. Este
mtodo est sobrecarregado.
3. 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. // 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; // 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; } } } ///////////////////////////////////////////////////////////////// // DesignerActionList-
derived 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. Selecione a clula A1 no Sheet1.
5. 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. Selecione o projeto WinFormInput no Solution Explorer.
7. No menu Project, clique em Add Windows Form.
8. 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. Clique com o boto direito do mouse ThisWorkbook.vb ou ThisWorkbook.cs em
Solution Explorer e selecione View Code.
5. 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. Clique com o boto direito do mouse GetInputString em Solution Explorer, e selecione
View Designer.
5. Clique duas vezes no boto para abrir o arquivo de cdigo com manipulador de eventos do
boto Click adicionado.
6. 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. Pressione F5 para executar o projeto.
6. Confirme se o formulrio Windows aparece.
7. Digite Hello World na caixa de texto e clique em OK.
8. 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 Value (Valor)


Name applyBoldFont
Text Negrito

13. Arraste uma segunda caixa de seleo ou prxima clula B4 e alterar as seguintes
propriedades:

Propriedade Value (Valor)


Name applyItalicFont
Text Itlico

14. Arraste uma caixa de seleo terceira ou prxima clula B6 e alterar as seguintes
propriedades:

Propriedade Value (Valor)


Name 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. Na guia Excel Controls da caixa de ferramentas, arraste um NamedRange controle
clula B9.
7. 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.
8. Clique em OK.
9. 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 Value (Valor)


Name textFont
Value2 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. Clique com o boto direito do mouse Sheet1 e clique View Code no menu de atalho
7. 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. Pressione F5 para executar o projeto.


5. Marque ou desmarque uma caixa de seleo.
6. 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. Verifique se a My Excel Button.xls pasta de trabalho aberta no designer visual studio,


com Sheet1 exibido.
7. Na guia Common Controls da caixa de ferramentas, arraste para Sheet1. um TextBox
8. No menu View, selecione Properties Window.
9. 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 Value (Valor)

Name 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. Na Solution Explorer, clique com o boto direito do mouse Sheet1 e, em seguida clique
View Code no menu de atalho.
5. 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. Pressione F5 para executar o projeto.
5. Clique no boto.
6. 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. Verifique se a My Named Range Events.xls pasta de trabalho aberta no designer visual


studio, com Sheet1 exibido.
9. 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. Na clula A1, digite o seguinte texto:


Este um exemplo de um controle NamedRange.
4. 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. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs. e


selecione View Code
5. 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. Pressione F5 para executar o projeto.


8. Coloque o cursor no namedRange1, e verificar que o texto sobre o SelectionChange evento
inserido e que um comentrio inserido na planilha.
9. 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. Pressione F5 para executar o projeto.


4. 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. Verifique se a My Simple Data Binding.xls pasta de trabalho aberta no designer visual


studio, com Sheet1 exibido.
9. 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 (Nome)

B3 Button2

C3 Button3

D3 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. 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
5. 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. Pressione F5 para executar o projeto.


6. Confirme se o primeiro registro aparece nas clulas A1 e B1.
7. 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. Verifique se a My Complex Data Binding.xls pasta de trabalho aberta no designer


visual studio, com Sheet1 exibido.
6. Abra a Data Sources janela e selecione o Employees n.
7. Clique na seta suspensa que aparece.
8. 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. 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
5. 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. Clique em Clula B7, que deve conter o nome Davolio.


4. Digite o nome Anderson, e pressione ENTER.

Para modificar um cabealho de coluna

3. Clique na clula que contm no cabealho LastName da coluna.


4. Digitar Last Name, incluindo um espao entre as duas palavras, e pressione ENTER.

Para salvar dados

5. Clique Save na planilha.


6. Feche a pasta de trabalho. Clique em No Quando solicitado a salvar as alteraes feitas.
7. Pressione F5 para executar o projeto novamente.
O objeto lista preenchido com dados da tabela Employees.
8. 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 Sobrenome FirstName Ttulo

10 ITO Shu Gerenciador de vendas

Para excluir linhas

3. Selecionar linha 16, que deve conter a nova linha que voc adicionou, clicando no nmero
16 no lado esquerdo da planilha.
4. No menu Edit, clique em Delete.

Para classificar as linhas na lista

4. Selecione uma clula dentro da lista.


Botes de seta aparecem em cada cabealho de coluna.
5. 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. Selecione uma clula dentro da lista.


7. Clique no boto SETA no cabealho da Title coluna.
8. Clique em Sales Representative.
A lista mostra somente as linhas que tm Sales Representative na coluna Title.
9. Clique no boto SETA no cabealho da Title coluna novamente.
10. 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:

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 Master-
Detail 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. Verifique se a My Master-Detail.xls pasta de trabalho aberta no designer visual studio,


com Sheet1 exibido.
9. 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. Selecione NorthwindDataSet No bandeja de componentes.
5. Na janela Properties, alterar a Modifiers propriedade para Public.
DataSets dever ser pblica antes cache est ativado.
6. 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. 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
5. 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 mestre-
no 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. Abra o Excel 2003.
Abre uma nova pasta de trabalho.
6. Clique com o boto direito do mouse na Sheet3 guia e, em seguida clique Rename no
menu de atalho.
7. Renomear a planilha para Data for Chart.
8. 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 500 550 550 600

Leste 600 625 675 700

Norte 450 470 490 510

Sul 800 750 775 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:.
5. Clique no Browse boto e v para a pasta de trabalho que voc criou anteriormente nessa
explicao passo a passo.
6. 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

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 Value (Valor)

Name dataChart

HasLegend False

Adicionar um controle de usurio ao projeto


Para adicionar um controle de usurio
4. Selecione o My Excel Chart projeto no Solution Explorer.
5. No menu Project, clique em Add New Item.
6. Na caixa Add New Item de dilogo, clique User Control, nome do controle ChartOptions,
e clique em Add
Para adicionar controles Windows Form ao controle de usurio
6. Se o controle de usurio estiver no visvel no designer, clique duas vezes em
ChartOptions no Solution Explorer.
7. Na guia Common Controls Da arraste um Radio Button controle para o controle de
usurio, e alterar as seguintes propriedades: o Toolbox,

Propriedade Value (Valor)

Name columnChart

Text Grfico de coluna

8. Adicionar um boto de opo segundo para o controle de usurio, e alterar as


propriedades a seguir:

Propriedade Value (Valor)

Name barChart

Text Grfico de barras

9. Adicionar um boto de opo terceiro para o controle de usurio, e alterar as propriedades


a seguir:

Propriedade Value (Valor)

Name lineChart

Text 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 Value (Valor)

Name areaBlockChart

Text 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. No Solution Explorer, clique com o boto direito do mouse no controle de usurio e
selecione View Code.
4. 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. No menu Build, clique em Build Solution.
O ChartOptions controle de usurio adicionado Toolbox.
5. Clique com o boto direito do mouse Sheet1.vb no Solution Explorer, ou Sheet1.cs. e
selecione View Designer
6. 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. Pressione F5 para executar o projeto.
5. Selecione vrios botes de opo.
6. 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. Verifique se a My Excel Actions Pane.xls pasta de trabalho aberta no designer visual
studio, com Sheet1 exibido.
9. 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. Selecione o My Excel Actions Pane projeto no Solution Explorer.
5. No menu Project, selecione Add New Item.
6. 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
4. Das Common Controls guias da Toolbox, arraste um ComboBox controle para o controle
painel Aes.
5. Alterar a Size propriedade para 171, 21.
6. 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

Visual C# Consolidado 1114


Para definir propriedades de vinculao de dados do controle
4. Clique com o boto direito do mouse no controle painel Aes e selecione View Code a
partir do menu de atalho
5. 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. 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
4. 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. Pressione F5 para executar o projeto.
6. Confirme se o painel Actions est visvel.
7. 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.
8. 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. 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
7. 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. Pressione F5 para executar o projeto.


Inicia o Word e a caixa de mensagem aparece.
9. 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. Clique com o boto direito do mouse o n de projeto no Solution Explorer.
7. Clique Publish no menu de atalho.
O Publish Wizard aparece.

Visual C# Consolidado 1117


8. Na caixa Specify the location to publish this application, digite C:\TestDeploy.
9. 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. Criar um novo projeto Console Application.
7. Do Microsoft.VisualStudio.Tools.Applications.Runtime Adicionar referncias para e
System.Windows.Forms montagens para este projeto.
8. 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.
5. 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"

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.
6. 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"

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. Crie uma WordDeployment_1.0.0.0 pasta sob a \\DeployServer\ShareFolder
compartilhamento de arquivos de rede.
5. Copiar o documento de Soluo e a manifesto de implantao para
\\DeployServer\ShareFolder.
6. 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. No computador de desenvolvimento, abra o WordDeployment.doc arquivo no
\\DeployServer\ShareFolder\.
4. 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 pr-
requisitos 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. 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
7. 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. Pressione F5 para executar o projeto.


O Excel iniciado e aparecer a caixa de mensagem.
9. 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. Clique com o boto direito do mouse no n na Solution Explorer soluo.
8. Aponte para Add no menu de atalho, e clique em New Project.
A Add New Project caixa de dilogo ser exibida.
9. 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. Clique com o boto direito do mouse no n na Solution Explorer soluo.
9. 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.
10. Aponte para Add no menu de atalho, e clique em New Item.
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;

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. Clique com o boto direito do mouse e, em seguida clique em Run. Em Solution
Explorer, o ExcelSetup project
6. Siga as instrues no Assistente de Instalao, e especificar uma pasta de instalao no
seu computador de desenvolvimento.
7. Abrir a pasta de trabalho do Excel a partir da pasta de instalao.
8. 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. Pressione F5 para executar o projeto.
4. 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 Value (Valor)

Name applyBoldFont

Text 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 Value (Valor)

Name applyItalicFont

Text 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 Value (Valor)

Name applyUnderlineFont

Text 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. Na guia Word Controls na Toolbox, arraste um Bookmark controle para o documento.
A Add Bookmark Control caixa de dilogo ser exibida.
7. 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. Clique com o boto direito do mouse ThisDocument no Solution Explorer, e, em seguida
clique View Code no menu de atalho.
8. 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. Pressione F5 para executar o projeto.
5. Marque ou desmarque uma caixa de seleo.
6. 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. Verifique se o documento est aberto no designer visual studio.
7. 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. No menu View, selecione Properties Window.


9. 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 Value (Valor)

Name insertText

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. Na Solution Explorer, clique com o boto direito do mouse ThisDocument e, em seguida
clique View Code no menu de atalho.
5. 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. Pressione F5 para executar o projeto.
5. Clique no boto.
6. 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. Na guia Word Controls da Toolbox, arraste um Bookmark controle para o documento.
A Add Bookmark Control caixa de dilogo ser exibida.
5. 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. No Solution Explorer, clique com o boto direito do mouse ThisDocument e selecione
View Code.
6. 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. Pressione F5 para executar o projeto.
7. Clique com o boto direito do mouse dentro do indicador e selecione Bold primeiro.
8. Verificar se todos os o texto no bookmark1 formatados como negrito.
9. 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. Feche a Datasheet janela para aceite os valores padro no grfico e clique dentro do
documento para mover foco fora do grfico.
9. 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. Selecione o My Chart Options projeto no Solution Explorer.
5. No menu Project, clique em Add New Item.
6. Na caixa Add New Item de dilogo, clique User Control, nome do controle ChartOptions,
e clique em Add
Para adicionar controles Windows Form ao controle de usurio
6. Se o controle de usurio estiver no visvel no designer, clique duas vezes em
ChartOptions no Solution Explorer.
7. Na guia Common Controls Da arraste um Radio Button controle para o controle de
usurio, e alterar as seguintes propriedades: o Toolbox,

Propriedade Value (Valor)

Name columnChart

Text Grfico de coluna

8. Adicionar um segundo Radio Button ao controle de usurio, e alterar as seguintes


propriedades:

Propriedade Value (Valor)

Name barChart

Text Grfico de barras

9. Adicionar um terceiro Radio Button ao controle de usurio, e alterar as seguintes


propriedades:

Propriedade Value (Valor)

Name lineChart

Text Grfico de linha

10. Adicionar um quarto Radio Button ao controle de usurio, e alterar as seguintes


propriedades:

Propriedade Value (Valor)

Name areaBlockChart

Text Grfico bloquear de rea

Adicionar Referncias

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. No menu Project, clique em Add Reference.
A Add Reference caixa de dilogo ser exibida.
5. Clique na COM guia.
6. 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. No Solution Explorer, clique com o boto direito do mouse no controle de usurio e
selecione View Code.
4. 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. No menu Build, clique em Build Solution.
O ChartOptions controle de usurio adicionado Toolbox.
5. Clique com o boto direito do mouse ThisDocument.vb no Solution Explorer, ou
ThisDocument.cs. e selecione View Designer
6. 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. Pressione F5 para executar o projeto.
5. Selecione vrios botes de opo.
6. 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. Selecione o My Word Actions Pane projeto no Solution Explorer.
5. No menu Project, selecione Add New Item.
6. Na caixa Add New Item de dilogo, selecione Actions Pane Control, nome-la
ActionsControl, e clique em Add
Para adicionar uma nova fonte de dados para o projeto
9. 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.

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 Value (Valor)

Name Inserir

Text 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. Selecione o CompanyNameComboBox controle.


8. Na janela Properties, clique no boto para a direita da propriedade DataSource, e
selecione SuppliersBindingSource.
9. 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. 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
3. 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. Pressione F5 para executar o projeto.
7. Confirme se o painel Actions est visvel.
8. Selecione uma empresa na caixa de combinao e verifique que os itens na caixa
Products Lista alterar.
9. Selecione um produto, clique Insert no painel de aes, e verifique se os detalhes do
produto foram adicionados tabela no Word.
10. 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:

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. No menu Project, clique em Add Reference.
6. Na guia COM, selecione biblioteca tipo 2.0 marcas inteligentes Microsoft e clique em OK.
7. 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.
8. 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[0-
9]+)?\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. Pressione F5 para executar o projeto.
6. 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. Clique no cone de marca inteligente que aparece sobre a seqncia reconhecida e clique
em Convert to Celsius.
8. 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. 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
7. 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. Pressione F5 para executar o projeto.


Inicia o Word e a caixa de mensagem aparece.
9. 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. Clique com o boto direito do mouse o n de projeto no Solution Explorer.
7. Clique Publish no menu de atalho.
O Publish Wizard aparece.
8. Na caixa Specify the location to publish this application, digite C:\TestDeploy.
9. 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. Criar um novo projeto Console Application.
7. Do Microsoft.VisualStudio.Tools.Applications.Runtime Adicionar referncias para e
System.Windows.Forms montagens para este projeto.
8. 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.
5. 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"

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.
6. 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"

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. Crie uma WordDeployment_1.0.0.0 pasta sob a \\DeployServer\ShareFolder
compartilhamento de arquivos de rede.
5. Copiar o documento de Soluo e a manifesto de implantao para
\\DeployServer\ShareFolder.
6. 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. No computador de desenvolvimento, abra o WordDeployment.doc arquivo no
\\DeployServer\ShareFolder\.
4. 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 pr-
requisitos 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. 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
7. 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. Pressione F5 para executar o projeto.


O Excel iniciado e aparecer a caixa de mensagem.
9. 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. Clique com o boto direito do mouse no n na Solution Explorer soluo.
8. Aponte para Add no menu de atalho, e clique em New Project.
A Add New Project caixa de dilogo ser exibida.
9. 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. Clique com o boto direito do mouse no n na Solution Explorer soluo.
9. 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.
10. Aponte para Add no menu de atalho, e clique em New Item.
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;

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. Clique com o boto direito do mouse e, em seguida clique em Run. Em Solution
Explorer, o ExcelSetup project
6. Siga as instrues no Assistente de Instalao, e especificar uma pasta de instalao no
seu computador de desenvolvimento.
7. Abrir a pasta de trabalho do Excel a partir da pasta de instalao.
8. 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. Pressione F5 para executar o projeto.
4. 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:.
4. 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:.
5. Na guia Common Controls da caixa de ferramentas, clique no controle voc deseja
adicionar.
6. 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.

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:.
5. Na guia Common Controls Da clique Toolbox, o controle voc deseja adicionar
6. 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:.
4. 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:.
4. 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.

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 Details

*Anchoring controles em formulrios do Windows HOW TO: Anchor controles em Windows


Forms

CAB Gerao de arquivo usando projetos Visual Viso geral Solutions do dispositivo de
Studio instalao e implantao. Esse processo embalagem
elimina a necessidade de personalizar o arquivo.inf
manualmente.

Filtrar sem suporte propriedades / Methods / Recurso inclui IntelliSense filtrado, uma
eventos. etapa de verificao de criao, e
capacidade para converter controles sem
suporte.

Editor de cores Cores em que aparecem no dispositivo.


Definir caixa de dilogo de cor (dispositivos)

Controles personalizados Suporte completo. Use Criar e exibir


classes e tipos Para adicionar atributos
Controles *User
personalizados de designer.

*Docking controles em Windows Forms HOW TO: Dock controles em Windows


Forms

Visual C# Consolidado 1170


*Data criar suporte Dados em projetos de dispositivos
gerenciados

Editor fonte Fontes como suporte para a plataforma


atual. Caixa de dilogo Editor fonte
(dispositivos)

Formulrio suporte fator, incluindo orientao e Caixa de dilogo de propriedades fator


resoluo. (Dispositivos) de formulrio
*Autoscale

Capa formulrio com a criao de cdigo Caixa de dilogo de propriedades fator


(Dispositivos) de formulrio

*New controles e Components na Toolbox WebBrowser, Notification, DocumentList,


DateTimePicker, MonthCalendar,
LinkLabel, Splitter, BindingSource

WYSIWYG especficos de plataforma Designers aprimorados fornecem precisa


aparncia para cada plataforma.

Destinos verso 1.0 do .NET Compact Framework Suporte Smartphone 2003 e Pocket PC
2003

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. No menu visual studio Tools, clique em Connect to Device.
2. Na caixa Connect to Device de dilogo, selecione um emulador na caixa Devices, e
clique em Connect
Para iniciar o emulador dispositivo usando o Gerenciador de emulador de dispositivo
1. No menu visual studio Tools, clique em Device Emulator Manager.
2. Na Device Emulator Manager janela, clique com boto direito o emulador voc deseja
iniciar.

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 Uso

Exibir e gerenciar o sistema de arquivos em um dispositivo de destino Visualizador de arquivos


(incluindo exportar e importar) remoto

Exibir informaes sobre identificadores da pilha e sinalizadores para Dependency Walker da


cada processo em execuo em um dispositivo de destino pilha remoto

Exibir informaes sobre cada processo em execuo em um Visualizar do processo


dispositivo de destino remoto

Exibir e gerenciar o Registro para um dispositivo de destino Editor do Registro


remoto

Exibir mensagens recebidas pelo janelas associadas aplicativos Spy remoto


executados em um dispositivo de destino

Capturar uma imagem tela em formato bitmap (.bmp) de um dispositivo In Zoom-remoto


de destino

Consulte tambm

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. 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.)
2. 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. Em Templates, clique em Device Application.
4. Na caixa Name, digite DeviceSample, e depois clique em OK.
5. (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. Clique com o boto direito do mouse o Button controle e clique em Properties.
3. Na janela Properties, digite Say Hello, e pressione ENTER para definir a Text
propriedade.

Para adicionar tratamento de eventos para o controle Boto

1. Clique duas vezes no boto no formulrio.


Abre o editor de cdigos com o ponto de insero posicionado do evento manipulador.
2. 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. No menu Debug, clique em Start (ou Start Debugging).


2. 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. No menu File do emulador, clique em Exit.


2. Na caixa Device Emulator de mensagem, clique em No para a mensagem Save State
Before Exiting?
3. No menu Visual Studio Debug, clique em Stop Debugging.
4. Se uma mensagem aparecer informando que a conexo foi perdida, clique em OK.
5. 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. No menu visual studio File, aponte para New, e clique em Project.
2. Expanda Visual Basic no painel Project types,, e Smart Device Clique em Pocket PC
2003.
3. 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.
4. No designer, clique com o boto direito do mouse no formulrio e no menu de atalho,
clique em Properties
5. Desmarque o Text valor da propriedade do formulrio ou seja, facilitam em branco.
6. No Solution Explorer, clique com o boto direito do mouse Form1.vb e depois no menu
de atalho, clique em View Code.
7. Expanda a Windows Form Designer generate code regio.
8. 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. Feche o emulador sem salvar estado.
Se uma mensagem for exibida indicando que a conexo foi perdida, clique em OK.
2. No menu Project, clique em Change Target Platform.
3. Na caixa Change to Na caixa Change Target Platform de dilogo, selecione
Smartphone2003, e depois clique em OK.
4. 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. No menu Debug, clique em Start Debugging.
6. 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. No menu Project, clique em Change Target Platform.
2. 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. No Solution Explorer, clique com o boto direito do mouse <Projectname> e depois no
menu de atalho, clique em Properties.
2. Na guia Compile, selecione Treat all warnings as errors.
Para tratar todos os avisos como erros no Visual C#
1. No Solution Explorer, clique com o boto direito do mouse <Projectname> e depois no
menu de atalho, clique em Properties.
2. Na guia Build, selecione All na seo Treat warnings as errors.

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. Na guia Device Components da Toolbox, arraste um HardwareButton componente em
um formulrio do Windows ou na bandeja componente no designer.
2. Na Bandeja de componente, clique com o boto direito do mouse no HardwareButton
controle e no menu de atalho, clique em Properties
3. Defina a AssociatedControl propriedade para o formulrio, por exemplo, Form1.
4. Defina a HardwareKey propriedade para a chave voc deseja substituir, por exemplo,
ApplicationKey1.
5. Clique no boto, por exemplo, Soft Key 1. na capa do designer
O editor de cdigo abre no manipulador Form_KeyDown de eventos.
6. 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. Clique Options no menu Tools, e Device Tools Clique em Form Factors.
2. Selecione o fator de formulrio por exemplo, Pocket PC 2003 Portrait para o
formulrio no projeto, e depois clique em Properties.
3. Selecione Show skin in Windows Forms Designer e Enable rotation support.
4. 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 Smartphone: O formulrio sempre gira quando gira o dispositivo.
o 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 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.
Para alterar resoluo
1. Clique Options no menu Tools, e Device Tools Clique em Form Factors.
2. Selecione o fator de formulrio por exemplo, Pocket PC 2003 Portrait para o
formulrio no projeto, e depois clique em Properties.
3. Na caixa Form Factor Properties de dilogo, definir a resoluo vertical e horizontal.
4. 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.

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. No Solution Explorer, clique com o boto direito do mouse <Project name>.
2. No menu de atalho, clique em Properties e selecione o Devices painel.
3. 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. No Painel de controle, Windows clique em Add or Remove Programs.
2. Selecionar MSDN Library for Visual Studio 2005, e, em seguida clique em Change.
3. Na pgina Welcome da clique Setup WizardNext,.
4. Na pgina Program Maintenance, clique em Modify.
5. Na pgina Custom Setup, selecione Mobile and Embedded Development.
6. No menu de atalho disponvel a partir do boto drop-down, selecione This feature, and all
subfeatures, will be installed on local hard drive.
7. Clique em Next.
8. 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. No menu visual studio Help, clique em Contents ou Index.


2. Na caixa Filtered by, selecione Smart Device Development.

Para alterar a configurao de desenvolvimento

1. No menu visual studio Tools, clique em Import and Export Settings.


2. 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. Na pgina Save Current Settings, selecione se deseja salvar as configuraes atuais, e
clique em Next.
4. 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. Instalar 4.x Microsoft ActiveSync na imagem Virtual PC.
2. No menu do ActiveSync File, clique em Connection Settings.
3. Na caixa Connection Settings de dilogo, altere o transporte de conexo para DMA.
4. Inicie o emulador.
5. No menu visual studio Tools, clique em Device Emulator Manager.
6. Na caixa Available Emulators, clique com o boto direito do mouse o emulador desejado,
e clique Cradle no menu de atalho
7. 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. No menu visual studio Tools, clique em Device Emulator Manager.
2. Na caixa Available Emulators, selecione o emulador cujo sistema arquivos voc deseja
acessar.
3. 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.
4. 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. Abra o ActiveSync.
6. No menu do ActiveSync File, clique em Connection Settings.

Visual C# Consolidado 1190


7. Marque a Allow connections to one of the following caixa de seleo.
8. 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. No computador de desenvolvimento, verifique que a antena Bluetooth corretamente
inserido e instalado.
2. Na caixa de dilogo Propriedades Bluetooth no computador de desenvolvimento, altere a
descoberta para ON.
3. No dispositivo, toque no cone Bluetooth, e toque em Turn Bluetooth ON.
4. Toque Bluetooth Manager.
5. No menu Janela Bluetooth, clique New Para iniciar uma pesquisa por dispositivos
habilitados Bluetooth-.
6. Selecione o computador de desenvolvimento que voc deseja se conectar usando o
ActiveSync.
7. 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. No computador de mesa, v na configurao Bluetooth e adicione uma porta COM de
entrada para a conexo Bluetooth.
2. No ActiveSync, abrir a Connection Settings caixa de dilogo, e selecione Allow
connections to one of the following.
3. Selecione a porta COM do dispositivo Bluetooth, e clique em OK
4. 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. No computador de desenvolvimento, abra o Microsoft ActiveSync.
2. No menu do ActiveSync File, clique em Connection Settings.
3. Selecione Allow connections to one of the following.
4. Selecionar Infrared Port (IR), e, em seguida clique em OK.
Para configurar o dispositivo
1. Verifique se o dispositivo Porta de INFRAVERMELHO est apontando para o computador
de desenvolvimento, porta de INFRAVERMELHO e est no intervalo boa.
2. No dispositivo, abra o ActiveSync.
3. No menu do ActiveSync Tools, toque Connect via IR.
A conexo estabelecida.

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>.
o Clientshutdown.exe
o ConmanClient2.exe
o CMaccept.exe
o eDbgTL.dll
o TcpConnectionA.dll
2. A partir do prompt de comando no dispositivo, execute conmanclient2.exe.
3. Determinar o endereo IP do dispositivo.
Para preparar Visual Studio para conectar
1. No menu visual studio Tools, clicar Options, clicar Device Tools, e clique em Devices.

Visual C# Consolidado 1192


2. Selecionar Windows CE Device, e, em seguida clique em Properties.
3. Para direita caixa Transport, clique em Configure.
4. Na caixa Configure TCP/IP Transport de dilogo, selecionar Use specific IP address, e
digite o endereo IP do dispositivo.
5. 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. No prompt de comando no dispositivo, execute cMaccept.exe.
2. 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. No computador de desenvolvimento, crie uma pasta a ser compartilhada entre o
computador de desenvolvimento e o emulador de dispositivo.
2. No menu emulador File de dispositivo, clique em Configure.
3. Na caixa Shared folder do guia General, digite ou navegue at a pasta compartilhada no
computador de desenvolvimento.
4. Clique em OK.
Para testar sua pasta compartilhada no emulador Pocket PC
1. No emulador Pocket PC, abra File Explorer.
2. Toque e selecione My Device.
A Storage Card entrada a pasta compartilhada.
Para testar sua pasta compartilhada no emulador Smartphone

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.
2. 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.

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. No menu visual studio Tools, clique em Options.
2. 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 Descrio

[mode 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.

conn[ect] Conecta a um dispositivo CLR incorporado remoto.


machine_name port
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

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. 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.
2. Usando o Editor do Registro remoto, se conectar o dispositivo.
3. Para navegar ou crie a seguinte chave: depurador
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ .NETCompactFramework\Managed
4. Definir ou crie um valor DWORD nomeado AttachEnabled.
5. 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. Aps definir a chave conforme descrito nas etapas anteriores, iniciar um processo sem o
depurador.
2. No menu Tools, clique em Attach to Process.
3. Na caixa Transport, clique em Smart Device.
4. Na caixa Qualifier, clique em Browse.

Observao

A Qualifier caixa prepopulated com os dispositivos usados recentemente da sesso atual.

5. Na caixa Connect to Device de dilogo, marque a plataforma, o dispositivo, e clique em


Connect.
6. 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. No menu Debug, aponte para Windows, e clique em Processes.


2. Clique com boto direito na janela Processes, mouse o processo voc deseja desanexar
do ou terminar.
3. 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. 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.
2. 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. 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.
2. 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.
3. 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. No Solution Explorer, clique com o boto direito do mouse Hello.cpp e depois no menu
de atalho, clique em View Code.
2. 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. No menu Debug, clique em Attach to Process.
3. Na caixa Transport, selecione Smart Device.
4. Para preencher a Qualifier caixa, clique em Browse.
5. Na caixa Connect to Device de dilogo, selecionar Pocket PC 2003 SE Emulator, e
clique em Connect
6. Para preencher a Attach to caixa, clique em Select.
7. 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.
8. 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. Clique com o boto direito do mouse hellocomobject.dll e, em seguida no menu
de atalho, clique em Load Symbols.
2. Na caixa de dilogo da Find Symbols, navegue at
InteropSolution\HelloCOMObject\Pocket PC 2003
(ARMV4)\Debug\HelloCOMObject.pdb.
3. 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.
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. No menu visual studio Debug, clique em Detach All.


Essa etapa desanexa o depurador nativo, mas o aplicativo continua a executar.
2. No menu Debug, clique em Attach to Process e garantir que a Transport caixa contm
Smart Device.
3. Preencher a Qualifier caixa, clicando Select, selecionar Pocket PC 2003 SE Emulator,
clique em Connect.
4. 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. No Solution Explorer, clique com o boto direito do mouse Form1.cs e depois no menu
de atalho, clique em View Code.
2. 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. No Solution Explorer, clique com o boto direito do mouse no arquivo.xsd banco de
dados e clique Properties no menu de atalho
2. Definir o Custom Tool valor como MSResultSetGenerator.
3. Recrie a soluo.
Para gerar cdigo para DataSets somente
1. No Solution Explorer, clique com o boto direito do mouse no arquivo.xsd banco de dados
e clique Properties no menu de atalho
2. Definir o Custom Tool valor como MSDataSetGenerator.
Esse valor o valor padro.
3. Recrie a soluo.
Para gerar cdigo para Resultsets e DataSets
1. No Solution Explorer, clique com o boto direito do mouse no arquivo.xsd banco de
dados e clique Properties no menu de atalho
2. Definir o Custom Tool valor como MSDataSetResultSetGenerator.
3. Recrie a soluo.

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. Duas no Solution Explorer, vezes no arquivo.xsd para abrir o DataSet Designer.
2. Clique com o boto direito do mouse e, em seguida clique Properties no menu de atalho.
o TableAdapter,
3. Expanda a Connection propriedade.
4. 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. No Solution Explorer, selecione o arquivo.xsd.
2. No menu View, clique em Properties Window.
3. 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. Arrastar e soltar uma tabela da janela Data Sources para um formulrio do Windows.
2. Arraste e solte um boto no formulrio.
3. Defina a Text propriedade do boto apropriadamente (por exemplo, ' Avanar ').
4. Clique duas vezes no boto no formulrio para abrir o Editor de Cdigo no boto clique
manipulador de eventos.
5. Usar os exemplos de cdigo a seguir ao cdigo First, Next, Previous. e Last Boto
manipuladores de eventos
Para cdigo um boto primeiro
Tipo this.customersBindingSource.MoveFirst();
Para cdigo um boto Avanar
Tipo this.customersBindingSource.MoveNext();
Para cdigo um boto anterior
Tipo this.customersBindingSource.MovePrevious();
Para um boto ltimo cdigo
Tipo this.customersBindingSource.MoveLast();

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. Arraste uma tabela da janela Data Sources at um formulrio do Windows.
2. Arraste um boto para o formulrio.

Visual C# Consolidado 1205


3. Alterar a Text propriedade do boto para Save.
4. Clique duas vezes no boto no formulrio para abrir o Editor de Cdigo no boto clique
manipulador de eventos.
5. 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. No menu View, clique em Server Explorer.
2. Clique com o boto direito do mouse Data Connections e clique Add Connection para
abrir a Add Connection caixa de dilogo.
3. Clique Change para abrir a Change Data Source caixa de dilogo.
4. Na caixa Data source Selecionar Microsoft SQL Server Mobile Edition, e clique em OK
5. Selecionar Microsoft SQL Server Mobile Edition, e, em seguida clique em OK.
6. Continue com " para continuar o processo e configurar a conexo " abaixo.
Para criar o banco de dados em um projeto
1. Com um projeto aberto, clique Add New Data Source no menu Data.
O Data Source Configuration Wizard abre.
2. Na pgina Choose a Data Source Type, selecionar Database, e clique em Next
3. Na pgina Choose Your Data Connection, clique New Connection para abrir a Add
Connection caixa de dilogo.
4. Clique Change para abrir a Change Data Source caixa de dilogo.
5. Selecionar Microsoft SQL Server Mobile Edition, e, em seguida clique em OK.
6. Continue com " para continuar o processo e configurar a conexo " abaixo.
Para continuar o processo e configurar a conexo
1. Na caixa Add Connection de dilogo, selecione My Computer.
2. Clique em Create.
3. 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).
4. 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.

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. Clique OK para retornar para a Add Connection caixa de dilogo e clique OK para fech-
lo.
7. 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.
10. Clique em Finish.
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.

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. Com um projeto Smart Device aberto, clique Add New Data Source no menu Data.
2. Na pgina Choose a Data Source Type, selecionar Database, e clique em Next
3. 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. Na pgina Choose Your Database Objects, selecione os objetos que deseja usar como
fontes dados em seu projeto.
6. 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. No menu View, clique em Server Explorer.
2. Na janela Explorer Server, clique com o boto direito do mouse Data Connections e
clique Add Connection no menu de atalho.
3. Na caixa Add Connection de dilogo, clique em Change.
4. Na caixa Change Data Source de dilogo, selecionar Microsoft SQL Server, e clique em
OK Para reabrir a Add Connection caixa dilogo
5. Na caixa Server name, especifique o nome do servidor onde a fonte de dados est
localizada.
6. 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. Pr-requisito: Voc deve ter um Projeto de Dispositivo Inteligente .NET Compact
Framework j abrir no IDE Visual Studio.
2. No menu Data, clique em Add New Data Source Para abrir o Data Source Configuration
Wizard.
3. Na pgina Choose a Data Source Type, selecionar Database, e clique em Next
4. Na pgina Choose Your Data Connection, clique em New Connection.
5. Na caixa Add Connection de dilogo, clique em Change.

Visual C# Consolidado 1208


6. Na caixa Change Data Source de dilogo, selecionar Microsoft SQL Server, e clique em
OK Para reabrir a Add Connection caixa dilogo
7. Na caixa Server name, digite ou selecione o nome do servidor onde a fonte de dados est
localizada.
8. 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. No menu Data, clique em Add New Data Source.
2. Na pgina Choose a Data Source Type, selecione Object.
3. 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. Expanda o conjunto que contm o objeto ao qual deseja vincular a, e selecione o objeto no
modo de exibio de rvore.
5. Clique em Finish.
A fonte de dados adicionada janela Data Sources.
Para adicionar uma fonte de dados ao seu formulrio
1. No menu Data, clique Show Data Sources para abrir a Data Sources janela.
2. 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. No menu Data, clique em Add New Data Source.
2. Na pgina Choose a Data Source Type, selecionar Web Service, e clique em Next
3. Adicionar uma referncia ao servio da Web usando o desejado a Adicionar caixa de
dilogo Referncia da Web.
4. 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. No menu View, clique em Server Explorer.
2. Na janela Server Explorer, expanda a conexo de dados ao qual voc deseja adicionar
uma tabela.
3. Clique com o boto direito do mouse Tables e, em seguida clique em Create Table.
4. Na caixa New Table de dilogo, digite um nome na caixa Name de tabela.
5. Para a primeira coluna, insira valores para Column Name, Data Type, Length, Allow
Nulls, Unique, e Primary Key. Continuar para colunas adicionais.
6. 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. No menu View, clique em Server Explorer.
2. Na janela Server Explorer, expanda a conexo de dados em que o esquema da tabela a
ser editado for localizada.
3. Clique com o boto direito do mouse na tabela para ser editado, e no menu de atalho,
clique em Edit Table Schema.
4. Na caixa Edit Table <Tablename> de dilogo, faa as alteraes e clique em OK
Para remover uma tabela
1. No menu View, clique em Server Explorer.
2. Na janela Server Explorer, expanda a conexo de dados do qual voc deseja soltar uma
tabela.

Visual C# Consolidado 1210


3. Clique com boto direito em Tables, mouse a tabela voc deseja excluir e, em seguida, no
menu de atalho, clique em Drop Table.
4. 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. No menu View, clique em Server Explorer.
2. Na janela Server Explorer, expanda a conexo dados para exibir suas tabelas.
3. 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.
4. Na janela Edit Table, adicionar a coluna e suas propriedades, e clique em OK.
Para editar as propriedades da coluna
1. No menu View, clique em Server Explorer.
2. Na janela Server Explorer, expanda a conexo dados para exibir suas tabelas.
3. 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.
4. 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. No menu View, clique em Server Explorer.
2. Na janela Server Explorer, expanda a conexo dados para exibir suas tabelas.
3. 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.
4. 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.

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. No menu View, clique em Server Explorer.
2. Na janela Server Explorer, expanda a fonte de dados no qual voc deseja criar um novo
ndice.
3. Expandir a tabela para o qual voc deseja o novo ndice, e em seguida, clique com o boto
direito do mouse a Indexes pasta.
4. No menu de atalho, clique em Create Index.
5. Na caixa New Index de dilogo, digite um nome para o ndice, e clique em Add.
6. Na caixa Select Columns from <Table> de dilogo, selecione as colunas a serem
adicionados chave de ndice, e clique em OK.
7. Clique OK para fechar a New Index caixa de dilogo.
Para editar propriedades do ndice na ordem classificao-somente
1. No menu View, clique em Server Explorer.
2. Na janela Server Explorer, expanda a Conexo de Dados e Tabela que contm o ndice
cujas propriedades voc deseja editar.
3. Clique com o boto direito do mouse o ndice, e, em seguida clique Index Properties no
menu de atalho.
4. 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. No menu View, clique em Server Explorer.
2. Na janela Server Explorer, expanda a conexo de dados do qual voc deseja descartar
um ndice.
3. Expandir tabela que possui o ndice, expandir Indexes, e em seguida, clique com o boto
direito do mouse o ndice para ser descartado.
4. No menu de atalho, clique em Drop Index.
5. Na caixa Delete Objects de dilogo, clique em Remove, e clique em OK

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. No menu Data, clique em Add New Data Source.
2. Na pgina Choose a Data Source Type, selecionar Database, e clique em Next
3. Na pgina Choose Your Data Connection, clique New Connection para abrir a Add
Connection caixa de dilogo.
4. Clique em Change, selecione Microsoft SQL Server Mobile Edition, e clique em OK.
5. Na caixa Add Connection de dilogo, selecione My Computer.
6. Clique em Create.
7. 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).
8. Do New Password em e Confirm Password caixas, digite uma senha para o novo banco
de dados, e clique em OK.
Se alterar uma senha atravs um SQL Server Mobile Database existente
1. No menu View, clique em Server Explorer.
2. Na Server Explorer janela, clique com boto direito a fonte de dados para que voc
deseja alterar a senha.
3. No menu de atalho, clique em Database Properties.
4. Na caixa Database Properties de dilogo, clique em Set password.
5. Digite as senhas antiga e nova na conforme solicitado, e clique em OK.

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. No menu View, clique em Server Explorer.
2. 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.
3. No painel Select a page, clique Shrink & Repair.
4. Escolha entre as opes na pgina Shrink & Repair.
A parte inferior da pgina exibe uma explicao para a opo voc selecionar.
5. 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. Na caixa Search Criteria Builder de dilogo, selecione New query name.
Usar o nome padro ou criar um nome de sua escolha.
4. Agora voc pode especificar os parmetros ou clicando Query Builder, alterando a
instruo SQL na caixa Query Text.
Para especificar um parmetro usando a caixa Query Text
1. Adicionar uma WHERE clusula ao final da instruo SELECT.
2. 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. Na caixa Query Builder de dilogo, ambos:
o Adicione uma WHERE clusula no painel da instruo SQL.
Ou-
o Insira seu parmetro Filter na listagem apropriada Column.
Essa abordagem grava a WHERE clusula para voc no painel da instruo SQL.
2. Clique OK para fechar a Query Builder caixa de dilogo.
3. Clique OK para fechar a Search Criteria Builder caixa de dilogo.
Um boto vinculado consulta- exibido no formulrio no designer.
Para especificar um parmetro utilizando o criador DataSet
1. No Solution Explorer, clique com o boto direito do mouse no arquivo.xsd, e clique em
Open.
2. No Dataset Designer, clique com boto direito aponte para Add, e, no menu de atalho,
clique em Query. o TableAdapter,
3. No Assistente para configurao Query TableAdapter, selecionar Use SQL Statements, e
clique em Next
4. Na pgina Choose a Query Type, selecionar Select which returns a single value, e
clique em Next
5. Na pgina Specify a SQL SELECT statement, clique em Query Builder.
Se voc desejar, voc pode adicionar a WHERE clusula aqui.
6. 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. Clique Options no menu Tools, e Device Tools Clique em General.


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

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. Na caixa Name, digite ParamQuerySample.


5. (C Visual #) somente Na caixa Location, Verifique onde voc deseja armazenar seus
arquivos de projeto.
6. 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. No menu Data, clique em Add New Data Source Para abrir o Data Source Configuration
Wizard.
2. Na pgina Choose a Data Source Type, selecionar Database, e clique em Next

Para selecionar e configurar uma conexo de dados

1. Na pgina Choose Your Data Connection, clique em New Connection.


2. 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. Na caixa Add Connection de dilogo, selecione My Computer.
4. Novamente na caixa Add Connection de dilogo, clique em Browse.
5. Na caixa Select SQL Server Mobile Edition Database File de dilogo, selecionar
Northwind.sdf, e clique em Open
6. Na caixa Add Connection de dilogo, deixe a Password caixa vazia.
Este banco de dados tem nenhuma senha.
7. 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. Clique OK na caixa de mensagem que mostra a conexo bem-sucedida, e clique OK para


fechar a Add Connection caixa de dilogo.
9. 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. Na pgina Choose Your Database Objects, expanda o Tables n, e selecione a Orders


tabela.
2. 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. Na janela Data Sources, expanda a Orders tabela.


2. Clique na Ship Country coluna, e clique na seta suspensa e selecione a Label opo.
3. Arraste a Ship Country coluna para o formulrio no designer.
4. Sobre o controle rtulo no designer, clique na marca inteligente, e no menu de atalho,
clique em Add Query
5. Na caixa Search Criteria Builder de dilogo, clique em Query Builder.
6. 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. Clique em OK.
A WHERE clusula na caixa Query Text deve ler ([Order ID]=@PARAM1) agora.
8. 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. Clique com o boto direito do mouse no PARAM1 controle rtulo no designer, e no menu
de atalho, clique em Properties
2. Alterar a Text propriedade para Order ID.
3. Selecionar o FillBy boto, e altere sua propriedade de texto como Show country.
4. 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. No menu Debug, clique em Start ou Start Debugging.


2. 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. No menu File do emulador, clique em Exit.


2. Na caixa Device Emulator de mensagem, clique em No para a mensagem perguntando
se voc deseja salvar o estado do emulador.
3. (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. Arraste a tabela mestre da janela Data Sources para o formulrio no designer.
2. Na janela Data Sources, expanda a tabela mestre para expor a tabela de detalhes.
3. 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 Master-
Detail do SQL Server Mobile.
5. Ajuste os controles no formulrio para atender seu aplicativo.

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. Na caixa Name, digite MasterDetailSample.


5. (C Visual #) somente Na caixa Location, Verifique onde voc deseja armazenar seus
arquivos de projeto.
6. 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. No menu Data, clique em Add New Data Source Para abrir o Data Source Configuration
Wizard.
2. Na pgina Choose a Data Source Type, selecionar Database, e clique em Next

Para selecionar e configurar uma conexo de dados

1. Na pgina Choose Your Data Connection, clique em New Connection.


2. 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. Na caixa Add Connection de dilogo, selecione My Computer.


4. Novamente na caixa Add Connection de dilogo, clique em Browse.
5. Na caixa Select SQL Server Mobile Edition Database File de dilogo, selecionar
Northwind.sdf, e clique em Open
6. Na caixa Add Connection de dilogo, deixe a Password caixa vazia.
Este banco de dados tem nenhuma senha.
7. 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. Clique OK na caixa de mensagem que mostra a conexo bem-sucedida, e clique OK para


fechar a Add Connection caixa de dilogo.
9. 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. Do Customers na pgina Choose Your Database Objects, expanda o Tables n, e


selecione e Orders tabelas.
2. 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. Na Data Sources janela, selecione a Customers Tabela, e clique na seta suspensa, e


selecione a DataGrid opo.
2. Arraste a Customers tabela da janela Data Sources para o formulrio no designer.
Localize a grade em direo parte superior da janela.
3. 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. Clique na seta suspensa para esta Orders Tabela, e selecione a DataGrid opo.
5. 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. No menu Debug, clique em Start ou Start Debugging.


2. 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. No menu File do emulador, clique em Exit.


2. Na caixa Device Emulator de mensagem, clique em No para a mensagem perguntando
se voc deseja salvar o estado do emulador.
3. Na mensagem caixa Que advises a conexo foi perdida, clique em OK.
4. (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. No menu View, clique em Server Explorer.
2. Na janela Server Explorer, expanda a conexo dados para expor a listagem de tabela.
3. Clique com o boto direito do mouse na tabela cujos dados voc deseja exibir e, no menu
de atalho, clique em Open.
Para exibir dados usando a janela fontes de dados em um projeto
1. No menu Data, clique em Show Data Sources.
2. Na Data Sources janela, clique com boto direito a fonte de dados cujos dados voc
deseja exibir (por exemplo, uma tabela).
3. No menu de atalho, clique em Preview Data.
4. Na caixa Data Preview de dilogo, clique em Preview.
Para exibir dados usando a marca inteligente sobre o controle DataGrid
1. No designer, clique na marca inteligente sobre o controle DataGrid.
2. No menu DataGrid Tasks de atalho, clique em Preview Data.
3. 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.

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. Iniciar o aplicativo de dados.
O DataGrid exibida, preenchida com dados.
2. 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. Abra o projeto de dispositivos inteligentes existente e verifique se que Solution Explorer


esteja visvel.
2. No menu File, aponte para Add, e clique em New Project.
A Add New Project caixa de dilogo ser exibida.
3. No painel Project Types no lado esquerdo, expanda o Other Project Types n e clique
em Setup and Deployment.
4. 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. No Solution Explorer, selecionar CABProject caso ele j no esteja selecionado.


2. No menu View, clique Properties Window para abrir a Properties janela.
3. 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 Voc tambm pode usar esta janela para alterar o nome do fabricante e para
especificar o mnimo e mximo permitido verses do sistema operacional.
o 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
Ou-
0xE0000000 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.
o 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. No menu Action do Visual Studio, aponte para Add, e clique em Project Output.
3. Na caixa Add Project Output Group de dilogo, selecione o Project dispositivos
inteligentes na lista Project drop-down.
4. 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. No Solution Explorer, clique com o boto direito do mouse em seu nome de projeto CAB,
depois aponte para Add, e clique em File
2. Navigate to <Visual Studio installation folder>\VC\ce\dll\armv4.
3. Selecione os arquivos para adicionar.
o 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.
o Para um Projeto ATL, pressione CTRL e clique atl80.dll e msvcrt80.dll. Se sua
soluo ATL suporta MFC, clique em MFC80U.DLL tambm.
o Para um projeto Win32, clique em msvcrt80.dll.
4. Clique Open na caixa Add Files de dilogo para adicionar os arquivos no seu projeto
CAB.
5. No painel esquerdo do File System Editor, clique com boto direito File System on
Target Machine.
6. Clique em Add Special Folder e, clique em Windows Folder.
7. 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
8. 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.

Para criar um atalho para o aplicativo de projeto de dispositivo

1. No painel direito da File System Editor, selecione Primary output from <your
application project name>.
2. 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. No Solution Explorer, selecione o projeto CAB.


2. No menu View, aponte para Editor, e clique em Registry.
3. 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. Quando a New Key entrada for exibida na, a Registry Editor renomeao-lo
SOFTWARE.
5. Clique com o boto direito do mouse essa nova chave, aponte para New, e clique em Key
6. Quando a New Key entrada for exibida na, a Registry Editor renomeao-lo
MyCompany.
7. 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.


Ou-
Clique 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. No Windows Explorer, navegue at a pasta onde voc armazenados nesta soluo. Voc
encontrar o arquivo cab na pasta CABProject\Release da sua soluo.
2. 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. No Solution Explorer, clique com o boto direito do mouse <Projectname> e depois no


menu de atalho, clique em Properties.
2. Continuar usando um dos seguintes procedimentos:
o Para projetos do Visual Basic e Visual C# selecione Authenticode Signature, e
clique em Select Certificate.: a Project Designer, clique Devices em
o Em projetos Visual C++, selecionar Authenticode Signing, e clique no boto de
reticncias na linha Certificate propriedade
o 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. Clique Import para abrir o Certificate Import Wizard.
3. 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. Alterar a Files of Type seleo para All Files (*.*), selecionar TestCert_Privileged.pfx ou
TestCert_Unprivileged.pfx. e, em seguida clique em Open
6. 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.
7. Clique Next para abrir a Certificate Store pgina. Certifique-se de que Personal est
marcada na caixa Certificate store.
8. Clique Next para exibir a pgina de concluso, e clique em Finish.
A mensagem Import was successful exibida.
9. 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. No Solution Explorer, clique com o projeto, e no menu de atalho, clique em Properties
2. Da Build Events pgina (Visual C#) ou a Compile pgina (Visual Basic), clique em Edit
Post-build.
3. 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. No Solution Explorer, clique com o projeto, e no menu de atalho, clique em Properties
2. Em Configuration Properties, expanda o Build Events n.
3. Clique em Post-Build Event.
4. Selecione a Command Line propriedade, e clique no ellipsis boto. Para abrir a
Command Line caixa de dilogo ()
5. 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).
Para consultar um dispositivo para seu modelo de segurana
1. Estabelecer uma conexo do ActiveSync para o dispositivo.
2. 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>

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. No Solution Explorer, clique com o projeto Visual Basic ou Visual C#, e seguida, no menu
de atalho, clique em Properties.
2. Na pgina Devices, clique em Authenticode Signature.
3. Clique em Select Certificate.

Visual C# Consolidado 1231


4. Na caixa Select Certificate de dilogo:
o Se o certificado a ser exibido na lista, selecione-, e clique OK para fechar a caixa
de dilogo.
o 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. No Solution Explorer, clique com o projeto Visual Basic ou Visual C#, e seguida, no menu
de atalho, clique em Properties.
2. Na pgina Signing, clique em Sign the assembly.
3. Na caixa Choose a strong name key file:
o Se voc desejar usar um arquivo de chave de nome de alta segurana j existente,
clique <Browse> para abrir caixa Select File de dilogo.
o Se voc desejar criar um novo arquivo de chave de nome de alta segurana, clique
New para abrir a Create Strong Name Key caixa de dilogo.
Para atrasar uma assinatura de Assembly
Aps completar as etapas acima, clique em Delay sign only.
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. No Solution Explorer, clique com o projeto CAB dispositivo inteligente, e clique
Properties no menu de atalho
2. Na pgina Build, selecione Authenticode Signature.
3. Clique em Select from Store.
4. Na caixa Select Certificate de dilogo:
o Se o certificado a ser exibido na lista, selecione-, e clique OK para fechar a caixa
de dilogo.
o 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. No Solution Explorer, clique com o projeto Visual Basic ou Visual C#, e seguida, no menu
de atalho, clique em Properties.
2. Abra a Devices pgina.
3. Na caixa Device provisioning, selecione uma das opes a seguir:
o O dispositivo de destino no Provision
o Configurar o armazenamento Privileged

Visual C# Consolidado 1233


o 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.

Locked.XML define o seguinte modelo de segurana em duas camadas:


o Notifique-o antes de executar aplicativos.
o No execute aplicativos no assinados.
Prompt.XML define o seguinte modelo de segurana em duas camadas:
o Notifique-o antes de executar aplicativos.
o Executar aplicativos sem assinatura como sem privilgios.
Open.XML define o modelo de segurana-uma camada a seguir:
o No solicitar.
o 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.
Para configurar um dispositivo com um modelo de segurana
1. Estabelecer uma conexo do ActiveSync para o dispositivo.
2. Digite o seguinte comando no prompt de comando, onde securityfile.xml o arquivo XML
de modelo de segurana:
RapiConfig.exe /P /M <securityfile.xml>

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 pr-
requisitos, 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